2017-11-23 15 views
0

HtmlUnit - Javaを使用して出版ウェブサイト(ResearchGate)からデータをスクラブしています。 データをスクレイピングするために、テキストファイルからURLを与えています。私はテキストファイルに約4000のURLを持っています(すべてのURLまたはページには同じパターンがありますが、データは異なります)。しかし、私はすべてのそれらの4000のURLのための私のロジックを実行しようとすると、私はエラーを取得しています:HtmlUnitエラー - com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException:429リクエストが多すぎる

com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException: 429 Too Many Requests for https://www.researchgate.net/application.RequestQuotaExceeded.html?tk=i1iSnVitFTozE0uu1nlOqH6CgwJA0vikMY_2VFnCBM3JDz4SZrupIy5I4yAT5KBOFAX-LySwTEIR4dak8u0FRHod9caWkRiNZS6RDGKXCY2Gn7kh80q72oaXjk8RWsXqqfcrNa3ULlnSHgQ 
    at com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java:537) 
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:362) 
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:434) 
    at com.pollak.library.Authenticator.autoLogin(Authenticator.java:70) 
    at com.pollak.library.FetchfromPublicationPage.main(FetchfromPublicationPage.java:34) 

私のコードは次のとおりです。

package com.pollak.library; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.util.ArrayList; 
import java.util.List; 
import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.html.HtmlAnchor; 
import com.gargoylesoftware.htmlunit.html.HtmlElement; 
import com.gargoylesoftware.htmlunit.html.HtmlPage; 
public class FetchfromPublicationPage { 

    public static void main(String a[]) throws Exception { 
     String path = "Path to the text file which contains 4000 URLs"; 
     File file = new File(path); 
     BufferedReader br = new BufferedReader(new java.io.FileReader(file)); 
     String line = null; 

     String baseUrl = "https://www.researchgate.net"; 
     String login = <login_ID>; 
     String password = <password>; 

     File facurl = new File("Path to the file in which I want to save scraped information"); 
     FileWriter fw = new FileWriter(facurl); 
     BufferedWriter bw = new BufferedWriter(fw); 
     int neha = 1; 


     try { 
      WebClient client = Authenticator.autoLogin(baseUrl + "/login", login, password); 
      String facultyprofileurl; 
      while ((facultyprofileurl = br.readLine()) != null) { 

       String info= "", ath = ""; 
       String arr[] = facultyprofileurl.split(","); 

       HtmlPage page = client.getPage(arr[2]); 

       if (page.asText().contains("You need to sign in for access to this page")) { 
        throw new Exception(String.format("Error during login on %s , check your credentials", baseUrl)); 
       } 

       List<HtmlElement> items = (List<HtmlElement>) page.getByXPath(
         "//div[@class='nova-e-text nova-e-text--size-m nova-e-text--family-sans-serif nova-e-text--spacing-xxs nova-e-text--color-grey-700']"); 

       List<HtmlElement> items2 = (List<HtmlElement>) page.getByXPath(
         "//div[@class='nova-e-text nova-e-text--size-l nova-e-text--family-sans-serif nova-e-text--spacing-none nova-e-text--color-inherit nova-v-person-list-item__title nova-v-person-list-item__title--clamp-1']"); 

       String print = ""; 

       if (items.isEmpty()) { 
        System.out.println("No items found !"); 
       } else { 
        for (HtmlElement htmlItem : items) { 

         HtmlElement articleinfo = ((HtmlElement) htmlItem.getFirstByXPath(".//ul")); 
         info += articleinfo.getTextContent().toString()+"**"; 

        } 
       } 

       if (items.isEmpty()) { 
        System.out.println("No items found !"); 
       } else { 
        for (HtmlElement htmlItem : items2) { 

         HtmlAnchor authors = ((HtmlAnchor) htmlItem.getFirstByXPath(".//a")); 
         ath += authors.getTextContent().toString()+"**"; 


        } 
       } 

       bw.write(neha + "," + info +","+ath); 
       bw.newLine(); 
       neha = neha + 1; 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

誰1は案内していただけます。このエラーを解決する方法。

+0

429 Too Many Requestsは、同じURLから短い時間に送信したリクエストの数が原因で、サーバーがあなたに返信するものです。 – RBRi

+0

同じURLからの要求の数は、要件に応じた制約です。このような状況のために他にどのような運動がありますか? –

答えて

1

私はあなたのための簡単な解決策がないと恐れています。あなたは自分自身を掘り起こし、何が起こっているのか把握する必要があります。

多分いくつかのヒント。

最初は、Httpとその一般的な仕組みに精通している必要があります。それを理解し、得たエラーコードを読んでみてください。 次は、ウェブプロキシ(チャールズなど)を使用して、ワイヤで何が起こっているのかを確認します。たぶんサーバーは、この状況を検出するためにサーバー側で使用される規則についてのヒントを含むいくつかの追加情報(ヘッダー)を送信することがあります。

次に、簡単なプログラムから始めて、問題の原因となるリクエストの量を見つけようとします。

私たちはあなたのために分析作業を行うことはできません。 httpの仕組みについて知る必要があります。httpサーバが何をしているのか理解していなければなりません。しかし、サーバー側の人々はあなたのようなロボットをブロックしているように思えます(さまざまな理由で)。多分あなたは解決策を見いだすでしょうが、多分この解決策はしばらくの間しか動かないかもしれません。

+0

ヒントのおかげで! –

関連する問題