Python爬取sky.lea.moe时返回HTML与浏览器页面源不一致的问题求助
解决使用requests爬取sky.lea.moe时返回内容不一致的问题
我之前处理过不少类似的反爬场景,你遇到的问题本质是这个网站启用了浏览器检测机制——它会验证请求是否来自真实的浏览器环境,而你的requests请求只带了User-Agent,缺少其他关键的请求头信息,甚至可能部分内容是通过JavaScript动态渲染的,requests无法解析执行JS,所以拿到的是被拦截后的页面内容。
下面给你几个可行的解决方案:
1. 完善请求头,模拟真实浏览器请求
除了User-Agent,真实浏览器发送请求时还会携带很多其他头信息,比如Accept、Accept-Language、Referer等,把这些补充到请求头里,大概率能绕过基础的浏览器检测。
修改后的代码示例:
import requests # 模拟Chrome浏览器的完整请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://sky.lea.moe/', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } # 使用Session保持会话,自动处理Cookie session = requests.Session() page = session.get("https://sky.lea.moe/stats/PapaGordsmack/", headers=headers) html_contents = page.text print(html_contents)
2. 使用浏览器自动化工具(应对JS动态渲染)
如果网站的核心内容是通过JavaScript动态生成的,requests这类纯HTTP请求库就无法获取到最终的页面内容。这时候需要用Selenium或Playwright这类工具模拟真实浏览器的行为,它们会自动执行页面中的JS,获取和浏览器一致的渲染结果。
以Selenium为例,步骤如下:
- 先安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配)
示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置Chrome选项,模拟正常浏览器 options = Options() options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36') options.add_argument('--headless=new') # 无头模式,不弹出浏览器窗口 # 初始化浏览器驱动 driver = webdriver.Chrome(options=options) driver.get("https://sky.lea.moe/stats/PapaGordsmack/") # 获取渲染后的页面源码 html_contents = driver.page_source print(html_contents) # 关闭浏览器 driver.quit()
3. 检查重定向和Cookie状态
有些网站会通过重定向到验证页面来拦截非浏览器请求,你可以先打印请求的状态码和重定向历史,同时用requests.Session自动保存和携带Cookie——很多网站会用Cookie来标识合法会话。
比如在代码中加入以下调试代码:
print(page.status_code) print(page.history) # 查看重定向历史 print(session.cookies) # 查看会话中的Cookie
通过这些信息可以判断是否是Cookie或重定向导致的拦截,再针对性调整请求策略。
内容的提问来源于stack exchange,提问作者user12866987
相关产品推荐
相关产品推荐

