我试图使用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.comProxify 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 CaptchaDeathByCaptcha仅举几例)。以下是一个通用的分步过程,可自动获取验证码:


检测验证码错误页面


-

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

10-01 19:25
查看更多