No se pueden localizar los datos mostrados en el código fuente cuando se raspa con Scrapy

Estoy usando Python.org versión 2.7 64 bit en Windows Vista 64 bit. Estoy usando una combinación de Scrapy y regex para extraer información de un elemento de Javascript llamado ‘DataStore.Prime’ en la siguiente página:

http://www.whoscored.com/Regions/252/Tournaments/26/Seasons/4057/Stages/8273 El rastreador que estoy usando es este:

from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import Selector from scrapy.item import Item from scrapy.spider import BaseSpider from scrapy import log from scrapy.cmdline import execute from scrapy.utils.markup import remove_tags import time import re import json class ExampleSpider(CrawlSpider): name = "goal4" allowed_domains = ["whoscored.com"] start_urls = ["http://www.whoscored.com/Regions/252/Tournaments/26"] download_delay = 1 #rules = [Rule(SgmlLinkExtractor(allow=('/Seasons',)), follow=True, callback='parse_item')] rules = [Rule(SgmlLinkExtractor(allow=('/Tournaments/26'),deny=('/News', '/Fixtures'),), follow=False, callback='parse_item')] def parse_item(self, response): regex = re.compile('DataStore\.prime\(\'ws-stage-stat\', { stageId: \d+, type: \d+, teamId: -?\d+, against: \d+, field: \d+ }, \[\[\[.*?\]\]', re.S) match2h = re.search(regex, response.body) if match2h is not None: match3h = match2h.group() match3h = str(match3h) match3h = match3h \ .replace('title=', '').replace('"', '').replace("'", '').replace('[', '').replace(']', '') \ .replace(' ', ',').replace(',,', ',') \ .replace('[', '') \ .replace(']','') \ .replace("DataStore.prime", '') \ .replace('(', ''). replace('-', '').replace('wsstagestat,', '') match3h = re.sub("{.*?},", '', match3h) 

Estoy después de los partidos y las puntuaciones que se muestran bajo el título ‘FA Cup Fixtures’. Puede seleccionar la semana de juego que desee utilizando el calendario en la página en sí. Sin embargo, si miras el código fuente, solo contiene la semana más reciente del juego (ya que esta es la temporada pasada, es la final de la Copa FA).

Los datos de todas las semanas anteriores no están en el código fuente de esta página. El calendario que utiliza parece estar generando un elemento dentro del código llamado:

 stageFixtures.load(calendarParameter) 

Esto (si lo he entendido correctamente parece controlar qué semana de juego se selecciona para mostrar. Lo que quiero saber es:

1) ¿Es esa suposición correcta? 2) ¿Hay algún lugar dentro del código fuente que dirija a otras URL que almacenan las puntuaciones por semana (estoy bastante seguro de que no lo hay, pero soy realmente nuevo en Javascript)?

Gracias

Hay una solicitud XHR va a cargar los accesorios. Simularlo y obtener los datos.

Por ejemplo, accesorios para Jan 2014 :

 from ast import literal_eval from datetime import datetime import requests date = datetime(year=2014, month=1, day=1) url = 'http://www.whoscored.com/tournamentsfeed/8273/Fixtures/' 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 = literal_eval(response.content) print fixtures 

Huellas dactilares:

 [ [789692, 1, 'Saturday, Jan 4 2014', '12:45', 158, 'Blackburn', 0, 167, 'Manchester City', 1, '1 : 1', '0 : 1', 1, 1, 'FT', '0', 0, 0, 4, 1], [789693, 1, 'Saturday, Jan 4 2014', '15:00', 31, 'Everton', 0, 171, 'Queens Park Rangers', 0, '4 : 0', '2 : 0', 1, 0, 'FT', '1', 0, 0, 1, 0], ... ] 

Tenga en cuenta que la respuesta no es un json, sino básicamente un volcado de la lista de listas de Python, puede cargarla con ast.literal_eval() :

Evalúe de forma segura un nodo de expresión o una cadena codificada en Unicode o Latin-1 que contenga una expresión de Python. La cadena o el nodo proporcionado solo puede consistir en las siguientes estructuras literales de Python: cadenas, números, tuplas, listas, dados, booleanos y ninguno.