Python使用BeautifulSoup批量爬取Bloomberg数据频繁请求被IP封锁的解决方案咨询
从彭博批量提取个股板块、行业、子行业信息的实现方案
提问描述
我尝试使用BeautifulSoup从Bloomberg获取股票对应的板块(sector)、行业(industry)、子行业(sub-industry)信息,所用代码如下:
import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent headers = {'User-Agent': 'Mozilla/80.0'} response = requests.get('https://www.bloomberg.com/profile/company/VRTU:US', headers = headers) content = response.content parser = BeautifulSoup(content, 'html.parser') sector = parser.findAll('div', class_ = 'infoTableItemValue__e188b0cb')[1].text industry = parser.findAll('div', class_ = 'infoTableItemValue__e188b0cb')[1].text sub_industry = parser.findAll('div', class_ = 'infoTableItemValue__e188b0cb')[2].text
上述代码在提取单只股票信息时运行正常,但将其改为循环批量提取多只股票的信息时,Bloomberg会触发反爬机制封锁IP,返回拦截页面:
Bloomberg - 您是机器人?
..............document.getElementById("block_uuid").innerText = "Block reference ID: " + window._pxUuid;
即便我使用了fake_useragent生成随机User-Agent,Bloomberg依然会封锁IP。请问有什么方案可以实现批量从Bloomberg提取多只股票的上述分类信息?
解答
彭博站点搭载PerimeterX商业反爬系统,校验维度远不止User-Agent字段,会同步统计IP请求频率、请求头完整性、Cookie一致性、请求行为特征:单只慢速请求的特征和普通用户手动浏览行为一致,因此可以正常返回;一旦进入循环批量请求,IP维度的请求密度就会触发反爬阈值,返回机器人拦截页面。
可落地的调整方案如下:
- 先修正现有代码的逻辑bug:当前代码中
sector和industry均取索引为1的DOM节点,取值完全重复,需要先定位板块分类对应的DOM容器标签,按标签的文本属性匹配对应值,不要硬靠DOM列表索引取值,避免未被封禁时就拿到错误结果。 - 压低请求速率匹配正常用户行为:循环内每次请求后增加3-8秒的随机延时,不要无间隔连续发起请求;使用
requests.Session()复用会话连接,保存请求过程中返回的Cookie,不要每次请求都建立无状态的全新连接。 - 补全请求头字段:不要仅传递User-Agent,需要同步补充与普通浏览器一致的
Accept、Accept-Language、Referer字段,缺失这类基础字段的请求会被直接标记为异常爬虫。 - 优先请求站点公开数据接口:彭博的公司详情页为前端渲染架构,板块分类数据是页面加载时通过公开GraphQL接口返回的,直接请求对应数据接口的请求体积远小于爬取整页HTML,触发反爬的阈值会更高。
- 单IP触发频率封锁时,可搭配住宅代理IP池轮换请求出口,每个出口IP仅请求1-2只股票就切换,避开单IP的频次统计规则。
- 无需硬对抗反爬的替代思路:彭博使用的板块、行业、子行业分类完全遵循GICS全球行业分类标准,可直接从合规公开数据源获取对应维度的分类信息,无需强制爬取彭博页面。
内容的提问来源于stack exchange,提问作者C.C
相关产品推荐
相关产品推荐

