数据抓取时更改代理
Changing proxy while data scraping
我使用 Java
中的 JSOUP
库编写了一个数据抓取软件。我正在发布一些数据 on this page 并且我正在从提交的页面中获取结果。一切都很完美,但他们最近更新了网站,现在在 300-500 个结果之后,这个页面对我来说不可用,接下来的几个小时就坏了。当我手动更改代理时:
System.setProperty("http.proxyHost", proxy);
System.setProperty("http.proxyPort", proxyPort);
然后我的应用程序继续运行并且一切正常。问题是因为我每次遇到 Read time
异常时都必须手动更新代理。
是否有任何其他方法可以在 500 多个结果后绕过此 block-IP 过滤器,或者每次我的 IP 被阻止时我都必须自己输入代理?
我认为真正的问题不是如何切换代理,而是您在目标机器上遇到了一些限制。请记住,某些服务器负载很重,或者也需要向其他用户提供内容。因此他们建立了一些爬行配额或其他 DoS 限制,这样就更难让一个人进行密集爬行耗尽本地资源。它因网站而异,但这是您需要通过试验来检查的内容。如果您的服务器给您 2-3 pages/sec,那还不错。检查例如 Heritrix 爬虫。默认情况下,它实现 "Responsible Crawling" 的规则,这意味着爬虫试图对远程服务器保持礼貌。例如:默认情况下,它会等待 5 秒,然后再向同一台服务器发出另一个请求。还有一个延迟因子(默认为 5),表示如果服务器需要 1 秒回复,那么我们可能不应该在 5 秒内发出超过 1 个请求。
回到问题:你需要检查的是:
- 您可以在多长时间内向服务器发出多少查询?当您发现它时,请尝试在给定的时间范围内分发您的查询,以免超过配额。
- 也许限制是基于带宽的?使用 HTTP/1.1 和 gzip 压缩怎么样?
- 如果远程服务器支持 HTTP/1.1,也许您可以使用 "connection: keep-alive" 并通过同一个 HTTP 连接进行例如 10 或 20 次查询?
- 看看你能不能在晚上运行你的爬虫,也许服务器不那么忙,你的查询队列可以更快地下载。
- 请做好准备,您的抓取可能需要一些时间。
无论如何请记住,对于某些服务器来说,抓取可能非常繁重,它们仍然需要一些资源来为其他访问者提供服务。我知道这不完全是原始问题的答案,但我认为这是解决它的另一种方法:)
如果您不介意使用外部 API,您可以尝试使用我的 https://gimmeproxy.com。它不断检查代理并为每个请求提供随机工作代理。
我使用 Java
中的 JSOUP
库编写了一个数据抓取软件。我正在发布一些数据 on this page 并且我正在从提交的页面中获取结果。一切都很完美,但他们最近更新了网站,现在在 300-500 个结果之后,这个页面对我来说不可用,接下来的几个小时就坏了。当我手动更改代理时:
System.setProperty("http.proxyHost", proxy);
System.setProperty("http.proxyPort", proxyPort);
然后我的应用程序继续运行并且一切正常。问题是因为我每次遇到 Read time
异常时都必须手动更新代理。
是否有任何其他方法可以在 500 多个结果后绕过此 block-IP 过滤器,或者每次我的 IP 被阻止时我都必须自己输入代理?
我认为真正的问题不是如何切换代理,而是您在目标机器上遇到了一些限制。请记住,某些服务器负载很重,或者也需要向其他用户提供内容。因此他们建立了一些爬行配额或其他 DoS 限制,这样就更难让一个人进行密集爬行耗尽本地资源。它因网站而异,但这是您需要通过试验来检查的内容。如果您的服务器给您 2-3 pages/sec,那还不错。检查例如 Heritrix 爬虫。默认情况下,它实现 "Responsible Crawling" 的规则,这意味着爬虫试图对远程服务器保持礼貌。例如:默认情况下,它会等待 5 秒,然后再向同一台服务器发出另一个请求。还有一个延迟因子(默认为 5),表示如果服务器需要 1 秒回复,那么我们可能不应该在 5 秒内发出超过 1 个请求。
回到问题:你需要检查的是:
- 您可以在多长时间内向服务器发出多少查询?当您发现它时,请尝试在给定的时间范围内分发您的查询,以免超过配额。
- 也许限制是基于带宽的?使用 HTTP/1.1 和 gzip 压缩怎么样?
- 如果远程服务器支持 HTTP/1.1,也许您可以使用 "connection: keep-alive" 并通过同一个 HTTP 连接进行例如 10 或 20 次查询?
- 看看你能不能在晚上运行你的爬虫,也许服务器不那么忙,你的查询队列可以更快地下载。
- 请做好准备,您的抓取可能需要一些时间。
无论如何请记住,对于某些服务器来说,抓取可能非常繁重,它们仍然需要一些资源来为其他访问者提供服务。我知道这不完全是原始问题的答案,但我认为这是解决它的另一种方法:)
如果您不介意使用外部 API,您可以尝试使用我的 https://gimmeproxy.com。它不断检查代理并为每个请求提供随机工作代理。