2017-01-03 7 views
1

このプログラムの読み込みでは、検索クエリのテキストファイルを取得し、Googleにクエリして、すべてのリンクを別のファイルに出力します。このプログラムは数百のクエリを処理しますが、突然作業してエラーを報告します。JavaでのGoogleの検索

(私はこの投稿を編集し、私のプログラムのどの行からすぐにエラーが返されるかを掲載します)。

何が起こっている可能性がありますか?

import java.io.*; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.util.Scanner; 

public class GoogleSearcher { 
    public static void main(String [] args) throws Exception { 
    Scanner in = new Scanner (System.in); 
    System.out.println("Input list of queries to search:"); 
    String loc = in.nextLine(); 
    loc = loc.replace("\\", ""); 
    System.out.println("Where to write file?"); 
    String writeLoc = in.nextLine(); 
    writeLoc = writeLoc.replace("\\", " "); 
    FileInputStream fstream = new FileInputStream(loc); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
    String line; 
    PrintWriter pw = new PrintWriter(new FileWriter(writeLoc + "Google Search Results.txt")); 
    while ((line = br.readLine()) != null) { 
     System.out.println("Searching: \"" + line + "\""); 
     ArrayList<String> t = googleSearch(line); 
     if (t != null){ 
     for (int a = 0; a < t.size(); a++){ 
      pw.write(t.get(a) + System.lineSeparator()); 
     } 
     } 
    } 
    br.close(); 
    pw.close(); 
    } 
    public static ArrayList<String> googleSearch(String search) throws Exception { 
    try { 
     String query = "https://www.google.com/search?q=" + search.replace(" ", "%20"); 
     String page = getSearchContent(query); 
     ArrayList<String> links = parseLinks(page); 
     return formatLinks(links); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Error... Trying next search"); 
     return null; 
    } 
    } 
    public static ArrayList<String> formatLinks(ArrayList a){ 
    ArrayList<String> formatted = new ArrayList<String>(); 
    for (int i = 0; i < a.size(); i++){ 
     String t = (String)a.get(i); 
     t = t.replace("%3F", "?"); 
     t = t.replace("%3D", "="); 
     formatted.add(t); 
    } 
    return formatted; 
    } 
    public static String getString(InputStream is) { 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
    String line; 
    try { 
     while ((line = br.readLine()) != null) { 
     sb.append(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (br != null) { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    } 
    return sb.toString(); 
    } 
    public static String getSearchContent(String path) throws Exception { 
    final String agent = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"; 
    URL url = new URL(path); 
    final URLConnection connection = url.openConnection(); 
    connection.setRequestProperty("User-Agent", agent); 
    final InputStream stream = connection.getInputStream(); 
    return getString(stream); 
    } 
    public static ArrayList<String> parseLinks(final String html) throws Exception { 
    ArrayList<String> result = new ArrayList<String>(); 
    String pattern1 = "<h3 class=\"r\"><a href=\"/url?q="; 
    String pattern2 = "\">"; 
    Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2)); 
    Matcher m = p.matcher(html); 
    while (m.find()) { 
     String domainName = m.group(0).trim(); 
     // remove unwanted text 
     domainName = domainName.substring(domainName.indexOf("/url?q=") + 7); 
     domainName = domainName.substring(0, domainName.indexOf("&amp;")); 
     result.add(domainName); 
    } 
    return result; 
    } 
} 
+3

どのようなエラーを受けていますか? Googleは、こうしたタイプのサービスの自動使用をブロックする可能性があります。 – ti7

+0

ええ、何が問題なのですか?私は約300語を試してみましたが、正常に実行されているようです。 – anacron

+0

すべてのステータスコードとエラー、特にGoogleサービスから返されたエラーをトラップ/ロギングする必要があります。 @ ti7によると、接続/クエリの数と速度を追跡し、しきい値を超えるクライアントをブロックするサイトが数多くあります。通常、特定の期間内に特定の数のリクエストが行われるのを見ると、それが何であるか把握できれば、コードを絞り込むことができるかもしれません。あなたはそれをいくつかの速度で接続して走らせておくことができ、Googleが応答を停止したときと、再び動作を開始したときと、速度で動くときを追跡し、パターンを見つけようとします。また、それはグーグル:) – clearlight

答えて

1

いいえ、数回のプログラム実行後、次のエラーが発生しました。

Error... Trying next search 
Searching: "autoradiograph" 
java.io.IOException: Server returned HTTP response code: 503 for URL: https://ipv4.google.com/sorry/index?continue=https://www.google.com/search%3Fq%3Daustria&q=EgTLe7ahGOKSrcMFIhkA8aeDSylzciRE9l0cz9fUg6u2MeGh-muxMgNyY24 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
    at application.GoogleSearcher.getSearchContent(GoogleSearcher.java:90) 
    at application.GoogleSearcher.googleSearch(GoogleSearcher.java:45) 
    at application.GoogleSearcher.main(GoogleSearcher.java:32) 
java.io.IOException: Server returned HTTP response code: 503 for URL: https://ipv4.google.com/sorry/index?continue=https://www.google.com/search%3Fq%3Dautoradiograph&q=EgTLe7ahGOKSrcMFIhkA8aeDS_cQehdQreptc4cInLKEPYpprweeMgNyY24 

Googleがそのサーバー上Denial of Service攻撃を防ぐために自動化された検索をブロックしているので、これは、何が起こっています。

Google Captcha Image

Googleが自動化された検索を実行することができない場合があります。ここにはlink to their support page.があります。ここにそのページからの抜粋があります。

自動化では、Googleから事前に明示の許可なしに我々のシステムへの任意の並べ替えの自動化されたクエリの送信を許可していないサービスの

Googleの利用規約を照会します。自動クエリを送信するとリソースが消費され、WebPosition Goldなどのソフトウェアを使用してGoogleに自動クエリを送信し、ウェブサイトやウェブページがさまざまなクエリのGoogle検索結果にどのようにランク付けされるかを判断します。ランクチェックに加えて、許可なくGoogleに自動的にアクセスする他のタイプのサイトも、ウェブマスター向けのガイドラインと利用規約に違反しています。

1

これはそのように設計されているからです。 Googleが何らかの自動化されたソフトウェアが結果を取得していることを検出すると、人間の検証を求めてCAPTCHAを表示します。

See this answer from support.google.com.

「コンピュータネットワークからの異常なトラフィック」

それはコンピュータまたは上の電話のように思える場合は、「当社のシステムは、あなたの のコンピュータネットワークからの異常なトラフィックが検出されました」表示される場合がありますネットワーク が自動トラフィックをGoogleに送信しています。Googleが自動化されたトラフィック

  • がどのようにウェブサイトやウェブページのランクを見るためにGoogleに検索を送信するソフトウェアを使用して、ロボット、コンピュータプログラム、自動化されたサービス、または検索スクレーパー
  • から検索を送信すると考えるもの

    このメッセージが表示

    を見たときにGoogleの

上の対処方法

エラーページには、恐らくCAPTCHA(下にあるボックス のついた単語)が表示されます。 Googleを引き続き使用するには、 ボックスに波線を入力します。それは、あなたが人間ではなく、ロボットであることを私たちが知る方法です。 のCAPTCHAを正しく入力すると、メッセージは表示されなくなり、再度Google を使用できます。


あなたは、あなたがこの目的のためだけに作成されていますGoogle Custom Searchを使用することができ、あなたのウェブサイトでGoogle検索を使用したい場合。

も参照してください:あなたはAdd search to your site