【问题标题】:Browser-based client-side scraping基于浏览器的客户端抓取
【发布时间】:2015-07-23 07:41:05
【问题描述】:

我想知道是否可以通过用户的 IP 抓取外部(跨域)页面?

对于购物比较网站,我需要抓取电子商务网站的页面,但来自服务器的多个请求会使我被禁止,因此我正在寻找进行客户端抓取的方法 - 即请求页面从用户的IP发送到服务器进行处理。

【问题讨论】:

  • 随机发送user-agent 字符串对我有用,我不会被禁止。即使我得到了,我也会改变我的IP。或者你可以使用 Selinium 生成一个完整的浏览器请求
  • 您是否每分钟发出数百个请求?我说的是这么大的音量。我知道用户代理,它很简单,但是 IP?
  • 是的,我确实每分钟发出 100 次请求,如果您被阻止,为什么不安排一个 VPN 定期更改您的 IP。 adeepbite.com/hidemyass-vpn-review/#Schedule_IP_Address_Change
  • VPN 比代理更可靠,但我不确定使用 PHP 或 Node 以编程方式从服务器上抓取。 HMA 有 API 吗?
  • 考虑实现一个浏览器扩展来进行抓取。可以绕过同源策略。

标签: javascript php jquery web-scraping phantomjs


【解决方案1】:

不,由于名为Same-origin policy 的安全措施,您将无法使用客户端的浏览器使用 JavaScript 从其他网站抓取内容。

应该没有办法规避此政策,这是有充分理由的。想象一下,您可以指示访问者的浏览器在任何网站上执行任何操作。这不是你想要自动发生的事情。

但是,您可以创建一个浏览器扩展来执行此操作。 JavaScript 浏览器扩展可以配备比常规 JavaScript 更多的权限。

Adobe Flash 具有类似的安全功能,但我想您可以使用 Java(而不是 JavaScript)来创建使用您用户的 IP 地址的网络抓取工具。再说一次,您可能不想这样做,因为 Java 插件被认为是不安全的(而且加载速度很慢!)而且并非所有用户都会安装它。

现在回到你的问题:

我需要抓取一个电子商务网站的页面,但来自服务器的几个请求会使我被禁止。

如果该网站的所有者不希望您以这种方式使用他的服务,您可能不应该这样做。否则,您将面临法律风险(详情请查看 here)。

如果您处于“法律的黑暗面”并且不在乎这是否违法,您可以使用 http://luminati.io/ 之类的东西来使用真实人物的 IP 地址。

【讨论】:

  • Javascript 浏览器插件?您是指 Chrome 和 Mozilla 商店中的浏览器扩展程序吗?我对 Java 没问题,因为我需要的只是页面 HTML,处理是在服务器端完成的。不,这并不违法。提供商只是还没有 API,而那些有的人也没有提供我需要的内容。
  • Luminati 不错,但要 1000 美元?见鬼!顺便说一句,java是一种选择,还有其他选择吗? flash 可以抓取内容吗?
  • @3zzy 所以网站所有者一直在无意中禁止你? ;)
  • @3zzy 是的,这真的很贵。但是,当您从 Hola 用户的(可能已经很慢的)家庭互联网购买流量时,我想他们可以以这个价格出售。也许有更便宜的替代品,但我不知道。
  • 所以确实没有破解或解决我的问题的方法,因此我决定使用浏览器插件/扩展程序和移动平台的混合应用程序。
【解决方案2】:

看看http://import.io,他们提供了几个爬虫、连接器和提取器。我不太确定他们是如何绕过禁令的,但他们以某种方式做到了(我们现在使用他们的系统已经一年多了,没有任何问题)。

【讨论】:

  • 您将它们用于偶尔的抓取或数百个请求/分钟?
  • 老实说,我们只将它们用于偶尔的抓取(主要是财务数据)。这完美无缺。在他们的网站上,他们每天收集 1000 万条记录。这归结为 115 条记录/秒。当然不是针对一个网站,但它们仍然非常可靠且免费(尽管我进行了促销,但我没有任何库存;-)
  • 我真的不明白这如何回答这个问题,考虑到它在服务器上运行并且可能仍会受到 IP 禁令等限制。
  • @anubhava:很高兴为您提供帮助。您有兴趣重新提出问题的任何特定原因吗?除了你的代表?
【解决方案3】:

基本上浏览器是为了避免这样做......

大家首先想到的解决方案:

jQuery/JavaScript: accessing contents of an iframe

但在大多数情况下,它不适用于“最新”浏览器(

替代方案是:

  • 使用服务器的官方api(如果有)
  • 尝试查找服务器是否提供 JSONP 服务(祝你好运)
  • 在同一个域中,尝试跨站点脚本(如果可能,不是很道德)
  • 使用受信任的中继或代理(但这仍将使用您自己的 ip)
  • 假装你是一个谷歌网络爬虫(为什么不,但不是很可靠,也没有任何保证)
  • 使用 hack 在客户端本身上设置中继/代理我可以考虑 java 或可能的 flash。 (不适用于大多数移动设备,速度慢,而且 Flash 也有其自身的跨站点限制)
  • 请 google 或其他搜索引擎获取内容(如果您滥用搜索引擎,您可能会遇到问题......)
  • 只需自己完成这项工作并缓存答案,这是为了卸载他们的服务器并降低被禁止的风险。
  • 自己索引网站(您自己的网络爬虫),然后使用您自己的索引网站。 (取决于源更改频率) http://www.quora.com/How-can-I-build-a-web-crawler-from-scratch

[编辑]

我可以考虑的另一种解决方案是使用YQL 服务,这种方式有点像使用搜索引擎/公共代理作为桥梁来为您检索信息。 Here is a simple example to do so简而言之,你会收到跨域的 GET 请求

【讨论】:

  • @3zzy 我不知道 Document.domain hacks(第 30 页)听起来很有趣,其他选择主要用于访问服务,而不是整个页面。顺便说一句,我又添加了一个解决方案,通过 YQL 可能是答案。您没有 iFrame 的灵活性,不要期望在客户端上使用所有 CSS 渲染页面,但至少您可以在客户端的浏览器上运行一些东西,而无需设置自己的中继。
  • YQL 仍然是一个代理,但它会使用 Yahoo 的 IP,如果我发出许多请求,它仍然可能被阻止。我正在寻找一个强大的解决方案。
  • @3zzy 当然,但他们可能不只使用一个 ip。暂时没有其他想法
  • @3zzy 有官方说明如何阻止YQL:developer.yahoo.com/yql/guide/…
【解决方案4】:

您可以使用 artoo 构建浏览器扩展。

http://medialab.github.io/artoo/chrome/

这将允许您绕过相同的原始策略限制。都是 javascript 并且在客户端。

【讨论】:

  • Artoo 是一个很好的工具,可以在您已经在网站上时使用它来获取数据,但它不允许您系统地抓取,我相信这就是 op 所追求的。跨度>
猜你喜欢
  • 2011-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
相关资源
最近更新 更多