即使脚本访问的页面数量甚至不超过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
答案 0 :(得分:0)
根据Wikipedia的API指南:API:Etiquette和API: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')
这对我有用。只需在我们收到任何错误后等待一段时间,然后再次尝试相同的请求