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