2012-06-15 29 views
1

事情是:我有一個webcrawler框架,以及實現此框架的獨立模塊。所有這些模塊都從新聞特定網站捕捉新聞。IOException缺少細節 - 403錯誤

在框架中有2個不可預知的錯誤:IOException和SocketTimeoutException。由於顯而易見的原因(網站可能處於脫機狀態,和/或正在維護中)

事情是:在特定網站(THIS one)中,我隨機得到隨機IOException。我試着預測它,但我仍然不知道爲什麼我會得到這個錯誤。

我想它是在測試階段從轟炸它的請求。這不是,因爲在2或3天內沒有發送其他申請,它仍然會引發我的錯誤。

一言以蔽之:該網站不需要身份驗證,並隨機拋出403 RANDOMLY

既然403可以是多個不同的錯誤,我想看到的是我的應用程序中的特定問題。

如果我能得到它,我可以嘗試解決它。 (403.1,403.2,...,403.n)

//If you guys want the code, it's a basic Jsoup get. 
//(I have also tried it with native API, 
//and still get the same random 403 errors) 

//Note that I also tried it with no redirection, and still get the error 
Document doc = Jsoup 
    .connect("http://www.agoramt.com.br/") 
    .timeout(60000) 
    .followRedirects(true) 
    .get(); 

//You may criticize about the code. But this specific line is the one 
//that throws the error. And it doesn't randomly do that to other 3k 
//site connections. That's why I want to get the specifics from the 403 
+0

403意味着訪問被禁止給你。你需要更多的理由嗎? – erickson

+0

那麼爲什麼它會隨機拋出這個錯誤呢? –

+0

啊,我明白了。問題是*隨機。*對於完全相同的URL?你有沒有看到任何聚集的時間?您是否嘗試過從不同的源IP地址進行爬網,或者更好地完成不同的網絡攔截? – erickson

回答

3

服務器可能會隨心所欲地返回一個403。除了尊重服務器不讓你進入的願望之外,你不應該解決這個問題。你可以嘗試閱讀服務器提供的細節的響應主體,但這可能只是你會得到的。您正在尋找的403. n錯誤代碼,我相信,是一個IIS特定的功能和您指出的網站似乎與nginx,所以不要期望得到那些。

如果您的WebCrawler 隨機得到了403,但常規網絡瀏覽器(來自同一個IP)從未得到了403然後我可以建議最好是你讓你的WebCrawler的請求頭看完全相同像一個普通的網絡瀏覽器會發送什麼。對於禮貌的網絡爬蟲來說,這是否是正確的行爲是一個不同的討論。

0

什麼問題可能是,是,有,你可以去,你的程序要閱讀網站上的所有文件的文件夾,但是網絡服務器提供了一個403錯誤,並且可能會終止套接字。 這就是我想,沒有代碼,我不能告訴它的程序錯誤或只是網絡服務器的配置。

+2

我知道什麼是403。我在問題中解釋了它。我無法預測403,因爲它會隨機拋出它。這也不是認證問題,因爲該網站不需要登錄來顯示新聞。 –

0

這可能是一個錯誤的網站連接,它可能有代碼來阻止蜘蛛。可能有一個奇怪的代理服務器的方式。

0

也許嘗試添加的index.php到結束(或什麼都該站點的主網頁是...的index.html,等..)

我不能確定這是否會有助於然而解決您的問題。我使用了一個我在某處找到的Connection類,它基本上是上面說的一個帖子(模擬Web瀏覽器的頭文件,所以說...看起來好像它來自於FireFox,而不是java默認的是)。

我想這是值得一試。

1

在網絡爬行器的設計中,應該考慮到意外中斷和錯誤代碼。

保留上次發生故障的網站隊列,以便經過一段時間後,網絡爬蟲可以重試請求。

0

要捎帶其他人說過的話,是否有可能將您的抓取工具識別爲網絡掃描程序或滲透工具?

0

我不知道Jsoup是什麼,但我建議你閱讀HttpURLConnection.getErrorStream()。此方法將允許您讀取錯誤文檔。在連接失敗之後,也應該可以訪問錯誤文檔的頭字段,這是您通常訪問頭字段的方式。總之,這兩個(主體和標題)將爲​​您提供服務器提供的所有信息。