我正在嘗試執(zhí)行一項(xiàng)任務(wù),該任務(wù)要求我進(jìn)入和退出該頁(yè)面中的玩家信息:https://www.baseball-reference.com/leaders/戰(zhàn)爭(zhēng)_蝙蝠_職業(yè)生涯. shtml。在這種情況下,我必須進(jìn)入排名第一的巴里·邦茲的網(wǎng)頁(yè),收集所需的數(shù)據(jù),然后轉(zhuǎn)到貝比魯斯,他僅次于因戰(zhàn)爭(zhēng)而落后的邦茲,等等。
在這個(gè)過程中,我遇到了兩個(gè)問題:
錯(cuò)誤(429):請(qǐng)求太多 在我違反錯(cuò)誤(429)之后,檢索數(shù)據(jù)的速度變得越來越慢 我不確定第二點(diǎn)是否與第一點(diǎn)有關(guān),因此,任何信息或幫助都將受到感謝。
from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
import pandas as pd
def counting_WAR(df):
sum = 0
for i in range(0, len(df)):
if type(df.iloc[i]["Age"]) is str:
age = int(df.iloc[i]["Age"])
if age <= 30:
WAR = float(df.iloc[i]["WAR"])
sum += WAR
else: return sum
root_page = "https://www.baseball-reference.com/leaders/WAR_bat_career.shtml"
root_soup = BeautifulSoup(urlopen(root_page), features = 'lxml')
root_df = pd.read_html(requests.get('https://www.baseball-reference.com/leaders/WAR_bat_career.shtml').text.replace('<!--','').replace('-->',''), attrs={'id':'leader_standard_WAR_bat'})[0]
index = 0
for td in root_soup.find_all('td', csk = True):
for a in td.find_all('a', href = True):
player_page = ("http://www.baseball-reference.com" + a.get('href'))
df = pd.read_html(requests.get(player_page).text.replace('<!--','').replace('-->',''), attrs={'id':'batting_value'})[0]
df[(~df.Lg.isna()) & (df.Lg != 'Lg')]
war_before_30 = "{:.2f}".format(counting_WAR(df))
print("Player:", root_df["Player (yrs, age)"][index], "accumulates:", war_before_30, " WAR before 30")
index += 1
我應(yīng)該主動(dòng)停止這個(gè)過程多長(zhǎng)時(shí)間,或者我不應(yīng)該?為什么檢索數(shù)據(jù)的速度突然變得這么慢?我完全是熊貓圖書館的新手,所以任何幫助我建立如何有效使用熊貓的想法的信息都會(huì)有幫助!
HTTP 429太多請(qǐng)求響應(yīng)狀態(tài)代碼指示用戶 在給定的時(shí)間內(nèi)發(fā)送了過多的請(qǐng)求(& quot速度 限制& quot).
服務(wù)器保護(hù)自己免受太多請(qǐng)求的影響并降低速度,但是該響應(yīng)中可能包含Retry-After報(bào)頭,指示在發(fā)出新請(qǐng)求之前要等待多長(zhǎng)時(shí)間。
原則上應(yīng)該尊重這種反饋,并在中計(jì)算相應(yīng)的項(xiàng)。如果有官方API的話,換成他們就好了。
然而,這也可能是一個(gè)配置問題,有時(shí)它可能已經(jīng)有助于在請(qǐng)求中指定相應(yīng)的用戶代理,或者在有疑問的情況下輪換IP。