Python:请求过多

时间:2015-06-09 15:31:06

标签: python beautifulsoup

我制作了一个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它会在某处丢失。

3 个答案:

答案 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.

似乎他们在回复中告诉你你可以提出多少请求,以及你需要等多久才能获得更多。 当您没有剩余的使用请求时,请一直睡到分钟结束。