You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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示例:

  1. 先安装依赖:
pip install playwright
playwright install chrome
  1. 编写爬虫代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:34:59