SIN'S LAB

技術系の備忘録

C#でGoogle検索結果のタイトルとスニペットを抽出したい

目的

C#から、クエリを指定して、Google検索を行い、結果からタイトルとスニペットのデータを取り出したい

環境

Windows10
VisualStudio 2017 Community

方法

検索のためのURL作成

以下のようにURLを指定してアクセスすることで目的のものを取れる

https://www.google.co.jp/search?num=○○○○&q=××××

num=○○○○には、取得件数を指定
q=××××には、クエリを指定する
このクエリの作成方法としては、Google検索で行うものと同じ

検索して結果ページのHTMLを取得

note.websmil.com
上の記事を参考に、、今回はWebRequestを使って、アクセスとHTMLの取得を行った

注意点

サイト通りに行ったところ取得は出来たが、肝心のタイトルとスニペットのデータの部分が文字化けしていた
これはUTF-8で取得していたためであり、Shift_JISにすることで解決した
以下に、アクセスしてHTMLを取得しコンソール出力とファイル出力をするコードを示す

System.Net.WebRequest wr = System.Net.WebRequest.Create("https://www.google.co.jp/search?num=10&q=人工知能");

System.Net.WebResponse res = wr.GetResponse();
System.IO.Stream st = res.GetResponseStream();

Encoding enc = Encoding.GetEncoding("Shift_JIS");

System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);
string html = sr.ReadToEnd();

sr.Close();
st.Close();
res.Close();

Console.WriteLine(html);
File.WriteAllText(ファイルパス, html, enc);

Console.ReadKey();

HTMLパーサを用いてタイトルとスニペットを取り出す

HTMLパーサとしては、
anglesharp.github.io
を用いる。

AngleSharpはNuGetから入手できる
NuGet Gallery | AngleSharp 0.9.10

AngleSharpを用いて、タイトルとスニペットを表示するコードを以下に示す

var parser = new HtmlParser();
var document = parser.Parse(html);

//タイトル部分とスニペット部分の取得
var title = document.GetElementsByTagName("h3");
var snipet = document.QuerySelector("div.s > span.st");

//タイトルの表示
foreach (var tmp in title) {
    foreach (var tmp2 in tmp.ChildNodes)
    {
        Console.WriteLine(tmp2.TextContent);
    }
}
//スニペットの表示
foreach (var tmp in snipet) {
     foreach (var tmp2 in tmp.ChildNodes)
     {
   //ただし、コンソールに出力すると改行が含まれる(おそらく<br>があるため)
          Console.WriteLine(tmp2.TextContent);
     }
}

スニペット部分の取得の際に、QuerySelectorに指定しているdiv.s > span.stは、
hobik-site.blogspot.com
を参考にした。
また、そこから、タイトルとスニペットを表示するための方法は、
stackoverflow.com
を参考にした。


(ちなみに、AngleSharpの型とかわからないまま、他のサイトを参考に書いているので、気力があればまとめたいと思います。なので、タイトルの表示部分は、試行錯誤で上に示したようになっています)