从现场比分网站抓取网页

Posted

技术标签:

【中文标题】从现场比分网站抓取网页【英文标题】:Web scraping from a live score site 【发布时间】:2016-02-03 15:37:42 【问题描述】:

我正在尝试从实时比分网站获取数据。 我将 node.js 与 express.js、request.js 和cheerio.js 一起使用以从网页获取 html。 它适用于 HTML 的某些部分,但不适用于活动部分。

我正在尝试从网站http://www.flashresultats.com 抓取数据。 当我使用 Chrome 开发者工具时,我可以看到 HTML 内容,但是当我使用我的 javascript 代码时,结果是空的。

这是我试图提取的内容的 Chrome 捕获:

这是我正在使用的代码:

var express = require('express');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app = express();

url = 'http://www.flashresultats.fr'

request(url, function(error, response, html)
    if(!error)
        var $ = cheerio.load(html);
        var myvar = $('#g_1_UJzOgxfc').html();
        console.log(myvar);
    
    else 
        console.log('Error');
    
)

【问题讨论】:

您是否尝试过console.log(html) 来查看整个HTML 是否为空,或者是否没有带有g_1_UJzOgxfc id 的元素? 在第一印象中,数据似乎是在原始站点上异步加载的,所以这就解释了为什么它不在页面的源中。您必须找出异步加载数据的来源,然后直接从那里加载/抓取。 console.log(html) 显示页面的 HTML,但分数不会出现在其中。根据屏幕截图,ID g_1_UJzOgxfc 存在于 HTML 中 你必须使用一个可以处理异步动态加载内容的刮板。或者查看他们为获取内容而进行的 Ajax 调用并对其进行逆向工程。 ***.com/questions/28739098/… 【参考方案1】:

如果你得到你网站的源代码:view-source:http://www.flashresultats.fr/,按ctrl+f并搜索g_1_UJzOgxfc节点,你不会找到它。在加载初始文档后,它肯定是在 javascript 的帮助下生成的。这就是为什么您不能通过发送一个简单的请求得到它的原因。

因此,为了获得动态创建的元素,您应该运行嵌入在从您的请求中收到的正文中的 javascript。你可以使用PhantomJs bridge模块来获取它:

var phantom = require('phantom');

phantom.create(function (ph) 
  ph.createPage(function (page) 
    page.open("http://www.flashresultats.fr", function (status) 
      page.evaluate(function ()  return document.getElementById('g_1_UJzOgxfc'); , function (result) 
        console.log('g_1_UJzOgxfc element is:' + result);
        ph.exit();
      );
    );
  );
);

【讨论】:

以上是关于从现场比分网站抓取网页的主要内容,如果未能解决你的问题,请参考以下文章

怎样抓取网站上的Cookie

如何通过登录对网站执行网页抓取

在没有 [href] 的多层网站上进行 Python 网页抓取

Java抓取网页数据(原网页+Javascript返回数据)

网页抓取:自动化按钮点击[关闭]

如何从浏览器中抓取网站?