使用Python requests获取的HTML与网页源码不一致问题
问题描述
我是一名网络爬虫新手,使用以下Python代码:
import requests # Request to website and download HTML contents url='https://beacon.schneidercorp.com/Application.aspx?AppID=165&LayerID=2145&PageTypeID=2&PageID=1104&KeyValue=0527427230' req=requests.get(url, 'html.parser')
发送GET请求后,得到的是Cloudflare验证页面的HTML内容,与浏览器中查看目标网页(view-source:https://beacon.schneidercorp.com/Application.aspx?AppID=165&LayerID=2145&PageTypeID=4&PageID=1108&KeyValue=0527427230)的源码差异极大,请问这是什么原因?该如何解决?
原因分析
- Cloudflare是网站常用的安全防护/反爬服务,它会校验请求发起者是否为真实浏览器。
requests库默认发送的请求缺少浏览器核心请求头(如User-Agent、Accept等),容易被识别为非人工访问,触发人机验证机制,返回验证页面而非目标内容。 - 浏览器访问时会自动维护会话Cookie、处理页面渲染逻辑,而
requests请求默认无会话状态,也会导致被拦截。
解决方法
基础方案:模拟浏览器请求头
给requests.get()添加完整的浏览器请求头,让请求更接近真实用户行为:
import requests url = 'https://beacon.schneidercorp.com/Application.aspx?AppID=165&LayerID=2145&PageTypeID=2&PageID=1104&KeyValue=0527427230' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://beacon.schneidercorp.com/' } req = requests.get(url, headers=headers) # 查看响应前500字符,验证是否获取到目标内容 print(req.text[:500])
注:User-Agent可从自己浏览器的开发者工具中复制,确保为当前浏览器的最新标识。
进阶方案:使用浏览器自动化工具
如果基础方案仍被拦截,说明Cloudflare启用了JS渲染、行为检测等复杂验证,可使用selenium或playwright直接控制真实浏览器访问:
Playwright示例:
- 先安装依赖:
pip install playwright playwright install chrome
- 编写爬虫代码:
from playwright.sync_api import sync_playwright import time url = 'https://beacon.schneidercorp.com/Application.aspx?AppID=165&LayerID=2145&PageTypeID=2&PageID=1104&KeyValue=0527427230' with sync_playwright() as p: browser = p.chromium.launch(headless=False) # headless=True可后台运行浏览器 page = browser.new_page() page.goto(url) # 等待页面加载完成,可根据页面实际情况调整等待逻辑 page.wait_for_load_state('networkidle') time.sleep(1) # 额外等待1秒确保渲染完成 html_content = page.content() print(html_content[:500]) browser.close()
这种方式完全模拟浏览器的交互逻辑,能绕过大部分Cloudflare基础验证。
注意事项
- 不要短时间内频繁发送请求,建议添加请求间隔(如
time.sleep(2)),避免触发网站频率限制。 - 爬虫时需遵守网站的
robots.txt协议及相关法律法规。
内容的提问来源于stack exchange,提问作者user1298416
相关产品推荐
相关产品推荐

