打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python爬虫Learning豆瓣排行榜

案例:根据豆瓣电影指定类型的排行榜,爬取排行榜中的电影各项数据。

没有换页按钮,一直往下滑动就会一直刷新下一页,底层实现就是有ajax。

问题在于如何找到第2到10页的接口,第一页仍然为案例1中的文件。

每次滑到接近页面底端的时候就会发送一个类似第一页文件中的'top_list?type'文件,内容为将要刷新的下一页的电影数据(一页20部)如上图为第二页的二十部电影数据。

根据此操作,可以获取到前三页的访问的url地址,如下:

第一页访问url:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=0&limit=20
分离后:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=0&limit=20

第二页访问urlhttps://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=20&limit=20
分离后:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=20&limit=20

第三页访问url:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=40&limit=20
分离后:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=40&limit=20

观察上面三页url中的规律:

只有:start=??&limit=20 中两个问号的数据不同,所以获取到的页数取决于start后面的内容,limit为设置查找20条内容。

所以可得第四页的url中,start=60&limit=20

可得start与page的规律:start = (page - 1 )  * 20

完成下载豆瓣电影排行榜中指定页数到指定页数的电影数据json,下载到本地。

My Code:

import urllib.request
# 下载豆瓣电影前十页的数据# (1) 请求对象的定制# (2) 获取响应的数据# (3) 下载数据到本地

# 程序入口if __name__ == '__main__': start_page = eval(input('请输入起始的页码:')) end_page = eval(input('请输入结束的页码:')) for page in range(start_page, end_page + 1): # 每一页都有自己的请求对象的定制 url_start = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=' start = (page - 1) * 20 url = url_start + str(start) + '&limit=20' # url拼接完成(因为start参数的不同,需要每页定制的url) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 ' 'Edg/108.0.1462.76 ' }
# (1)请求对象的定制 request = urllib.request.Request(url=url, headers=headers)
# (2)获取响应的数据 response = urllib.request.urlopen(request) content = response.read().decode('utf-8')
# (3)数据下载到本地 file_name = 'douban' + str(page) + '.json' fp = open(file_name, 'w', encoding='utf-8') fp.write(content)

运行结果:生成douban1.json~douban10.son,对应每一页的数据

范例代码:

import urllib.requestimport urllib.parse
def create_request(page): base_url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&'
data = { 'start': (page - 1) * 20, 'limit': 20 }
data = urllib.parse.urlencode(data)
url = base_url + data
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76' }
request = urllib.request.Request(url=url, headers=headers)
return request

def get_content(request): response = urllib.request.urlopen(request) content = response.read().decode('utf-8') return content

def down_load(page, content): with open('douban_' + str(page) + '.json', 'w',encoding='utf-8') as fp: fp.write(content)


if __name__ == '__main__': start_page = eval(input('请输入起始的页码:')) end_page = eval(input('请输入结束的页码:')) for page in range(start_page, end_page + 1): # 每一页都有自己的请求对象的定制 request = create_request(page) # 获取响应的数据 content = get_content(request) # 下载 down_load(page, content)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python爬虫日记一:爬取豆瓣电影中速度与激情8演员图片
豆瓣电影排行榜
Python做简单爬虫(urllib.request怎么抓取https以及伪装浏览器访问的方法)
[快学Python3]HTTP处理 - urllib模块
【Python 第74课】多线程
python 2.x和3.x的区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服