使用requests与bs4爬取特定站点HTML需开启JS及cookies的配置问题
爬虫问题解决方案
Cookie配置方法
requests默认不会在多次请求间自动留存、传递Cookie,你可以通过requests.Session()实现会话级别的Cookie自动管理,不需要手动配置Cookie值,示例代码如下:
import requests from bs4 import BeautifulSoup # 初始化会话对象,自动处理全生命周期的Cookie传递 sess = requests.Session() # 补充正常浏览器的请求头,避免被反爬直接拦截 sess.headers.update({ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5; rv:109.0) Gecko/20100101 Firefox/116.0", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }) # 所有请求都通过sess实例发起,不要直接用requests.get # 部分有Cookie同意页的站点,可以先请求一次站点首页获取初始Cookie,再请求目标链接 target_url = "https://agsjournals.onlinelibrary.wiley.com/toc/15325415/2021/69/7" response = sess.get(target_url, timeout=15) response.encoding = response.apparent_encoding # 后续解析HTML逻辑 soup = BeautifulSoup(response.text, "lxml")
用上述方法请求第一个站点,即可解决Please enable cookies的报错。
JS渲染内容处理
你提到的第二个站点内容是前端JS动态渲染生成的,requests只能拿到初始的空白HTML壳,无法获取实际渲染后的内容,可根据需求选择两种方案:
- 抓后台接口:打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR请求,找到实际加载业务数据的接口,直接用会话请求该接口获取结构化JSON数据,爬取效率更高
- 模拟浏览器:如果接口加密难以解析,可以使用Selenium、Playwright等无头浏览器工具,模拟真实浏览器运行环境,自动执行JS代码获取渲染完成的完整页面内容,这类工具也自带Cookie管理能力,不需要额外配置Cookie。
额外提示
如果站点开启了Cloudflare基础防护,普通requests请求无法通过验证,可以使用cloudscraper库替代原生requests发起请求,可绕过大部分基础的人机验证规则。
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

