数据抓取时更改代理

时间:2016-08-15 00:34:53

标签: java proxy web-scraping jsoup http-proxy

我在JSOUP中使用Java lib编写了一个数据抓取软件。我发布了一些数据on this page,我从提交的页面获得了结果。一切都很完美,但他们最近更新了网站,现在在300-500结果后,这个页面不适合我,它在接下来的几个小时内被打破。当我手动更改代理时:

System.setProperty("http.proxyHost", proxy);
System.setProperty("http.proxyPort", proxyPort);

然后我的应用程序继续,一切正常。问题是因为当我收到Read time异常时,我必须每次都手动更新代理。

还有其他方法可以在500多个结果之后绕过这个阻止IP过滤器,或者每当我的IP被阻止时我必须自己输入代理?

2 个答案:

答案 0 :(得分:1)

我认为真正的问题不在于如何切换代理,而是在目标机器上达到某些限制。请记住,有些服务器负载很重,或者需要向其他用户提供内容。因此,他们建立了一些爬行配额或其他DoS限制,因此一个人进行密集爬行会更难耗尽本地资源。它因网站而异,但您需要通过实验来检查。如果你的服务器给你2-3页/秒,那就不错了。检查Heritrix爬虫的实例。默认情况下,它实现"Responsible Crawling"的规则,这意味着爬网程序尝试与远程服务器保持礼貌。例如:默认情况下,它会在向同一服务器发出另一个请求之前等待5秒。还有一个延迟因子(默认值为5),如果服务器需要1秒钟才能回复,那么我们可能不会在5秒内发出超过1个请求。

回到问题:您需要检查的是:

  • 您可以在多长时间内向服务器发出多少查询?当您发现它时,请尝试在给定的时间范围内分发您的查询,以便永远不会超过配额。
  • 也许限制是基于带宽的?如何使用HTTP / 1.1和gzip压缩?
  • 如果远程服务器支持HTTP / 1.1,您可以使用“connection:keep-alive”并通过同一HTTP连接进行10或20次查询吗?
  • 看看你是否可以在夜间运行你的爬虫,也许服务器不那么繁忙,你的查询队列可以更快地下载。
  • 请准备好您的抓取可能需要一些时间。

在任何情况下,请记住,某些服务器的爬网可能非常繁重,并且仍需要一些资源来为其他访问者提供服务。我知道这不是原始问题的答案,但我认为这是解决问题的另一种方法:)

答案 1 :(得分:0)

如果您不介意使用外部API,可以尝试使用我的https://gimmeproxy.com。它不断检查代理,并为每个请求提供随机工作。