Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有动态内容的Scrapy crawl足球统计信息_Javascript_Selenium_Dynamic_Request_Scrapy - Fatal编程技术网

Javascript 具有动态内容的Scrapy crawl足球统计信息

Javascript 具有动态内容的Scrapy crawl足球统计信息,javascript,selenium,dynamic,request,scrapy,Javascript,Selenium,Dynamic,Request,Scrapy,我将用scrapy从squawka.com上搜集一些数据。代码如下所示。首先,我进入结果页面。在这里,我从德国德甲搜索详细的比赛统计链接,同时它会抓取所有分页链接并发送请求。一切都很好,但只有在“为西甲在西甲循环”中,我提出了一个不好的请求,因为后面有动态的东西。如果加载了链接,我可以抓取球队名称、分数、日期、竞技场名称,但我无法抓取主队的快照(例如,项目['ShotsA']=response.xpath(//div[@id='mc-stat-shot']]/div/div[@class='te

我将用scrapy从squawka.com上搜集一些数据。代码如下所示。首先,我进入结果页面。在这里,我从德国德甲搜索详细的比赛统计链接,同时它会抓取所有分页链接并发送请求。一切都很好,但只有在“为西甲在西甲循环”中,我提出了一个不好的请求,因为后面有动态的东西。如果加载了链接,我可以抓取球队名称、分数、日期、竞技场名称,但我无法抓取主队的快照(例如,项目['ShotsA']=response.xpath(//div[@id='mc-stat-shot']]/div/div[@class='team2-data']/text())。抓取时extract()是空的,因为动态行为。我用硒做了一些尝试,但没有成功。有人能帮我使用request命令或selenium吗

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)

您需要分析站点在该特定页面中执行的AJAX请求,并在您的代码中重新创建它们。如果您使用的是现代浏览器,那么您将可以使用开发人员工具来执行此操作。例如,在Firefox中,按F12并查看网络选项卡


网站可能没有使用AJAX来填充这些动态部分(但大多数网站都是这样),因此您需要深入查看页面以了解它在做什么。它可以使用普通Javascript从页面中的隐藏部分获取数据,在这种情况下,信息就在那里,但您只需要从不同的元素中提取它。该网站还可能使用更复杂的通信手段,如WebSocket,如果是这种情况,您可能无法使用Scrapy获取数据

您需要分析站点在该特定页面中执行的AJAX请求,并在您的代码中重新创建它们。如果您使用的是现代浏览器,那么您将可以使用开发人员工具来执行此操作。例如,在Firefox中,按F12并查看网络选项卡


网站可能没有使用AJAX来填充这些动态部分(但大多数网站都是这样),因此您需要深入查看页面以了解它在做什么。它可以使用普通Javascript从页面中的隐藏部分获取数据,在这种情况下,信息就在那里,但您只需要从不同的元素中提取它。该网站还可能使用更复杂的通信手段,如WebSocket,如果是这种情况,您可能无法使用Scrapy获取数据

@Javier Ayres!谢谢你的回答。我在DevLoper工具中使用了lokok,但是有很多请求,没有找到一些有用的东西。这是一个链接,从那里我想刮镜头和其他东西。在chrome或firefox with firebug的devolpoer工具中,我可以在哪里找到更详细的信息,请求的重要性是什么?按类型列过滤。您不需要返回CSS、Javascript、图像等的请求。您可能需要返回JSON、HTML或XML的请求。从这里开始,您必须查看每个响应,看看这是否就是您要查找的内容。@Javier Ayres!谢谢你的回答。我在DevLoper工具中使用了lokok,但是有很多请求,没有找到一些有用的东西。这是一个链接,从那里我想刮镜头和其他东西。在chrome或firefox with firebug的devolpoer工具中,我可以在哪里找到更详细的信息,请求的重要性是什么?按类型列过滤。您不需要返回CSS、Javascript、图像等的请求。您可能需要返回JSON、HTML或XML的请求。从那里,你必须查看每个响应,看看这是否是你正在寻找的内容。