Yahooの検索結果を取得するJavaプログラム

検索エンジンの検索結果を手軽に取得しようと思ったときに、最初に思いつくのがGoogleのサイトをスクレイピングする方法です。しかしながら、Googleは賢いので、そのようなアクセスを弾いてしまうことがあるので、なかなかうまくはいきません。

そこで、YahooなどのGoogleの検索エンジンを使用している別サイトからスクレイピングする技術が注目を集めています。Javaを使って簡単につくってみました。是非、お役立てください。

package yahoo;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Search {
	private HttpClient httpClient = null;

	Search() {
		int socketTimeout     = 3000;
		int connectionTimeout = 3000;
		String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0)";

		// タイムアウト設定
		Builder builder = RequestConfig.custom();
		builder.setConnectTimeout(connectionTimeout);
		builder.setSocketTimeout(socketTimeout);
		RequestConfig requestConfig = builder.build();

		// HTTPヘッダ情報
		List<Header> headers = new ArrayList<Header>();
		headers.add(new BasicHeader("Accept-Charset", "utf-8"));
		headers.add(new BasicHeader("User-Agent", userAgent));

		// create client
		HttpClientBuilder clientBuilder = HttpClientBuilder.create();
		clientBuilder.setDefaultRequestConfig(requestConfig);
		clientBuilder.setDefaultHeaders(headers);
		httpClient = clientBuilder.build();
	}

	public void run(String word) {

		try {
			word = URLEncoder.encode(word, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}

		HttpGet get = new HttpGet("http://search.yahoo.co.jp/search?p=" + word);

		try {
			HttpResponse response = httpClient.execute(get);
			String html = EntityUtils.toString(response.getEntity(), "UTF-8");

			Document doc = Jsoup.parse(html);

			Elements elements  = doc.select("a");

			for (Element element : elements) {
				// 検索結果に関係するリンクは"FOR="が含まれる
				if (element.attr("href").indexOf("FOR=") != -1) {
					// リンクの最初はYahooのトラッキング用なので削除
					String url = element.attr("href");
					int startPos = url.indexOf("**");
					if (startPos != -1) {
						url = url.substring(startPos+2);
					}
					// URLエンコードを解除
					url = URLDecoder.decode(url, "UTF-8");
					if (url.length() > 0) {
						System.out.println(element.text()); // 説明文
						System.out.println(url); // URL
					}
				}
			}

		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Search search = new Search();
		search.run("新幹線");
	}
}

実行結果

新幹線のご案内:JRおでかけネット
https://www.jr-odekake.net/shinkansen/
新幹線時刻表 – NAVITIME
https://www.navitime.co.jp/diagram/shinkansen/
新幹線 – Wikipedia
https://ja.wikipedia.org/wiki/%E6%96%B0%E5%B9%B9%E7%B7%9A
空席案内 – JR CYBER STATION
http://www.jr.cyberstation.ne.jp/00000200.html
新幹線の運行情報:JR東日本
http://traininfo.jreast.co.jp/train_info/shinkansen.aspx
新幹線 時刻表|駅探 – 駅探トップ
http://timetable.ekitan.com/shinkansen/
東海道・山陽新幹線の時刻表|JR東海 – 鉄道のご利用について
http://railway.jr-central.co.jp/jikoku/
えきねっと(JR東日本)|新幹線・JR特急列車のきっぷ予約
https://www.eki-net.com/pc/personal/yoyaku/wb/Common/ReserveTop/ReserveTop.aspx
新幹線時刻表: 時刻表検索
http://www.tabi-o-ji.com/
山陽新幹線 運行情報:JR西日本列車運行情報
http://trafficinfo.westjr.co.jp/sanyo.html

システム開発

Posted by @erestage