豆瓣电影
本帖最后由 jump_p 于 2020-6-12 13:53 编辑访问豆瓣美剧的页面,这个页面只显示20部美剧,需要下拉才能下载,也就是说是被JS渲染的。
F12右键检查,找到Network,左边菜单Name , 找到第五个数据,点击Preview。
点开subjects,可以看到 title 就是对应电影名称。rate就是对应评分。通过js解析subjects字典,找到需要的字段。
那么如何找到每部电影的链接呢?我看到的文章链接如下: 不懂这个链接在哪里看到的
本帖最后由 叱咤风云2333 于 2020-6-12 14:43 编辑
应该是网页自己地址栏里的url,这里应该不是每部电影的URL,是美剧主页的URL。limit=20和你每页显示20个对得上。
我从豆瓣电影主页,点击美剧栏目,进去的显示地址复制过来如下:https://movie.douban.com/tv/#!type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0
因为解码问题,地址栏里的“美剧”两个字复制过来后显示的是乱码。这样应该跟你看到文章里的是一样的。 叱咤风云2333 发表于 2020-6-12 14:40
应该是网页自己地址栏里的url,这里应该不是每部电影的URL,是美剧主页的URL。limit=20和你每页显示20个对 ...
直接复制这个地址是爬不到东西的 本帖最后由 叱咤风云2333 于 2020-6-12 15:04 编辑
jump_p 发表于 2020-6-12 14:52
直接复制这个地址是爬不到东西的
import urllib.request
url = 'https://movie.douban.com/tv/#!type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
req = urllib.request.Request(url = url,headers = headers)
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))
用上面代码把刚才这个网页爬出来了。
不过刚才爬出来的确实没有具体信息,猜测可能要通过树的形式,得点进去才能找到? 叱咤风云2333 发表于 2020-6-12 14:59
用上面代码把刚才这个网页爬出来了。
不过刚才爬出来的确实没有具体信息,猜测可能要通过树的形式 ...
可能是加密的接口?我也不是很懂 4楼的代码是对的,一般下拉都是ajax,header里最好加上:X-Requested-With: XMLHttpRequest 本帖最后由 jump_p 于 2020-6-12 15:25 编辑
suchocolate 发表于 2020-6-12 15:12
4楼的代码是对的,一般下拉都是ajax,header里最好加上:X-Requested-With: XMLHttpRequest
import requests, json
from fake_useragent import UserAgent
import csv
class Doban(object):
u = 0;
def __init__(self):
self.film_list = []
ua = UserAgent(verify_ssl=False)
self.url = "https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}"
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random # ua 构造随机请求头
}
'''发送请求获取响应'''
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
if res.status_code == 200:
return html
'''解析数据'''
#
# '''获取链接函数'''
def parse_page(self, html):
# 创建csv文件进行写入
csv_file = open('scr.csv', 'a', encoding='gbk')
csv_writer = csv.writer(csv_file)
# 写入csv标题头内容
csv_writer.writerow(['电影', '评分', "详情页"])
data = json.loads(html)['subjects']
# print(data)
for r in data:
# print(r)
rate = r["rate"]
id = r["title"]
src = r["url"]
urll = r["cover"]
csv_writer.writerow()
html2 = requests.get(url=urll, headers=self.headers).content
dirname = "./图/" + id + ".jpg"
with open(dirname, 'wb') as f:
f.write(html2)
print("%s 【下载成功!!!!】" % id)
csv_file.close()
def main(self):
startPage = int(input("起始页:"))
endPage = int(input("终止页:"))
for page in range(startPage, endPage + 1, 20):
url = self.url.format(page)
# print(url)
html = self.get_page(url)
self.u += 1
self.parse_page(html)
print("======================第%s页爬取成功!!!!=======================" % str(self.u))
if __name__ == '__main__':
Siper = Doban()
Siper.main()
这是完整代码,帮忙品品 本帖最后由 Twilight6 于 2020-6-12 16:30 编辑
jump_p 发表于 2020-6-12 15:24
这是完整代码,帮忙品品
在这找的,而且你多翻几页就会找到规律,每页都是age*20 的形式
第一页是 0*20 第二页 1*20第三页 2*20所以那用 {} 格式化代入乘以20后的数即可模仿翻页
第二页:
第三页:
{rate: "8.8", cover_x: 2025, title: "韦恩", url: "https://movie.douban.com/subject/30204361/",…}
cover: "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2545419100.jpg"
cover_x: 2025
cover_y: 3000
id: "30204361"
is_new: false
playable: false
rate: "8.8"
title: "韦恩"
url: "https://movie.douban.com/subject/30204361/"
返回的ajax里面,所有信息都包括了,链接什么的都有,直接提取 Stubborn 发表于 2020-6-12 16:34
返回的ajax里面,所有信息都包括了,链接什么的都有,直接提取
你这个似乎还不是,楼上那个是{:10_250:} Twilight6 发表于 2020-6-12 16:26
在这找的,而且你多翻几页就会找到规律,每页都是age*20 的形式
第一页是 0*20 第二页 1*20 ...
牛{:10_275:} jump_p 发表于 2020-6-12 17:07
你这个似乎还不是,楼上那个是
{:10_302:} Stubborn 发表于 2020-6-12 17:43
{:10_297:}
页:
[1]