刮网Nodejs

时间:2017-02-04 15:24:23

标签: node.js web-scraping request xmlhttprequest

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

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提出请求,我会得到我所需要的:

enter image description here

请帮帮我们。

2 个答案:

答案 0 :(得分:1)

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

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

curl似乎得到了结果,如果curl正在运行,那么节点的请求中可能缺少某些东西,解决方案可能是模仿您选择的浏览器。

例如 - 以下是从开发人员工具中获取类似Chrome的请求的示例:

enter image description here

为请求导出以下选项:

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"
    }
};

答案 1 :(得分:1)

如果您有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