鱼C论坛

 找回密码
 立即注册
查看: 617|回复: 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的域名也是存在的
小甲鱼最新课程 -> https://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的域名也是存在的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-7-5 02:44:51 | 显示全部楼层
本帖最后由 wrpython 于 2024-7-5 02:47 编辑
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time

  4. 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'}
  5. content = requests.get('https://www.sec.gov/cgi-bin/current?q1=0&q2=2&q3=144', headers = headers).text

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

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

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

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

  22. for i in ls:
  23.     time.sleep(1)
  24.     content2 = requests.get(i, headers = headers).text
  25.     soup2 = BeautifulSoup(content2, 'html.parser')
  26.     print(soup2)
  27.     test2 = soup2.findAll('tr')
  28.     link2 = 'https://www.sec.gov/' + test2[1].a['href']
  29.     ls2.append(link2)
  30.     print('%d/%d'%(n2,n1))
  31.     n2 = n2+1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

谢谢!更换user-agent以后,代码就可以正常运行了!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 15:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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