所以我正在用节点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'; 上面的代码还没完成,似乎挂在那里。
为什么请这样?
答案 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。