今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第2章を参考にさせていただきながら、Selenium+PhantomJS(画面なしブラウザ)で、ブログページから記事タイトル一覧を出力できるようになりました。
Docker上に構築した、Selenium+PhntomJSの実行環境を使いました。
Selenium+PhntomJSの実行環境の構築に関しては、以下の記事をご参照ください。
今回は、ブログのトップページにアクセスして、記事のリストを取得して、タイトルとそのURLを出力するコードを作っていきます。 全体像は以下の通りです。 以下のコードを、「blog_title_list.py」に保存しました。 from selenium import webdriver URL = 'https://oregin-ai.hatenablog.com/' browser = webdriver.PhantomJS() browser.get(URL) kiji_list = links = browser.find_elements_by_css_selector('h1.entry-title a') browser.quit() では、コードを順番に見ていきます。 前回同様、SeleniumからWebサイトを操作するために必要な、webdriverをインポートします。 from selenium import webdriver インポートされたwebdriverを使って、PhantomJSのインスタンス(実体:browser)を作成します。 implicitly_waitメソッドで、最大3秒待つ設定をします。 browser = webdriver.PhantomJS() getメソッドを使って、引数に指定したURLのページにアクセスします。 browser.get(URL) 記事のタイトルとURLを格納する空のリストを作ります。 kiji_list = find_elements_by_css_selectorメソッドを使って、タイトルが入った要素をすべて取得します。 記事のタイトルが、「<h1 class="entry-title"> </h1>」に囲まれた中にあり、「<a href="URL" >タイトル</a>」となっているので、”h1.entry-title a"とすることで、「h1タグのentry-titleクラスに含まれる aタグの要素」を取得することができます。 links = browser.find_elements_by_css_selector('h1.entry-title a') つぎに、取得した links から、aタグの要素をひとつづつ処理します。 get_attributeメソッドで、引数に'href’を指定することで、hrefに設定されたURLを取得できます。また、textパラメーターからタイトルを取得できます。 取得したそれぞれの値を、タプル型で、kiji_listに追加(append)していきます。 for a in links: 最後に、kiji_listから、URLと、タイトルをひとつづつ出力します。 for href, title in kiji_list: 先ほど作成したファイルを実行してみます。 python3 blog_title_list.py 実行すると、「PhantomJSは、もう推奨してませんので、ChromeやFireFoxを利用してください」という警告メッセージが表示されますが、実行自体は完了いたしました。 以下の通り、ブログの記事のタイトルと、URLの一覧を取得・出力できました! これで、Webサイトを巡回して、そのページのリンク先を取得することができるようになりました。 これで、動的にリンク先が変わるサイトを巡回することができます。 少しずつですが、できることが増えていくのはとても楽しいです。 次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピングと機械学習開発に取り組んでいきたいと思います。 【過去記事】 2019年8月31日(土)にE資格を受験して、合格しました! E資格対策として勉強の進め方や、参考書などをまとめました。 これから受験される方がいらっしゃいましたらご参考まで。 2019年3月9日(土)にG検定を受験し、見事合格できました! 受験の体験記や勉強法などを別のブログにまとめました。 これから受験される方がいらっしゃいましたらご参考まで。 【E資格対策に使った参考書】 *1:href, titleブログページから記事タイトル一覧を出力する。
1.全体像
browser.implicitly_wait(3)
print('トップページにアクセスしました')
for a in links:
href = a.get_attribute('href')
title = a.text
kiji_list.append((href, title))
print('+ タイトルを{0}件取得しました'.format(len(kiji_list)))
for href, title in kiji_list:
print('- ', '[',title,']:',href)2.Seleniumのライブラリをインポート
3. PhantomJSのインスタンスを作成
browser.implicitly_wait(3)4.トップページにアクセス
5.記事のタイトルを取得して出力
href = a.get_attribute('href')
title = a.text
kiji_list.append*1
print('+ タイトルを{0}件取得しました'.format(len(kiji_list)))
print('- ', '[',title,']:',href)5.コマンドラインから実行してみる。