如何利用站点自带下拉菜单设置单页结果数,提升Python爬虫爬取效率
解决方案
问题原因
你遇到的配置不随URL生效的问题,和站点的会话存储机制有关:站点会将每页展示条数的配置存储在当前会话的Cookie/服务端会话状态中,和你的请求会话绑定,因此更换浏览器、新开会话都会恢复默认配置。前端下拉选择修改页大小时,会异步提交请求到/Pager/SetPageSize接口更新配置,不会修改当前页面URL。
实现步骤
你可以通过requests.Session维持会话状态,先主动调用页大小设置接口,再请求列表页即可拿到单页200条的结果,具体步骤如下:
- 初始化会话对象,复用请求头和Cookie,避免每次请求新建会话导致配置失效
import requests myheaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36', "Upgrade-Insecure-Requests": "1", "DNT": "1", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", # 可选:如果接口要求异步请求标识,添加下面的头 # "X-Requested-With": "XMLHttpRequest" } # 初始化会话,统一设置请求头 session = requests.Session() session.headers.update(myheaders)
- 调用页大小设置接口更新配置,你可以先通过浏览器F12网络面板,手动选择200条/页时查看该接口的请求方法、参数名:
- 通常该接口为POST请求,参数名多为
pageSize或itemsPerPage,值为200 - 把代码里的
站点根域名替换为你爬取的站点实际域名即可
- 通常该接口为POST请求,参数名多为
set_size_url = "站点根域名/Pager/SetPageSize" # 按实际接口要求调整参数名、提交方式 payload = {"pageSize": 200} # 表单提交用data参数,JSON提交用json参数 resp = session.post(set_size_url, data=payload) # 可校验状态码判断是否设置成功,200/204通常代表成功 if resp.status_code in (200, 204): print("页大小设置成功")
- 后续所有列表页请求都使用同一个
session实例发起,返回的就是单页200条的内容:
page = session.get(你的列表页URL)
注意事项
- 全程使用同一个
Session实例发起请求,不要混用requests.get(),否则会话不共享,配置会失效 - 若设置后仍返回10条结果,可以核对F12抓包看到的接口请求方式、参数名、参数值是否和代码一致
内容的提问来源于stack exchange,提问作者Jmark
相关产品推荐
相关产品推荐

