我制作了一个python程序,它解析了子reddits页面并列出了它们。但问题是每当我尝试运行这个程序时,reddit服务器总是给我错误:429, 'too many requests'
。
如何降低所提请求的数量,以便我不受费率限制?
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)
编辑:所有人都在低调,我不知道发布这个问题我犯了什么严重的错误(感谢反馈)。如果它有帮助,我3天大了#Pythoner'。所以基本上我正在努力学习Python。可能是我要求的任何东西对你们来说太明显了,但它不适合我。这个问题可以帮助像我一样学习Python的其他一些菜鸟。但是由于downvotes它会在某处丢失。
答案 0 :(得分:1)
这是reddit的正常rate limiting。您唯一的选择是发出较少数量的请求,或者从具有不同IP的多个服务器发出请求(在这种情况下,您的方法会根据服务器数量进行扩展)。
来自HTTP error code 429的维基百科说明:
429请求太多(RFC 6585):
用户在给定的时间内发送了太多请求。用于速率限制方案。
答案 1 :(得分:1)
这背后的一个可能原因可能是reddit可能一直在检查用户代理标头。由于您没有添加任何用户代理标头,因此reddit会将此标记为机器人的请求,这就是您收到错误的原因。 尝试添加用户代理以进行请求。
答案 2 :(得分:0)
首先尝试了解允许您发送请求的频率,并将其与发送请求的最高费率进行比较。
如果您经常发现请求的位置,请在每个请求之间添加一些简单的内容,例如time.sleep(interval)
,以确保您在它们之间等待足够的时间。
如果你想要聪明,你可以写一些东西来记录自你上次请求以来的时间,或者计算你在最近一段时间内做了多少。然后,您可以使用此信息来决定睡眠时间。
编辑: 实际上查看规则页面:https://github.com/reddit/reddit/wiki/API#rules
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.
似乎他们在回复中告诉你你可以提出多少请求,以及你需要等多久才能获得更多。 当您没有剩余的使用请求时,请一直睡到分钟结束。