2017-11-23 4 views
1

このスクリプトを実行すると、IDLEは続行されません。通常、エラーになります。他のスクリプトはうまく動くので、IDLEではないことが分かります。私のコードは正しいと思ったが、多分私は何かを逃した。これは私がサイトから掻き集めることではない、ちょうど私がすべてを後で実行できるよりもまずこの作品を見たいと思っただけではありません。要求のあるPythonスクレープ

import csv 
import requests 
import os 

##HOME TEAM 

req = requests.get('http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=10%2F17%2F2017&DateTo=04%2F11%2F2018&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=Home&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=Totals&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2017-18&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&VsConference=&VsDivision=') 
data = req.json() 

my_data = [] 
pk = data['resultSets'] 
for item in data: 
    team = item.get['rowSet'] 

    for item in team: 
     Team_Id = item[0] 
     Team_Name = item[1] 
my_data.append([Team_Id, Team_Name]) 
headers = ["Team_Id", "Team_Name"] 

with open("NBA_Home_Team.csv", "a", newline='') as f: 
    writer = csv.writer(f) 
    writer.writerow(headers) 
    writer.writerows(my_data) 
f.close() 

##os.system("taskkill /f /im pythonw.exe") 
+0

上記の行と同じにする必要がありますか? – BrenBarn

+0

エラーは何ですか? –

+0

Ranの後にエラーまたはNo >>>がありません。 CSVなしどちらか –

答えて

1

サーバーが応答しないためハングアップするようです。これは、プロセスを強制終了し、スタックトレースをチェックすることで確認できます。

Traceback (most recent call last): 
    req = requests.get('http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=10%2F17%2F2017&DateTo=04%2F11%2F2018&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=Home&MeasureType=Base&Month=0 
&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=Totals&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2017-18&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&VsCo 
nference=&VsDivision=')            
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 72, in get 
    return request('get', url, params=params, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 58, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 502, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 612, in send                                   
    r = adapter.send(request, **kwargs)                                               
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 440, in send                                   
    timeout=timeout                                 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 600, in urlopen 
    chunked=chunked)    
    File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 379, in _make_request 
    httplib_response = conn.getresponse(buffering=True)        
    File "/usr/lib/python2.7/httplib.py", line 1121, in getresponse 
    response.begin()            
    File "/usr/lib/python2.7/httplib.py", line 438, in begin 
    version, status, reason = self._read_status()    
    File "/usr/lib/python2.7/httplib.py", line 394, in _read_status 
    line = self.fp.readline(_MAXLINE + 1)       
    File "/usr/lib/python2.7/socket.py", line 480, in readline 
    data = self._sock.recv(self._rbufsize) <-- we're stucking here 
KeyboardInterrupt 

私は私のブラウザでURLを開こうとしましたが、それがうまく働いたと私は秒以内に応答を受信しました。その後、コード内のリクエストを調整して、有効なブラウザを模倣し始めました。私の最初のアイデアは、有効なユーザーエージェントを使用していたし、私はすぐに次のコードで応答受信:

data = requests.get(
    'http://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=10%2F17%2F2017&DateTo=04%2F11%2F2018&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=Home&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=Totals&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2017-18&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&VsConference=&VsDivision=', 
    headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1'}, 
).json() 

おそらくボットに対する防御機構のいくつかの種類が有効なユーザーエージェントなしで無応答を引き起こします。コードスニペットの

その他の注意事項:

for item in data: 

利用pkの代わりdata

team = item.get['rowSet'] 

使用item['rowSet']またはitem.get('rowSet')が、それらを混在させないでください。 item.getは、[]を適用できない関数なので、

my_data.append([Team_Id, Team_Name]) 

インデントは、あなたが「継続しない」とは何を意味するか

+0

ありがとう!以前はUser-Agentを使ったことがありません。それは何ですか?私はコードが少し見えたと思った。 –

+0

User-Agentは、HTTPクライアント(https://en.wikipedia.org/wiki/User_agent)を識別するHTTP要求ヘッダーです。ブラウザと要求libには、デフォルトで異なるユーザーエージェントがあります。 – asciimoo

+0

ありがとうございました! –