Python爬虫代码在不同网站运行结果不一致是什么原因?
爬虫跨站点运行结果不一致的核心原因
- 反爬策略差异:HomeDepot这类商业电商站有成熟的反爬虫机制,requests默认发送的请求头会直接标记为爬虫请求,站点会返回403状态码、验证码页面或者空响应,自然无法解析到对应节点。而你测试用的fake-jobs是公开的爬虫教学静态站点,没有任何反爬限制,请求可以直接拿到完整源码。
- 页面渲染模式差异:HomeDepot的商品内容是前端JavaScript动态渲染生成的,你用requests请求拿到的初始HTML文件中,仅包含空的容器框架,没有实际加载的商品数据,
id="root"对应的内容要等浏览器执行JS后才会插入到DOM中。而fake-jobs站点是纯静态HTML,所有内容都直接写在初始源码里,可以直接用BeautifulSoup解析。 - DOM结构校验问题:就算绕过反爬拿到完整数据,也要确认目标站点当前的DOM结构确实存在
id="root"的节点,站点版本迭代、地区定向分发内容都可能导致节点ID发生变化。
排查步骤
你可以先运行以下代码验证问题根源:
import requests from bs4 import BeautifulSoup # 模拟浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } URL = "https://www.homedepot.com/s/311256393" page = requests.get(URL, headers=headers) # 先打印状态码和返回内容前1000字符,确认返回结果 print("响应状态码:", page.status_code) print("返回内容前1000字符:", page.text[:1000])
如果状态码不是200,或者返回内容包含访问拒绝、验证码提示,说明需要进一步处理反爬;如果状态码正常但返回的HTML里没有你要找的节点,说明是动态渲染页面,需要改用Selenium、Playwright等无头浏览器工具加载完整页面后再解析。
内容的提问来源于stack exchange,提问作者Dilli
相关产品推荐
相关产品推荐

