2014-09-03 3 views
5

Bevor ich eine vollständige Lösung für mein Problem mit Scrapy bauen Ich veröffentliche eine vereinfachte Version von dem, was ich tun möchte:XHR Anfrage-URL sagt existiert nicht, wenn man versucht, es ist Inhalt zu analysieren

import requests 

url = 'http://www.whoscored.com/stageplayerstatfeed/?field=1&isAscending=false&orderBy=Rating&playerId=-1&stageId=9155&teamId=32"' 

params = {'d': date.strftime('%Y%m'), 'isAggregate': 'false'} 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'} 

response = requests.get(url, params=params, headers=headers) 

fixtures = response.body 
#fixtures = literal_eval(response.content) 
print fixtures 

Dieser Code ist sagen, dass die obige URL nicht existiert. Die URL bezieht sich auf eine XHR Anfrage, die eingereicht wird, wenn Sie aus dem ‚Overall‘ wechseln zum Tab ‚Startseite‘ der Haupttabelle auf dieser Seite:

http://www.whoscored.com/Teams/32/ 

Wenn Sie XHR Protokollierung in der Konsole von Google Developer aktivieren Tools können Sie sowohl die XHR-Anfrage als auch die vom Server in Form eines Wörterbuchs (das erwartete Format) gesendete Antwort sehen.

Kann mir jemand sagen, warum der obige Code die Daten, die ich erwarten würde, nicht zurückgibt?

Dank

Antwort

7

Sie haben mehrere Probleme:

  • die URL http://www.whoscored.com/stageplayerstatfeed
  • falsch GET Parameter
  • fehlen wichtige erforderliche Header
  • Sie response.json() benötigen, nicht response.body
sein sollte

Die feste Version:

import requests 

url = 'http://www.whoscored.com/stageplayerstatfeed' 
params = { 
    'field': '1', 
    'isAscending': 'false', 
    'orderBy': 'Rating', 
    'playerId': '-1', 
    'stageId': '9155', 
    'teamId': '32' 
} 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36', 
      'X-Requested-With': 'XMLHttpRequest', 
      'Host': 'www.whoscored.com', 
      'Referer': 'http://www.whoscored.com/Teams/32/'} 

response = requests.get(url, params=params, headers=headers) 

fixtures = response.json() 
print fixtures 

Drucke:

[ 
    { 
     u'AccurateCrosses': 0, 
     u'AccurateLongBalls': 10, 
     u'AccuratePasses': 89, 
     u'AccurateThroughBalls': 0, 
     u'AerialLost': 2, 
     u'AerialWon': 4, 
     ... 
    }, 
    ... 
] 
+0

Dank dafür, dass, wie ich gearbeitet wollte es. Ich erkannte nicht, dass ich die Teile der URL nach der Hauptadresse als spezifische Parameter spezifizieren musste und nicht nur als Teil der URL, wie sie in der Konsole angezeigt werden. Könntest du auch erklären, was die drei Zeilen nach 'User-Agent' in 'headers' tun? danke ... – gdogg371

+1

@ user3045351 sicher, das sind Header, die vom Browser gesendet wurden, als ich es inspiziert habe. Sie können versuchen, sie einzeln zu entfernen und zu sehen, ob der Code bricht - ich denke, zumindest einige von ihnen sind nicht wirklich erforderlich. Vielen Dank. – alecxe

Verwandte Themen