RubyでCapybaraを用いたスクレイピングしようとしたところ環境設定がうまくできなくて断念したのでPythonで試すことに
##参考書籍
Pythonによるスクレイピング&機械学習 開発テクニック
こちらの内容を参考にしながら進めていきました。
ただ2018年9月現在、モジュールなどが最新の場合は一部のサポートが期限切れだったりして(Selenium + PhantomJS など)、参考書の一部のコードがそのままでは動作しないということがわかったので、そちらをふまえて今回はSelenium + Chromeを用いました。
##動作環境
- MacOS X(筆者はversion 10.13.6)
- Python 3.6.5 :: Anaconda custom (64-bit)
- chromedriver-binary 2.38
- beautifulsoup4 4.6.3
- selenium 3.14.0
インストール方法は下記
(はじめのころAnaconda3でPython3系を入れていたためpip3などは今回は利用しないで進めました。)
Anacondaのインストールはこちらを参考:
Anaconda で Python 環境をインストールする
参考書籍では環境設定を主にDockerにイメージを作成してそこでpythonとpipを利用してSeleniumやBeautifulSoupをインストールしていくという流れだったのですが思わぬアクシデントがあったので断念、、、
#####※アクシデントの内容
参考書に沿って進めていき、「pip3のバージョンが古いのでアップデートしてください」というエラーが発生したので、指示に沿って下記のコードを実行したところ
$pip3 install --upgrade pip
さらにエラーが続き、調べたところこちらのサイトに書かれた内容と同じ事案のようでした。
「KOKENSHAの技術ブログ」
Python pip3 – pip upgradeした後 「cannot import name ‘main’ 」error
ここにある通りに復旧した後、Anacondaにパッケージを追加していく方向となりました。
####パッケージのインストール
$conda install selenium
$conda install beautifulsoup4
$conda install python-chromedriver-binary
PhantomJSを利用する場合は
$conda install phantomjs
でインストールできます。
※はじめにも書きましたが、書籍のサンプルなどではヘッドレスブラウザとしてPhantomJSを使っていましたがSelenium v3.8.1以降のバージョンではPhantomJSはサポートされていないので今回はChromeを利用しました
インストールの確認は
$conda list
で確認できます。
##実践
以下のコードが問題なく動けばOKです!
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
from bs4 import BeautifulSoup
import re #正規表現モジュール
# ブラウザーを起動
options = Options()
options.add_argument('--headless')
# Chromeのドライバを得る
browser = webdriver.Chrome(chrome_options=options)
url = "https://www.carsensor.net/usedcar/search.php?SKIND=1"
# 暗黙的な待機を最大3秒行う(サーバーの負担軽減)
browser.implicitly_wait(3)
# URLを読み込む
browser.get(url)
# htmlを取得
html = browser.page_source
# 「メーカー 車種」選択ボタンをクリック
browser.find_element_by_id('shashuAnc').click()
# HTMLを解析する
soup = BeautifulSoup(html, "html.parser")
# メーカー名/車種名を取得
makers = soup.find_all("a", "js_makerMenu", href="#")
# 項目のなかの不必要なもののリスト
skip_list = ["こだわらない","国産車その他","輸入車その他"]
for maker in makers:
# テキスト部分の抽出
maker = maker.text
# 正規表現で余分なものを取る
maker = re.sub(r'\(\d*\)', "", maker) #(数字)
maker = re.sub(r'\s', "", maker) #空白
#除外項目をスキップ
if not maker in skip_list:
print(maker)
# ブラウザを終了
browser.quit()