wrpython 发表于 2024-7-5 02:43:43

关于爬虫的疑问

本帖最后由 wrpython 于 2024-7-5 02:46 编辑

大家好,

我在尝试写一个从网页https://www.sec.gov/cgi-bin/current?q1=0&q2=2&q3=144里读取当天的144文件的爬虫,这个网页允许爬虫读取,但是有限制条件,最主要的一条限制是发送的请求不能超过10次/秒,因为我对读取速度没有要求,所以就把速度限制在1次/秒,但是在读取了一部分内容之后还会被网站拒绝,给出的信息显示我的读取超过了读取率限制——Request Rate Threshold Exceeded,麻烦大家看看这是怎么回事??下面是我的代码:

这里代码贴不全,完整的代码我贴在二楼了

第一个for循环是可以正常运行的,也可以读取到页面里的所有链接,但是第二个for循环不能正常运行,总是在读取了前几个链接后就中断,给出的错误信息截图如下:



我在第二个for循环里增加了一行代码,打印了soup2的内容,发现这个爬虫被限制访问了,给出的信息如下,我把觉得重要的部分标记了出来:


我觉得我的爬虫请求频率那么低,应该不是这个原因,另一个可能的原因就是对方要求我澄清自己的流量来源,Please declare your traffic by updating your user agent to include company specific information. 也就是第二个红框里的最后一句话,我不知道怎么在user-agent里添加公司信息,于是又去官网找了下,找到了这些内容,网址:SEC.gov | Accessing EDGAR Data:


但是看完以后更加一头雾水了.....完全不知道怎么改user-agent, 网上也没找到什么解决方案,所以前来这里问一下,麻烦各位大佬帮忙看看。谢谢!

bba-vw 发表于 2024-7-5 02:43:44

看了下代码逻辑,就是一个单线程1S频率的请求,逻辑没有问题。
你的第二个推测是合理的,该网站要求你在请求头中提供你的身份
可以尝试参照网站实例,包装一个假的公司信息到请求头。

headers = {'User-Agent':'FishC Xiaojiaoyu@fishc.com.cn',Accept-Encoding:"gzip, deflate",Host:"www.sec.gov"}

这里我捏造的鱼C的数据进去,网站应该不会进行验证,即便验证,鱼C的域名也是存在的{:10_335:}

wrpython 发表于 2024-7-5 02:44:51

本帖最后由 wrpython 于 2024-7-5 02:47 编辑

import requests
from bs4 import BeautifulSoup
import time

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}
content = requests.get('https://www.sec.gov/cgi-bin/current?q1=0&q2=2&q3=144', headers = headers).text

soup = BeautifulSoup(content, 'html.parser')
test = soup.findAll('a')

n = 1      #计数,只读取偶数标签对应的链接
ls = []       #用于存储读取到的链接
n1 = 0      #统计总共有多少条链接

#先在原始页面读取今天所有的链接然后存入列表中

for i in test[:-1]:
    n = n + 1
    if n % 2 == 0:
      link = 'https://www.sec.gov/'+i['href']
      print(link)
      ls.append(link)
      n1 = n1+1
      
ls2 =[]    #用来存从ls列表的链接里读到的新链接
n2 = 1   #用来计数,记录当前都到第几个链接

for i in ls:
    time.sleep(1)
    content2 = requests.get(i, headers = headers).text
    soup2 = BeautifulSoup(content2, 'html.parser')
    print(soup2)
    test2 = soup2.findAll('tr')
    link2 = 'https://www.sec.gov/' + test2.a['href']
    ls2.append(link2)
    print('%d/%d'%(n2,n1))
    n2 = n2+1

wrpython 发表于 2024-7-5 16:17:50

bba-vw 发表于 2024-7-5 02:43
看了下代码逻辑,就是一个单线程1S频率的请求,逻辑没有问题。
你的第二个推测是合理的,该网站要求你在请 ...

谢谢!更换user-agent以后,代码就可以正常运行了!
页: [1]
查看完整版本: 关于爬虫的疑问