爬取SEC网站13F文件遇HTTP Error 403: Forbidden,求解决方法
解决SEC 13F备案文件爬取403 Forbidden错误的方法
SEC服务器会拦截默认爬虫请求,核心解决思路是设置合法的请求头(尤其是User-Agent),让请求看起来像是浏览器发起的。以下是具体修改方案:
1. 定义模拟浏览器的请求头
构造包含浏览器标识的请求头,避免被识别为爬虫:
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,image/webp,*/*;q=0.8' }
注:User-Agent可以直接复制自己浏览器的真实标识——打开浏览器F12开发者工具,在Network面板中查看任意请求的User-Agent字段即可。
2. 修改requests.get请求
原代码中requests.get(url)需要带上headers参数:
page = requests.get(url, headers=headers)
3. 修改pd.read_html的请求
pd.read_html底层会发起新的请求,同样需要传递请求头,通过requests_kwargs参数实现:
index = pd.read_html(index_url, requests_kwargs={'headers': headers})
4. 可选:添加请求延迟
为避免频繁触发反爬机制,在循环中添加短暂延迟:
time.sleep(2) # 每次请求后暂停2秒
修改后的完整代码
from bs4 import BeautifulSoup import requests import pandas as pd from datetime import datetime import time # 定义模拟浏览器的请求头 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,image/webp,*/*;q=0.8' } url = "https://www.sec.gov/cgi-bin/current?q1=0&q3=13f" # 带上请求头发起请求 page = requests.get(url, headers=headers) data = page.text days_url = [] soup = BeautifulSoup(data, 'lxml') for link in soup.find_all('a'): if 'index' in link.get('href'): url_to_save = link.get('href') days_url.append(url_to_save) days_url = days_url[0:1] for item in days_url: index_url = 'https://www.sec.gov' + item # 重命名变量避免混淆 # pd.read_html传递请求头 index = pd.read_html(index_url, requests_kwargs={'headers': headers}) index = index[0] index = index[(index['Document'].str.contains('.html')) & ( index['Type'].str.contains('INFORMATION TABLE'))] try: index = index['Document'].iloc[0] except: pass print(index) # 添加请求延迟 time.sleep(2)
额外说明
如果仍然出现403错误,可以尝试添加更多请求头字段(比如Referer),或者进一步降低请求频率。
内容的提问来源于stack exchange,提问作者C_Turbo
相关产品推荐
相关产品推荐

