java - 数据抓取时更改代理

标签 java proxy web-scraping jsoup http-proxy

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

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

然后我的应用程序继续运行,一切都恢复正常。问题是因为每次遇到读取时间异常时,我都必须手动更新代理。

在超过 500 个结果后,是否有其他方法可以绕过此阻止 IP 过滤器,或者每次当我的 IP 被阻止时我都必须自己输入代理?

最佳答案

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

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

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

无论如何,请记住,爬行对于某些服务器来说可能非常繁重,并且它们仍然需要一些资源来为其他访问者提供服务。我知道这并不完全是原始问题的答案,但我认为这是解决它的不同方法:)

关于java - 数据抓取时更改代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38947884/

相关文章:

java - Spinner 中的自定义行

python - 从 python-2.5 升级到 2.7 时带有 HTTPS 回归的 urllib2.ProxyHandler

java - Spring servlet配置文件抛出异常

java - 连接oracle数据库时netbeans java中出现未知异常

PHP获取真实IP(代理检测)

python - Scrapy框架的代理IP

python - 使用 Python 请求通过 AJAX 表单

python - 在Python3中,如何使用.append函数将字符串添加到抓取的链接中?

python - 使用 webscrapig 对网站进行压力测试

java - 在计算信息增益时显示 NaN 作为输出的双变量数组