urllib.request解析TD Ameritrade页面数据与显示不一致问题
问题现象
使用urllib.request与BeautifulSoup爬取TD Ameritrade网站数值数据时,疑似触发站点反爬机制,返回错误数值阻碍抓取:
- 爬取目标URL:
https://research.tdameritrade.com/grid/public/research/stocks/earnings?symbol=goog - 代码解析得到的下次财报日期为
(Unconfirmed) July 25, 2022 - 浏览器正常访问时,页面HTML中实际展示的财报日期为
July 26, 2022
待确认问题:
- 数据不一致是网站反爬机制导致,还是代码编写存在错误?
- 是否有可行方案绕过该问题?
复现代码
from urllib.request import Request,urlopen from bs4 import BeautifulSoup as soup url = 'https://research.tdameritrade.com/grid/public/research/stocks/earnings?symbol=goog' request_site = Request(url) page_html = urlopen(request_site).read() page_soup = soup(page_html, "html.parser") earnings = page_soup.findAll("td", {"class": "value week-of"}) earnings = earnings[0].text print(earnings)
原因说明与解决方案
问题原因
数据差异不是代码解析逻辑错误导致,核心是原生urllib发起的请求缺少正常浏览器的请求特征,被站点反爬规则识别为爬虫流量,返回了和真实访问存在偏差的兜底内容:
- 原生urllib默认请求的
User-Agent字段会直接暴露爬虫身份,站点对这类非浏览器请求不会返回校验后的准确业务数据,而是返回带未确认标记、日期存在偏差的通用内容。 - 缺省请求没有携带正常浏览器会附带的Accept、Accept-Language等基础头字段,进一步提升了被反爬规则识别的概率。
可行解决方法
- 给请求补充和真实浏览器一致的基础请求头,最核心是补全
User-Agent字段模拟普通桌面浏览器请求,修改后的可运行示例如下:
from urllib.request import Request,urlopen from bs4 import BeautifulSoup as soup url = 'https://research.tdameritrade.com/grid/public/research/stocks/earnings?symbol=goog' # 补充标准浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.9" } request_site = Request(url, headers=headers) page_html = urlopen(request_site).read() page_soup = soup(page_html, "html.parser") earnings = page_soup.findAll("td", {"class": "value week-of"}) earnings = earnings[0].text.strip() print(earnings)
- 如果补全基础请求头后依然获取到错误数据,可以打开浏览器的开发者工具,在网络面板中找到对应页面的请求,复制完整的请求头(包含站点下发的Cookie字段)配置到代码中即可。
- 爬取时控制请求频率,单IP请求间隔保持在2-3秒以上,不要短时间发起大量并发请求,避免触发IP封禁类的更严格反爬策略。
内容的提问来源于stack exchange,提问作者Compsci956
相关产品推荐
相关产品推荐

