使用requests-html的HTMLSession爬取时&page参数失效求助
解决requests-html请求分页URL返回第一页内容的问题
问题分析
你遇到的核心问题是:手动拼接&page=X参数后,requests-html返回的始终是第一页内容,这通常是请求头不完整、会话Cookie未正确建立或参数传递的编码问题导致的,结合目标站点(finn.no二手车搜索页)的特性,以下是针对性解决方案。
解决方案步骤
1. 改用params字典传递参数,避免编码错误
不要手动拼接URL参数,用params字典让requests自动处理参数编码,避免因字符转义问题导致参数未被服务器识别:
from requests_html import HTMLSession from fake_useragent import UserAgent ua = UserAgent() session = HTMLSession() # 基础URL与初始参数 base_url = "https://www.finn.no/car/used/search.html" params = { "model": "1.8078.2000555", "page": 1 # 初始页码 }
2. 完善请求头,模拟真实浏览器
仅用随机User-Agent可能不够,添加Referer、Accept等字段,降低被反爬拦截的概率:
headers = { "User-Agent": ua.random, "Referer": f"{base_url}?model=1.8078.2000555", # 来源页设为第一页URL "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5" }
3. 先建立会话Cookie,再请求分页
部分网站会验证会话状态,先请求首页获取必要Cookie,再发起分页请求:
# 初始化会话,获取首页Cookie session.get(base_url, params={"model": "1.8078.2000555"}, headers=headers) # 分页爬取逻辑 page = 1 while True: params["page"] = page response = session.get(base_url, params=params, headers=headers) html = response.html # 检查停止爬取的特定标签(替换为你的实际选择器和文本) stop_tag = html.find(".你的停止标签选择器", first=True) if stop_tag and "你的特定停止文本" in stop_tag.text: print("无更多页面,停止爬取") break # 处理当前页内容(替换为你的业务逻辑) print(f"正在处理第 {page} 页") # 示例:提取车辆标题 titles = html.find(".ads__unit__content__title") for title in titles: print(title.text) page += 1
4. 额外注意事项
- 如果目标页面是JS动态渲染内容(即使URL带page参数),需要调用
html.render()方法启动无头浏览器加载内容,但这会增加资源消耗,建议先尝试上述无渲染方案; fake_useragent偶尔会出现获取失败的情况,可以添加备用User-Agent:try: user_agent = ua.random except: user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
内容的提问来源于stack exchange,提问作者Snasegh
相关产品推荐
相关产品推荐

