【问题标题】:Web scraping certain web page cannot finish网页抓取某些网页无法完成
【发布时间】:2019-01-02 02:56:52
【问题描述】:

所以我正在学习使用节点 8 进行网络抓取,遵循这个 npm install --save request-promise chefio puppeteer

代码很简单

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, 常量 url = 'https://www.nasdaq.com/earnings/report/msft'; 上面的代码只是不会完成,似乎挂在那里。

请问这是为什么?

【问题讨论】:

  • 你能分享一些为 yahoo.com 输出的“二进制数据”吗?
  • 我已经尝试使用另一个名为“Axios”的HTTP客户端包,结果是一样的,也许是雅虎返回数据的方式?
  • @FelixFong 也许,我对这些东西不太了解,但如果你在浏览器中运行,一切都很好。第二个问题更令人困惑,只是什么都不返回并挂在那里。

标签: node.js puppeteer


【解决方案1】:

我不确定 Q2,但我可以回答 Q1。

雅虎似乎将您检测为机器人并阻止您抓取页面!网站用来检测机器人的最常用方法是通过User-Agent header。当您使用request-promise(内部使用request 库)发出请求时,它根本不会设置此标头。这意味着网站可以推断您的请求来自程序(而不是 Web 浏览器),因为没有 User-Agent 标头。然后,他们会将您视为机器人,然后将您的胡言乱语发回给您,或者从不为您提供内容。

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

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

const options = {
  url,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0'
  }
};

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

Q2 可能与此有关,但上面的代码并没有解决它。纳斯达克可能正在运行更复杂的机器人检测,例如检查various other headers

【讨论】:

  • 没问题!通常,网站希望您使用他们的 API 而不是网络抓取,因为通过 API 获利更容易。纳斯达克有一个要花钱的real-time quote API,这可能就是他们阻止机器人进行网络抓取的原因。我建议寻找其他 API 来解决您的问题,而不是网络抓取。 This 可能是一个不错的起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多