ラベル selenium の投稿を表示しています。 すべての投稿を表示
ラベル selenium の投稿を表示しています。 すべての投稿を表示

2018年9月15日土曜日

Pythonでヤフーニュースをスクレイピング

最近スクレイピングの勉強しているから、目標を立てて使ってみる。
スクレイピングとは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。らしいです。Wikipediaによると。

というわけで、情報集めを自動化できるようになりたいなぁってことで、練習練習。

目標:yahooニュースから更新されている記事の本文を取得する。

今回使うのはseleniumですね。ブラウザを自動操作できるテストツールらしいです。

水銀中毒に効きそうないい名前ですね!

pip install seleniumでインストールして、動かすためのブラウザも用意します。

このページからchromedriver.exeをダウンロード、カレントディレクトリーに置いておきます。



まずは必要そうなライブラリーをimportして、googlechromeでヤフーニュースのゲームタグを開きました。

"https://news.yahoo.co.jp/hl?c=game"

URLを変えれば好きなページでスクレイピングできます。

さて、開いたページから欲しそうな情報をどんどん引き抜いていきす。
とりあえず、記事のタイトルとURLが欲しいかな?
欲しい要素を右クリックして、検証を選んで



これだって感じのhtmlの行を見つけたら右クリックして、CSSセレクタをゲット。
CSSセレクタは要素を選択するための条件式みたいなものっぽい。
GoogleChromeは、html読まなくても、見つけられるから便利便利。



URL
#main > div.epCategory > div > ul > li:nth-child(1) > a
タイトル
#main > div.epCategory > div > ul > li:nth-child(1) > a > div > div.listFeedWrapCont > dl > dt

こんな感じのCSSセレクタがゲットできました。

find_elements_by_css_selector()という関数で、htmlを手に入れられるのでこんな感じで。


これ、取り出す要素が一つでもリストで帰ってくるのか...
li:nth-child(1)の1って数字が記事の1番目を指している気がするので、ここを変えれば全部の記事のタイトルとURLが手に入れられる気がする。
なんか、参考書で似たようなことをやるときにnth-of-type(n)って表記していたから、数字の代わりにnを入れれば、全部の要素を取り出せそう。

いいかんじ
このURLにをgooglechromeで開いて、記事の本文を見つければよさそう。
さっきやったことを繰り返して。

手に入れたURLをdriver.get()でページを開く。
タイトルと本文をリストに追加して、ページの情報をゲットです。



やっとできた。


<おまけ>
・前回起動したときなかった記事だけ欲しい
・記事をデータベース化して保存しておきたい
・ボイスロイドに読ませたい
って感じでコーディング