当前位置: 首页 > 知识库问答 >
问题:

带有动态内容的抓取足球统计数据

富凯旋
2023-03-14

我将用废料从 squawka.com 中抓取一些数据。代码显示为模糊。首先,我转到结果页面。在这里,我搜索来自德国德甲联赛的详细比赛统计数据链接,并且它还抓取所有分页链接并发送请求。一切都很好,但只有在“Ligas循环中的Liga”中,我提出了一个无法正常工作的请求,因为后面有动态的东西。如果链接被加载,我可以抓取团队名称,比分,日期,竞技场名称,但我不能抓取例如主队的镜头(项目['ShotsA'] = response.xpath(“//div[@id='mc-stat-shot']/div/div/div[@class='team2-data']/文本()”).extract() 在我抓取时是空的)。我用硒尝试了一些东西,但没有成功。有人可以帮助我处理请求命令或硒吗?

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)

共有1个答案

马嘉勋
2023-03-14

您需要分析站点在该特定页面中执行的AJAX请求,并在Crapy代码中重新创建它们。如果您使用现代浏览器,您将拥有允许您执行此操作的开发人员工具。例如,在火狐中按 F12 并查看“网络”选项卡。

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

 类似资料:
  • 我想使用Python在这样的网页上抓取“你在寻找这些作者吗”框的内容:http://academic.research.microsoft.com/Search?query=lander 不幸的是,该框的内容是由JavaScript动态加载的。通常在这种情况下,我可以阅读Javascript来了解发生了什么,或者我可以使用Firebug之类的浏览器扩展来了解动态内容的来源。这次没有这样的运气。。。

  • 问题内容: 我需要从此网站Link中抓取新闻公告。公告似乎是动态生成的。它们不会出现在源代码中。我通常使用机械化,但是我认为它不会起作用。我该怎么办?我可以使用python或perl。 问题答案: 礼貌的选择是询问网站所有者是否具有允许您访问其新闻报道的API。 不太礼貌的选择是跟踪页面加载时发生的HTTP事务,并确定哪一个是AJAX调用,该调用会提取数据。 看起来就是这个。但是看起来它可能包含会

  • 问题内容: 因此,我正在使用python和beautifulsoup4(我不受其约束)来抓取网站。问题是当我使用urlib抓取页面的html时,它不是整个页面,因为其中一些是通过javascript生成的。有什么办法可以解决这个问题? 问题答案: 基本上有两个主要选项可以继续: 使用浏览器开发人员工具,查看哪些ajax请求将加载页面并在脚本中模拟它们,您可能需要使用json模块将响应json字符串

  • 问题内容: 我想使用Python在这样的网页上抓取“正在寻找这些作者:”框中的内容:http : //academic.research.microsoft.com/Search?query=lander 不幸的是,盒子的内容是由JavaScript动态加载的。通常在这种情况下,我可以阅读Javascript来了解发生了什么,或者可以使用Firebug之类的浏览器扩展来了解动态内容的来源。这次没有

  • 问题内容: 免责声明:我在StackOverflow上看到过许多其他类似的帖子,并尝试以相同的方式进行操作,但是它们似乎在此网站上不起作用。 我正在使用Python-Scrapy从koovs.com获取数据。 但是,我无法获得动态生成的产品尺寸。具体来说,如果有人可以引导我从此链接的下拉菜单中获取“不可用”尺寸标签,我将不胜感激。 我可以静态获取尺寸列表,但这样做只能得到尺寸列表,但不能获得其中的

  • 问题内容: 我正在尝试抓取一个网站,但我没有得到某些要素,因为这些要素是动态创建的。 我在node.js中使用了cheerio,下面是我的代码。 此代码返回空响应,因为加载页面时,该页面为空。 内容尚未添加。 如何使用node.js获取这些元素?如何抓取具有动态内容的页面? 问题答案: 干得好;