このプログラムの読み込みでは、検索クエリのテキストファイルを取得し、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("&"));
result.add(domainName);
}
return result;
}
}
どのようなエラーを受けていますか? Googleは、こうしたタイプのサービスの自動使用をブロックする可能性があります。 – ti7
ええ、何が問題なのですか?私は約300語を試してみましたが、正常に実行されているようです。 – anacron
すべてのステータスコードとエラー、特にGoogleサービスから返されたエラーをトラップ/ロギングする必要があります。 @ ti7によると、接続/クエリの数と速度を追跡し、しきい値を超えるクライアントをブロックするサイトが数多くあります。通常、特定の期間内に特定の数のリクエストが行われるのを見ると、それが何であるか把握できれば、コードを絞り込むことができるかもしれません。あなたはそれをいくつかの速度で接続して走らせておくことができ、Googleが応答を停止したときと、再び動作を開始したときと、速度で動くときを追跡し、パターンを見つけようとします。また、それはグーグル:) – clearlight