Python requests+BeautifulSoup抓取超链接URL返回Cloudflare错误问题
问题成因
代码运行后只拿到Cloudflare错误页链接,核心是Etherscan部署了Cloudflare反爬防护,原生requests请求直接触发了拦截规则:
requests默认携带的请求头标识为Python爬虫程序,没有模拟真实浏览器的User-Agent等字段,会被防护规则直接识别为自动化流量,拒绝返回真实页面内容- Cloudflare部分拦截规则会要求客户端完成JavaScript执行、Cookie合法性校验,原生
requests没有JS运行能力,无法通过这类校验,只会返回拦截后的错误落地页
解决方法
按以下顺序调整即可正常提取内容:
- 首先给请求补充模拟真实浏览器的请求头,核心是替换默认的User-Agent字段,可从自己日常使用的浏览器开发者工具网络面板中复制真实的请求头值,修改后的基础可运行代码如下:
import requests from bs4 import BeautifulSoup urls = 'https://etherscan.io/tokens' # 请替换为自己浏览器对应的真实User-Agent值 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" } grab = requests.get(urls, headers=headers) # 先校验响应状态码,返回200才代表拿到了真实页面内容 print(grab.status_code) soup = BeautifulSoup(grab.text, 'html.parser') # 文件写入指定utf-8编码,避免Windows系统下默认编码导致的乱码问题 with open("test1.txt", "w", encoding="utf-8") as f: for link in soup.find_all("a"): data = link.get('href') if data: f.write(f"{data}\n")
- 如果补全请求头后依然被拦截,说明触发了Cloudflare的JS挑战规则,此时直接使用具备真实浏览器内核的自动化工具加载页面,等待页面完成渲染、通过防护校验后再提取DOM内容即可,不要手动编写JS挑战破解逻辑,维护成本极高。
- 控制请求频率,不要短时间内向站点高频发送请求,否则会触发IP维度的临时拦截,同样无法拿到真实页面内容。
内容的提问来源于stack exchange,提问作者Carl Nowak
相关产品推荐
相关产品推荐

