2017-04-23 16 views
0

NBA.comからPythonを使用してデータをスクラップしようとしていますが、コードを実行したときに妥当な時間を待っても応答が返ってきません。本質的に似ているこれまでのところ、私はブログの記事(here)からコードを再現、および/または、このサイト(PythonR)に掲載の質問しようと試みてきたPython:NBA.comからデータをスクレイピングする

import requests 
import json 

url_front = 'http://stats.nba.com/stats/leaguedashplayerstats?College=&' + \ 
      'Conference=&Country=&DateFrom=&DateTo=&Division=&DraftPick=&' + \ 
      'DraftYear=&GameScope=&GameSegment=&Height=&LastNGames=0&LeagueID=00&' + \ 
      'Location=&MeasureType=' 
url_back = '&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&' + \ 
      'PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&' + \ 
      'PlusMinus=N&Rank=N&Season=2016-17&SeasonSegment=&' + \ 
      'SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&' + \ 
      'VsConference=&VsDivision=&Weight=' 
#measure_type = ['Base','Advanced','Misc','Scoring','Opponent','Usage','Defense'] 
measure_type = 'Base' 
address = url_front + measure_type + url_back 

# Request the URL, then parse the JSON. 
response = requests.get(address) 
response.raise_for_status()   # Raise exception if invalid response. 
data = response.json()    # JSON decoding. 

が、私は、それぞれ同じ結果に終わります時間 - コードは実際にURLから何かを引き出すことに成功しません。

私はウェブスクレイピングに慣れていないので、この問題のトラブルシューティングを支援したいと思っていました。これはクライアントサイドレンダリング(NBA.com)のサイトに共通しているか、コード/コンピュータの問題を示しています?いずれの場合も、一般的な回避策/解決策はありますか?

+1

ブラウザでそのURLに行ってみましたか? 'MeasureType is required'というメッセージが表示されます –

+0

リンクはブラウザで動作するはずです - [こちら](http://stats.nba.com/stats/leaguedashplayerstats?College=&Conference=&Country=&DateFrom=&DateTo=&Division= &DraftPick =&DraftYear =&GameScope =&GameSegment =&高さ=&LastNGames = 0&LeagueID = 00&場所=&MeasureType =ベース&月= 0&OpponentTeamID = 0&成果=&PORound = 0&PaceAdjust = N&PerMode = PerGame&周期= 0&PlayerExperience =&PlayerPosition =&PlusMinus = N&ランク= N&シーズン= 2016から17&SeasonSegment + =&SeasonType =レギュラーSeason&ShotClockRange =&StarterBench =&TeamID = 0&VsConference =&VsDivision =&Weight =)あなたがまだ興味がある場合に備えて。 – chbonfield

答えて

0

ブラウザのリンクをクリックすると、正常に動作することがわかります。その理由は、ブラウザとrequestsには異なるユーザーエージェントヘッダーがあり、そのサイトでは、スクラップしたくないためにブラウザからのように見えないHTTPリクエストがブロックされるためです。これを回避するには、次のようにします。

response = requests.get(address, headers={ 
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0', 
}) 

これを念頭に置いて、サーバーに過負荷をかけないでください。

+0

コード/ディスカッションをありがとう - それは多くの意味があります。どのサイトが '要求 'に追加の情報(' 'User-Agent'や他のヘッダなど)を必要とするかを知る方法はありますか、それとも関係なく提供する方が良いでしょうか? – chbonfield

+0

@chbonfield試行錯誤。人々がスクレイピングするのを止めるのに利用できるリソースとモチベーションが高ければ高いほど、より多くのチェックが行われ、リクエストで提供する情報ほど単純ではありません。例えば、リクエストがあまりに早く行われた場合、サイトは一般的にボットを疑うでしょう。最終的にサイトにはキャプチャが必要な場合があります。 –

関連する問題