网页抓取某些网页无法完成

时间:2019-01-02 02:56:52

标签: node.js puppeteer

所以我正在用节点8学习网络抓取 npm install-保存请求者承诺的角色peppeteer

代码很简单

const rp = require('request-promise');
const url = 'https://www.examples.com'; //good

rp(url).then( (html) => {
    console.log(html);
}).catch( (e) => {
    console.log(e);
});

现在,如果url是examples.com,我可以看到纯HTML输出,很好。

Q1:如果是yahoo.com,则会输出二进制数据,例如 �i�,a�g�Z。〜���++ <Vr�K�#,bc���8�����|。 ���U>��p4U>mś0��Z�M�Xg''6�lS�2B�+�Y�Ɣ���?��*  为什么会这样?

Q2:然后使用nasdaq.com, const url ='https://www.nasdaq.com/earnings/report/msft'; 上面的代码还没完成,似乎挂在那里。

为什么请这样?

1 个答案:

答案 0 :(得分:3)

我不确定第二季度,但我可以回答第一季度。

似乎Yahoo正在将您检测为机器人,并阻止您抓取页面!网站检测机器人的最常用方法是通过User-Agent header。当您使用 self.posts.sort(by: { (p1, p2) -> Bool in return p1.creationDate.compare(p2.creationDate) == .orderedDescending }) (内部使用request-promise库)发出请求时,它根本不会设置此标头。这意味着网站可以推断您的请求来自某个程序(而不是Web浏览器),因为没有User-Agent标头。然后,他们会将您像机器人一样对待您,并向您发送乱码,或者从不为您提供内容。

您可以通过manually setting a User-Agent header来解决此问题,以模仿浏览器。请注意,这似乎适用于Yahoo,但可能不适用于所有网站。其他网站可能会使用更先进的技术来检测机器人。

request

Q2可能与此有关,但是上面的代码无法解决。纳斯达克可能正在运行更复杂的漫游器检测,例如检查various other headers