鱼C论坛

 找回密码
 立即注册
查看: 300|回复: 3

[已解决]关于爬虫的疑问

[复制链接]
发表于 2024-7-5 02:43:43 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 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循环不能正常运行,总是在读取了前几个链接后就中断,给出的错误信息截图如下:
111.PNG


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

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

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

最佳答案
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的域名也是存在的

最佳答案

查看完整内容

看了下代码逻辑,就是一个单线程1S频率的请求,逻辑没有问题。 你的第二个推测是合理的,该网站要求你在请求头中提供你的身份 可以尝试参照网站实例,包装一个假的公司信息到请求头。 headers = {'User-Agent':'FishC ',Accept-Encoding:"gzip, deflate",Host:"www.sec.gov"} 这里我捏造的鱼C的数据进去,网站应该不会进行验证,即便验证,鱼C的域名也是存在的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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的域名也是存在的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[1].a['href']
    ls2.append(link2)
    print('%d/%d'%(n2,n1))
    n2 = n2+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢!更换user-agent以后,代码就可以正常运行了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表