如何使用BeautifulSoup抓取votesmart平台美国政客的公开声明文本
问题排查及解决方法
核心问题定位
你当前代码触发异常的主要原因分为几类:
- 反爬拦截:未携带浏览器请求头直接请求,网站识别到是爬虫脚本后返回拦截页面,解析的内容不是目标声明页面,自然找不到对应元素
- 页面结构更新:你参考的教程发布时间较早,votesmart网站的页面标签类名、属性已经发生改动,原代码里的元素选择器全部失效
- 全量异常捕获掩盖具体报错:你给
scrape_speech加了无差别try-except,无法定位具体是哪一步找不到元素 - (可选)代码缩进错误:你贴出的代码里函数下的逻辑没有正确缩进,如果实际代码也是这个格式会直接触发语法错误
具体修复步骤
- 首先添加请求头模拟浏览器访问,所有
requests.get都携带该参数
# 全局定义请求头 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' } # 所有请求改成类似格式 vs_page = requests.get(vs_url, headers=HEADERS) speeches_page = requests.get(speeches_url, headers=HEADERS) speech_page = requests.get(speech_url, headers=HEADERS)
- 临时注释异常捕获,打印具体报错信息,定位失效的元素选择器
你可以先把scrape_speech里的try-except去掉,运行后看具体是找不到哪个元素,再对应调整选择器,比如:
- 先打印
speech_page.text确认返回的是正常页面还是拦截页面 - 按F12打开目标声明页面的开发者工具,重新确认标题、日期、正文对应的标签和属性,替换原代码里的选择器
举个例子,目前votesmart的声明正文容器类名已经不是main clear,可改为查找div[class*="statement-content"]这类匹配规则
- 如果添加请求头后还是返回拦截页面,说明网站用了Cloudflare反爬,可使用
cloudscraper库代替原生requests
# 先安装依赖 pip install cloudscraper
代码里替换requests:
import cloudscraper scraper = cloudscraper.create_scraper() # 所有请求改成 vs_page = scraper.get(vs_url, headers=HEADERS)
- 修正代码缩进(如果实际代码存在该问题):Python对缩进敏感,函数内部的逻辑需要统一缩进4个空格
内容的提问来源于stack exchange,提问作者William L
相关产品推荐
相关产品推荐

