【问题标题】:Scraping Nodejs抓取Nodejs
【发布时间】:2017-06-21 21:01:49
【问题描述】:

我想用 Nodejs 抓取页面“https://www.ukr.net/ua/news/sport.html”。 我正在尝试使用“请求”npm 模块发出基本的获取请求,这里是示例:

const inspect = require('eyespect').inspector();
const request = require('request');
const url = 'https://www.ukr.net/news/dat/sport/2/';
const options = {
    method: 'get',
    json: true,
    url: url
};

request(options,  (err, res, body) => {
    if (err) {
        inspect(err, 'error posting json');
        return
    }
    const headers = res.headers;
    const statusCode = res.statusCode;
    inspect(headers, 'headers');
    inspect(statusCode, 'statusCode');
    inspect(body, 'body');
});

但在响应正文中我只得到

body: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
Transitional//EN">\n<html>\n<head>\n<META HTTP-EQUIV="expires" 
CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">\n<META HTTP-EQUIV=Refresh
CONTENT="10">\n<meta HTTP-EQUIV="Content-type" CONTENT="text/html; 
charset=utf-8">\n<title>www.ukr.net</title>\n</head>\n<body>\n
Идет загрузка, подождите .....\n</body>\n</html>'

如果我向 Postman 提出 get 请求,我得到的正是我所需要的:

请帮帮我。

【问题讨论】:

  • Идет загрузка, подождите ..... = loading, please wait.... - 您尝试抓取的页面包含动态加载的元素,因此您的初始请求会返回“正在加载”消息 - 也许您可以使用类似phantom js 为您呈现页面? stackoverflow.com/a/31059035/459517 - Postman 可能会自动执行类似的操作。

标签: node.js web-scraping request xmlhttprequest


【解决方案1】:

您可能已被机器人保护阻止 - 可以通过 curl 进行检查。

curl -vL https://www.ukr.net/news/dat/sport/2/

curl 似乎得到了结果,如果 curl 正常工作,那么来自节点的请求中可能缺少某些内容,解决方案可能是模仿您选择的浏览器。

例如 - 下面是从 developer-tools 获取的类似 Chrome 的请求示例:

为请求派生以下选项:

const options = {
    method: 'get',
    json: true,
    url: url,
    gzip: true,
    headers: {
        "Host": "www.ukr.net",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, sdch, br",
        "Accept-Language": "en-US,en;q=0.8"
    }
};

【讨论】:

    【解决方案2】:

    如果你有 jquery 的经验,有一个库可以访问 HTML,例如。

    我们将使用的标记示例:

    <ul id="fruits">
      <li class="apple">Apple</li>
      <li class="orange">Orange</li>
      <li class="pear">Pear</li>
    </ul>
    

    首先您需要加载 HTML。 jQuery 中的这一步是隐式的,因为 jQuery 是在一个内置的 DOM 上运行的。使用 Cheerio,我们需要传入 HTML 文档。

    var cheerio = require('cheerio');
    
    $ = cheerio.load('<ul id="fruits">...</ul>');
    

    选择器

    $('ul .pear').attr('class')
    

    也许你可以做这样的事情。

    request(options,  (err, res, body) => {
    
      var $ = cheerio.load(html);
    
    })
    

    https://github.com/cheeriojs/cheerio

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多