我想用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提出请求,我会得到我所需要的:
请帮帮我们。
答案 0 :(得分:1)
您可能已被机器人保护阻止 - 可以使用curl
进行检查。
curl -vL https://www.ukr.net/news/dat/sport/2/
curl似乎得到了结果,如果curl正在运行,那么节点的请求中可能缺少某些东西,解决方案可能是模仿您选择的浏览器。
例如 - 以下是从开发人员工具中获取类似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"
}
};
答案 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);
})