我试图使用600种不同的搜索方式从Google抓取链接,在此过程中,我开始遇到以下错误。
错误
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=503, URL=http://ipv4.google.com/sorry/IndexRedirect?continue=http://google.com/search/...
现在,我已经完成了研究,它的发生是因为Google学术搜索禁令将您限制在有限的搜索范围内,并且需要解决问题才能继续进行,而jsoup无法做到。
码
Document doc = Jsoup.connect("http://google.com/search?q=" + keyWord)
.userAgent("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)")
.timeout(5000)
.get();
互联网上的答案非常模糊,没有提供明确的解决方案,有人提到过Cookie可以解决此问题,但并未对“如何”做到这一点说过任何话。
最佳答案
一些改善刮擦的提示:
1.使用代理
代理可以让您减少被验证码抓住的机会。您应该使用50到150个代理,具体取决于您的平均结果集。这是两个可以提供一些代理的网站:SEO-proxies.com或Proxify Switch Proxy。
// Setup proxy
String proxyAdress = "1.2.3.4";
int proxyPort = 1234;
Proxy proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(proxyAdress, proxyPort))
// Fetch url with proxy
Document doc = Jsoup //
.proxy(proxy) //
.userAgent("Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2") //
.header("Content-Language", "en-US") //
.connect(searchUrl) //
.get();
2.验证码
无论如何,如果您被验证码所吸引,则可以使用一些在线验证码解决服务(Bypass Captcha,DeathByCaptcha仅举几例)。以下是一个通用的分步过程,可自动获取验证码:
检测验证码错误页面
-
try {
// Perform search here...
} catch(HttpStatusException e) {
switch(e.getStatusCode()) {
case java.net.HttpURLConnection.HTTP_UNAVAILABLE:
if (e.getUrl().contains("http://ipv4.google.com/sorry/IndexRedirect?continue=http://google.com/search/...")) {
// Ask online captcha service for help...
} else {
// ...
}
break;
default:
// ...
}
}
下载验证码图片(CI)
-
Jsoup //
//.cookie(..., ...) // Some cookies may be needed...
.connect(imageCaptchaUrl) //
.ignoreContentType(true) // Needed for fetching image
.execute() //
.bodyAsBytes(); // byte[] array returned...
在线发送CI到在线验证码服务
-
这部分取决于验证码服务API。您可以在此8 best captcha solving services文章中找到一些服务。
等待响应...(1-2秒完美)
用响应填写表格,并用Jsoup发送
Jsoup FormElement在这里可以节省生命。有关详细信息,请参见此working sample code。
3.其他一些提示
Hints for Google scrapers文章可以为您提供一些改进代码的指针。您将在此处找到前两个提示以及更多提示:
Cookies:在每次IP更改时将其清除或完全不使用它们
线程:您不应该打开两个很多连接。每个代理Firefox limits itself to 4 connections。
返回结果:将
&num=100
附加到您的网址中以发送较少的请求请求率:使您的请求看起来很人性化。每个IP每24小时发送的请求数量不应超过500。
参考文献:
How to use Jsoup through a proxy?
How to download an image with Jsoup?
How to fill a form with Jsoup?
FormElement javadoc
HttpStatusException javadoc