Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:请求太多了_Python_Beautifulsoup - Fatal编程技术网

Python:请求太多了

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.

我制作了一个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.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.