Python爬取congress.gov触发HTTP Error 403: Forbidden报错求助
问题排查思路
返回HTTP Error 403: Forbidden代表服务器识别出请求为非合规用户访问,主动拒绝了响应,按优先级排查以下问题:
- 第一优先级:默认请求标识被拦截。urllib发起请求时默认携带的User-Agent为
Python-urllib/版本号,congress.gov的反爬规则会直接拦截这类明确标记为爬虫的请求,这是该错误的核心诱因。 - 第二优先级:代码逻辑瑕疵。读取txt文件中的URL时没有提前去除行尾换行符,传给请求方法的URL带不可见换行符;另外保存路径拼接时缺少目录分隔符,会导致本地保存路径异常。
- 第三优先级:请求频率过高。批量请求如果无间隔连续发送,短时间内请求量超过站点阈值,会被WAF临时封禁IP返回403。
可行修复方案
修复上述问题的可运行代码如下,核心改动是添加模拟浏览器的请求头、修复路径/URL处理逻辑、增加合理请求间隔:
import urllib.request import time import os # 基础配置 save_root = '/Users/myusername/Desktop/py_test' os.makedirs(save_root, exist_ok=True) # 模拟普通桌面浏览器请求头,绕过基础反爬校验 req_headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.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.5", "Referer": "https://www.congress.gov/" } with open('/Users/myusername/Desktop/py_test/url_list.txt', 'r', encoding='utf-8') as f: for raw_line in f: url = raw_line.strip() if not url: continue # 拼接合法保存路径,补充.html后缀方便本地直接打开 file_name = f"{url.split('/')[-1]}.html" save_path = os.path.join(save_root, file_name) try: req = urllib.request.Request(url, headers=req_headers) with urllib.request.urlopen(req, timeout=20) as resp, open(save_path, 'wb') as f_out: f_out.write(resp.read()) print(f"下载完成: {url}") # 每次请求间隔3秒,控制请求频率 time.sleep(3) except Exception as e: print(f"下载失败 {url}, 错误: {str(e)}") continue
额外注意事项
- 如果调整后仍偶发403,可将请求间隔拉长到5-10秒,不要尝试用高并发方式爬取该站点,公开页面爬取速率过高会导致IP被长期封禁
- 运行代码前先在浏览器中手动打开1-2个目标URL,确认页面可正常访问、URL未失效
- 若本地网络访问congress.gov本身存在连通性问题,需要先解决网络问题再运行爬虫
内容的提问来源于stack exchange,提问作者James O'Connor
相关产品推荐
相关产品推荐

