Python:请求太多了
我制作了一个python程序,它解析子reddits页面并列出它们。但问题是每当我试图运行这个程序时,reddit服务器总是给我错误:Python:请求太多了,python,beautifulsoup,Python,Beautifulsoup,我制作了一个python程序,它解析子reddits页面并列出它们。但问题是每当我试图运行这个程序时,reddit服务器总是给我错误:429,“请求太多” 我怎样才能减少请求的数量,从而不受费率限制 from bs4 import BeautifulSoup as bs from time import sleep import requests as req html = req.get('http://www.reddit.com/') print html soup = bs(html.
429,“请求太多”
我怎样才能减少请求的数量,从而不受费率限制
from bs4 import BeautifulSoup as bs
from time import sleep
import requests as req
html = req.get('http://www.reddit.com/')
print html
soup = bs(html.text)
# http://www.reddit.com/subreddits/
link_to_sub_reddits = soup.find('a',id='sr-more-link')['href']
print link_to_sub_reddits
L=[]
for navigate_the_pages in xrange(1):
res = req.get(link_to_sub_reddits)
soup = bs(res.text)
# soup created
print soup.text
div = soup.body.find('div', class_=lambda(class_):class_ and class_=='content')
div = div.find('div', id= lambda(id):id and id=='siteTable')
cnt=0
for iterator in div:
div_thing = div.contents[cnt]
if not div_thing=='' and div_thing.name=='div' and 'thing' in div_thing['class']:
div_entry = div_thing.find('a',class_=lambda(class_):class_ and 'entry' in class_)
# div with class='entry......'
link = div_entry.find('a')['href']
# link of the subreddit
name_of_sub = link.split('/')[-2]
# http://www.reddit.com/subreddits/
# ['http:', '', 'www.reddit.com', 'subreddits', '']
description = div_entry.find('strong').text
# something about the community
p_tagline = div_entry.find('p',class_='tagline')
subscribers = p_tagline.find('span',class_='number').text
L.append((name_of_sub, link, description, subscribers))
elif not div_thing=='' and div_thing.name=='div' and 'nav-buttons' in div_thing['class']:
# case when we find 'nav' button
link_to_sub_reddits = div_thing.find('a')['href']
break
cnt = cnt + 1
sleep(10)
sleep(10)
编辑:所有的人都投了反对票,我不知道我在发布这个问题时犯了什么严重错误(感谢反馈)。如果有帮助的话,我是三天大的“蟒蛇”。所以我基本上是在学习Python。也许我问的对你们来说太明显了,但不是我。这个问题可以帮助像我这样的noob学习Python。但多亏了落选票,它会在某个地方迷失方向 reddit这样做是正常的。您唯一的选择是发出较少数量的请求,或者从具有不同IP的多个服务器发出请求(在这种情况下,您的方法会根据服务器的数量进行扩展)
从wikipedia的描述中:
429请求过多(RFC 6585):
用户在给定的时间内发送了太多的请求。用于速率限制方案
首先,尝试找出允许您发送请求的频率,并将其与您发送请求的最大速率进行比较 当您发现请求过于频繁时,请在每个请求之间添加一些简单的内容,例如
time.sleep(interval)
,以确保在它们之间等待足够的时间
如果你想变得聪明,你可以写一些东西给《时代》杂志,告诉它距离你上次的请求已经有多长时间了,或者数一数最近一段时间你已经写了多少。然后,您可以使用此信息来决定睡眠时间
编辑:
事实上,看看规则页面:
似乎他们会在回复中告诉你可以提出多少请求,以及你需要等待多久才能得到更多。
当您没有剩余的请求要使用时,请一直睡眠到分钟结束。这背后的一个可能原因是reddit可能一直在检查user agent标头。由于您没有添加任何用户代理头,reddit将此标记为bot的请求,这就是您收到错误的原因。
正在尝试将用户代理添加到请求中。简单-减少请求。伙计们,为什么所有人都投反对票???。我是python新手。我也知道显而易见的“提出少数要求”。但我想知道如何控制向服务器发出的请求数量。@paramvir基本上,您可以更智能地发出请求(即最小化发出的请求,引入更多的睡眠间隔),或者引入更多的IP来发出请求。我在程序中使用了睡眠,如果你想在开始陈述明显的反对票之前仔细看看。我想知道,什么是理想的睡眠时间。根据我的说法,单个链接10秒就足够了,因为reddit建议每2秒请求1次。我错过什么了吗?
Monitor the following response headers to ensure that you're not exceeding the limits:
X-Ratelimit-Used: Approximate number of requests used in this period
X-Ratelimit-Remaining: Approximate number of requests left to use
X-Ratelimit-Reset: Approximate number of seconds to end of period
Clients connecting via OAuth2 may make up to 60 requests per minute.