HTTPError:HTTP错误429:WIKI页面的请求过多

时间:2020-10-28 18:12:19

标签: python python-3.x python-requests wikipedia http-error

即使脚本访问的页面数量甚至不超过50,我也遇到429错误。如何调整脚本以避免错误。 User-Agent是适用于我的Chrome浏览器的正确代理。我尝试将getValue(attribute, Boolean.class) 放在请求之后,但这没有帮助。我正在Windows 10上使用jupyter笔记本。

time.sleep(10)

这是错误:

def get_wiki_list_italian_movies(year):
    import sys, bs4, requests, textwrap, , time, re
    from textblob import TextBlob
    
    p = r'https://en.wikipedia.org/wiki/List_of_Italian_films_of_' + str(year)
    list_wiki, list_wiki_links = [], []

    header = {'User-agent':
               'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/86.0.4240.111 safari/537.36'}
   
    request = requests.get(p, headers = header)              
    time.sleep(10)

    soup = bs4.BeautifulSoup(request.text, 'lxml')
    table = soup.find_all('table', class_='wikitable')
    
    for el in table:
        td = el.find_all('td')
        for t in td:
            i = t.find('i')
            if i:
                for a in i.find_all('a', href=True):
                    result = re.sub(r'[()]','',a['href'])
                    if '/w/index' in result:
                        list_wiki.append(re.sub(r'\(.*','',a['title']).strip() + ' ' + str(year))
                    else:
                        list_wiki_links.append('https://en.wikipedia.org'+result)

    for link in list_wiki_links:
        request = requests.get(link, headers = header)
        time.sleep(10)
        soup = bs4.BeautifulSoup(request.text, 'lxml')
        i_list = soup.find_all('i')
        
        for i in i_list:
            b = i.find('b')
            if b:
                t= b.text
                if len(t) > 4 and TextBlob(t).detect_language() == 'it':
                    list_wiki.append(t.strip() + ' ' + str(year))
             
    return sorted(list(set(list_wiki)))

def movies_wiki_list(years_span):
    ll = []
    for year in years_span:
        ll += get_wiki_list_italian_movies(year)
        time.sleep(10)
    return ll

italian_movies_1932_1933 = movies_wiki_list(range(1932, 1934))
italian_movies_1932_1933

3 个答案:

答案 0 :(得分:0)

根据Wikipedia的API指南:API:EtiquetteAPI:FAQ

读取请求没有硬性限制,但我们要求您 要体谅他人,并尽量不要让网站瘫痪。大多数系统管理员保留 如果您确实威胁到您,则毫不客气地封锁您的权利 网站的稳定性。

如果您是串行而不是并行发出请求(即,等待 在发送新请求之前完成一个请求,例如 您永远不会同时发出多个请求),那么您 应该绝对可以。另外,请尝试将所有内容合并到一个请求中(例如,在titles参数中使用多个标题,而不是为每个标题都重新请求

Thi建议您每个API请求可以获取50页。

如果您需要脱机访问内容,也可以使用Data Dumps(可能有些过时,我认为这对您来说不是问题)。

如果您达到任何限制,则可以使用these状态消息处理API调用中的错误和警告。

答案 1 :(得分:0)

HTTP 429错误具有误导性。错误不是来自Wiki服务器,而是来自 谷歌。 Google对textblob的每日费用有限制。但是googletrans 请求是免费的。所以我不得不安装googletrans并使用它。

!pip install googletrans
from googletrans import Translator
translator = Translator()

我不得不改变

TextBlob(t).detect_language() == 'it'

 translator.detect(t).lang == 'it'

现在,即使我使用较大的搜索范围,也就是10年而不是2年。 我没有429错误。

答案 2 :(得分:0)

您可以使用:

try:
   urlpage=urllib.request.urlopen('url')

except:
   time.sleep(1)
   urlpage=urllib.request.urlopen('url')

这对我有用。只需在我们收到任何错误后等待一段时间,然后再次尝试相同的请求