刮Node Nodejs
我想用Nodejs来刮页面“ https://www.ukr.net/ua/news/sport.html ”。 我正尝试使用'request'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>'
如果我从邮差得到请求,我得到我需要的东西:
请帮帮我吧。
你可能被机器人保护阻止 – 这可以用curl
来检查。
curl -vL https://www.ukr.net/news/dat/sport/2/
curl似乎得到了结果,如果curl正在工作,那么在节点的请求中可能会有一些缺失,解决scheme可能是模仿您select的浏览器。
例如,以下是来自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" } };
如果你有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>');
select
$('ul .pear').attr('class')
可能你可以做出这样的事情。
request(options, (err, res, body) => { var $ = cheerio.load(html); })