2016-10-01 76 views
2

我正在嘗試爲stats.nba.com網站編寫webscraper。有時當我運行一個腳本時,它會以200返回代碼的形式出現,但有時它會變成400錯誤代碼。我懷疑可能有時需要回應,但不確定。這裏有四個例子,但它通常是一個更大的例子。Python請求獲得不一致的響應代碼

這是代碼。

urls = ['http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500001', 'http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500002', 
     'http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500003', 'http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500004'] 

for url in urls: 
    r = requests.get(url) 
    print r.url 
    print r.status_code 

下面是一個示例響應,我繼續得到極不一致的響應代碼。

http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500001 
200 
http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500002 
400 
http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500003 
400 
http://stats.nba.com/stats/boxscoresummaryv2?GameID=0021500004 
400 
+0

也許'stats.nba.com'試圖阻止網頁抓取,並且不允許來自同一個客戶端IP地址的每分鐘超過X個請求。 –

+0

我看不到這個代碼中使用了BeautifulSoup。 –

回答

0

你需要通過一個用戶代理:

In [11]: for url in urls: 
....:   r = requests.get(url, headers={"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.92 Safari/537.36"}) 
    ....:  print(r.status_code) 
    ....:  
200 
200 
200 
200 

沒有用戶代理:

In [12]: for url in urls: 
      r = requests.get(url)   
      print(r.status_code) 
....:  
200 
400 
400 
400 

我也會考慮加入請求之間的睡眠,如果我是你。

+0

非常感謝。自從週日以來,我一直試圖自己弄清楚這一點。爲什麼需要通過用戶代理。我只是想確保我明白。再次感謝! –

+0

用戶代理標題將使您的請求顯示爲來自特定瀏覽器而不是perl腳本。一般來說,大型網站可能會收到更好的結果,這些大型網站可能不希望用戶抓取他們的數據,因爲您將看起來像他們的普通用戶。檢查他們的T&C的允許你這樣做。 – Amias

+0

@KellyRoper,不用擔心,用戶代理用於向Web服務器標識自己,您可以使用'headers = {「user-agent」:「Foobar」},在這種情況下您將得到相同的結果。他們的robots.txt http://stats.nba.com/robots.txt沒有包含任何限制,但是他們的ToS與被抓取的內容沒有關係,服務器似乎只想設置用戶代理頭文件。 –

相關問題