2015-07-22 5 views
1

Я буду царапать некоторые данные с squawka.com с помощью scrapy. Код показан bewlow. Сначала я перехожу на страницу результатов. Здесь я просматриваю подробные ссылки на статистику матча из немецкой бундеслиги, а также просматривает все ссылки на страницы и отправляет запрос. Все работает отлично, но только в цикле «для лиги в лигасе» я делаю запрос, который не работает нормально, из-за динамического материала. Если ссылка загружена, я могу очистить имена команд, баллы, дату, название арены, но я не могу царапать, например. Выстрелы для домашней команды (item ['ShotsA'] = response.xpath ("// div [@ id = 'mc-stat-shot']/div/div [@ class = 'team2-data']/текст() "). extract() пуст, когда я соскабливаю) из-за динамического поведения. Я пробовал некоторые вещи с селеном без успеха. Может ли кто-нибудь помочь мне с запросом или с селеном?Scrapy crawl soccer статистика с динамическим контентом

import scrapy 
from soccer.items import SoccerItem 
from selenium import selenium 
from selenium import webdriver 
from selenium.webdriver.support.ui import Select 
import time 

class SquawkaSpider(scrapy.Spider): 
    name = "soccer" 
    allowed_domains = ["squawka.com"] 
    start_urls = ["http://www.squawka.com/match-results"] 

def __init__(self): 
    #self.driver = webdriver.Chrome(executable_path='/Users/fabian/chromedriver') 
    #self.driver = webdriver.Firefox() 

def parse(self, response): 

    #self.driver.get("response.url") 
    #self.driver.find_element_by_xpath("//*[@id='league-filter-list']/option[contains(text(), 'Top 5 European Leagues')]").click() 
    Matches = response.xpath("//tr[@class='match-today']") 
    counter = response.xpath("//div/center/div[@id='sq-pagination']/span/span[@class='page-numbers current']/text()").extract()[0] 

    if counter == "1": 
     yield scrapy.Request(url="http://www.squawka.com/match-results?ctl=22_s2014", cookies={'firsttime_new': '1', 'sqhome_competition': '126', 'sqhome_competitionidinfeed': '22', 'sqhome_competitionteam': '0', 'sqhome_seasonid': '2014', 'timeZone': '2.0'}, callback=self.parse) 

    for Match in Matches: 
     Ligas = Match.xpath("td[@class='match-league']/a/text()").extract() 
     for Liga in Ligas: 
      if Liga == "Bundesliga": 
       Matchlinks = Match.xpath("td[@class='match-centre']/a/@href").extract() 
       yield scrapy.Request(Matchlinks[0], callback=self.parse_match_link) 


    if counter == "1": 
     page = response.xpath("//div/center/div[@id='sq-pagination']/span/a[@class='pageing_text_arrow'][1]/@href") 
    if counter != "1": 
     page = response.xpath("//div/center/div[@id='sq-pagination']/span/a[@class='pageing_text_arrow'][3]/@href") 

    if page: 
     next = page.extract() 
     yield scrapy.Request(next[0], cookies={'firsttime_new': '1', 'sqhome_competition': '126', 'sqhome_competitionidinfeed': '22', 'sqhome_competitionteam': '0', 'sqhome_seasonid': '2014', 'timeZone': '2.0'}, callback=self.parse) 

def parse_match_link(self, response): 

    item = SoccerItem() 

    item['TeamH'] = response.xpath("//div[@id='team1']/ul[@class='team-lineup']/li[@id='team1-select']/text()").extract() 
    item['GoalH'] = response.xpath("//div[@id='sq-mc-top-header']/div[@id='mc-header-team-1']/div[@class='team-score'][1]/span/text()").extract() 
    item['ShotsH'] = response.xpath("//div[@id='mc-stat-shot']/div/div[@class='team1-data']/text()").extract() 

    item['TeamA'] = response.xpath("//div[@id='team2']/ul[@class='team-lineup']/li[@id='team2-select']/text()").extract() 
    item['GoalA'] = response.xpath("//div[@id='sq-mc-top-header']/div[@id='mc-header-team-2']/div[@class='team-score'][1]/span/text()").extract() 
    item['ShotsA'] = response.xpath("//div[@id='mc-stat-shot']/div/div[@class='team2-data']/text()").extract() 

    item['Date'] = response.xpath("//div[@id='sq-mc-top-header']/div[@id='mc-header-date']/text()").extract() 
    item['Stadium'] = response.xpath("//div[@id='sq-mc-top-header']/div[@id='mc-header-stadium']/text()").extract() 
    yield item 

    #self.driver.get(response.url) 

ответ

0

Вам необходимо проанализировать запросы AJAX, которые сайт делает на этой конкретной странице, и воссоздать их в вашем коде Scrapy. Если вы используете современный браузер, у вас появятся инструменты разработчика, которые позволят вам это сделать. Например, в Firefox нажмите F12 и посмотрите вкладку Сеть.

Есть вероятность, что сайт не использует AJAX для заполнения этих динамических разделов (но это имеет место на большинстве сайтов), поэтому вам нужно будет выглядеть глубже на странице, чтобы узнать, что он делает. Он может использовать простой Javascript для извлечения данных из скрытого раздела на странице, и в этом случае информация есть, но вам просто нужно извлечь ее из другого элемента. Сайт также может использовать более сложные средства связи в качестве Web-сокетов, если это так, вы, вероятно, не сможете получить данные с помощью Scrapy.

+0

@ Javier Ayres! Спасибо за Ваш ответ. У меня был lokok В инструменте devoloper, но есть много запросов и не найти полезных вещей. Это одна из ссылок http://b-liga.squawka.com/1fc-kln-vs-vfl-wolfsburg/23-05-2015/german-bundesliga/matches, и оттуда я хочу очистить снимки и другие вещи. Где я могу найти более подробную информацию в инструменте devolpoer из chrome или firefox с firebug, который требует важного? –

+1

Фильтр по столбцу типа. Вам не нужны запросы, которые возвращают CSS, Javascript, изображения и т. Д. Вам, вероятно, нужны запросы, которые возвращают JSON, HTML или XML. Оттуда вам нужно будет посмотреть каждый ответ, чтобы узнать, есть ли это тот контент, который вы ищете. – lufte

Смежные вопросы