pythonでスクレイピングしてみた~selenium編~

プログラミング

前回はScrapyによるスクレイピングをやりましたが、今回はseleniumを使ってスクレイピングをしていきます。

BeautifulSoupより高度なスクレイピングができ、(個人的には)Scrapyより扱いやすいなと感じました。

ではさっそくやっていきましょう。

スポンサーリンク

seleniumとは

seleniumとはブラウザ(GoogleChromeとかFirefoxとか)を自動操作し、ボタンをクリックしたりスクロールしたりスクショを撮ったりすることができるUIテストツールのことです。

もともとはWebテストに使うように開発されていたそうですが、スクレイピングにも応用できるということで、今ではそのような使い方もされています。

スクレイピングしていこう

準備するもの

最初から必要なのは

  • jupyternotebook
  • Anaconda prompt(or powershell)

です。

driverを準備する

seleniumを使うにはまず、driverというものをインストールしなくてはいけません。これによってブラウザを操作してスクレイピングを行います。

driverはブラウザによって違うものを使います。Chromeを今回は使っていきたいので専用のdriverをインストールしていきます。

まず、 公式サイトにアクセスしdriverをインストールしていきます。

ぼくは「ChromeDriver 76.0…..」をダウンロードしました。

お使いのブラウザに合わせてダウンロードしましょう。(間違っていると使うことができません。)

お使いのOSを選んでzipファイルをダウンロードします。

zipファイルがダウンロード出来たら展開しておきましょう。

seleniumをインストール

次にseleniumをインストールします。

Anacondapromptで

pip install selenium

としてインストールします。

titleとurlをスクレイピング

さて、準備が整いました。さっそくスクレイピングしていきましょう。

今回もぼくのサイト記事のtitleとurlをスクレイピングしていきます。

同じだとつまらないのでseleniumで自動操作させながらスクレイピングしていきたいと思います。

具体的にいうと

  • キーワードを検索
  • ページを移動してスクレイピング

という機能をつけてみました。

ではコーディングしていきましょう。

コーディング

 
from selenium import webdriver 
import pandas as pd
from pandas import DataFrame,Series 
import time

#Access to page

driver = webdriver.Chrome(executable_path="chromedriver_win32/chromedriver.exe")
#"python"でサイト内検索 
kw = "python"
url = "https://imagisi.com/?s="+kw
driver.get(url)

page = 1 #This number shows the number of current page later

columns = ["url","title"]
df = pd.DataFrame(columns=columns)

#スクレイピング処理 
while True:
    if len(driver.find_elements_by_css_selector("a.pagination-next-link")) > 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")

        links = driver.find_elements_by_css_selector(".a-wrap")
        #title,urlを読み取ってデータフレームに追加
        for href in links:
            url = href.get_attribute("href")
            title = href.find_element_by_css_selector("h2").text

            se = pd.Series([url, title],columns)
            df = df.append(se, columns)

        print(df)

        #次のページへ遷移するリンクを探して移動

        btn = driver.find_element_by_css_selector(".pagination-next-link").get_attribute("href")
        print("next url:{}".format(btn))
        driver.get(btn)
        page+=1
        driver.implicitly_wait(10)
        print("Moving to next page......")
        time.sleep(10)
    #次のページのリンクがないときは処理をした後スクレイピングを終える    
    elif len(driver.find_elements_by_css_selector("a.pagination-next-link")) == 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")

        links = driver.find_elements_by_css_selector(".a-wrap")

        for href in links:
            url = href.get_attribute("href")
            title = href.find_element_by_css_selector("h2").text

            se = pd.Series([url, title],columns)
            df = df.append(se, columns)

        print(df)
        #スクレイピングを終える         
        print("no pager exist anymore")
        break

#csvに保存   
df.to_csv(kw + ".csv",encoding='utf_8_sig')
print("DONE")
driver.close() 

モジュールのインストール

はじめから解説していきます。

from selenium import webdriver 
import pandas as pd
from pandas import DataFrame,Series 
import time

まず、必要なモジュールをインストールします。

driverのパスを通す・キーワードで検索できるようにする

driver = webdriver.Chrome(executable_path="chromedriver_win32/chromedriver.exe")
kw = "python"
#"python"でサイト内検索
url = "https://imagisi.com/?s="+kw
driver.get(url)

次に先ほどダウンロードしたdriverのパスを通します。

そのあとスクレイピングするurlを取得します。サイト内検索のurlを設定し、キーワード(kw)で検索できるようにします。

繰り返し処理

if len(driver.find_elements_by_css_selector("a.pagination-next-link")) > 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")

        links = driver.find_elements_by_css_selector(".a-wrap")
    
    #title,urlを読み取ってデータフレームに追加
        for href in links:
            url = href.get_attribute("href")
            title = href.find_element_by_css_selector("h2").text
            se = pd.Series([url, title],columns)
            df = df.append(se, columns)

        print(df)

    #次のページへ遷移するリンクを探して移動
        btn = driver.find_element_by_css_selector(".pagination-next-link").get_attribute("href")
        print("next url:{}".format(btn))
        driver.get(btn)
        page+=1
       #10秒待つ
        driver.implicitly_wait(10)
        print("Moving to next page......")
        time.sleep(10)
        

ここで、繰り返し処理をしてtitleとurlを取ってきます。

ほしい情報が取れたら”.pagination-next-link”をクリックさせて次のページに遷移します。そして同じ処理を繰り返します。その際サーバーに負荷をかけないよう10秒止めます。

最終ページまで進んだ場合

elif len(driver.find_elements_by_css_selector("a.pagination-next-link")) == 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")
        #get all posts in a page

        links = driver.find_elements_by_css_selector(".a-wrap")

        for href in links:
            url = href.get_attribute("href")
            title = href.find_element_by_css_selector("h2").text

            se = pd.Series([url, title],columns)
            df = df.append(se, columns)

        print(df)
        #スクレイピングを終える         
        print("no pager exist anymore")
        break

次は最終ページに来た後の処理です。次のページがもうないので得たい情報を得た後はスクレイピングを終えます。

csvに保存してブラウザを閉じる

df.to_csv(kw + ".csv",encoding='utf_8_sig')
print("DONE")
driver.close()

最後にcsvに出力し、ブラウザを閉じます。

“python.csv”という名前でこのように保存されていたら成功です。

参考

PythonでSeleniumを使ってスクレイピング (基礎) - Qiita
スクレイピングを勉強しようと思い立って、Selenium を使ってでブラウザを操作してみたので、軽くまとめておこうと思います。 使用したもの Selenium 自動でブラウザを操作する為のライブラリ Chrome ...
【Python】Pager(次へ)が存在するポストを最後までスクレイピングしCSVに保存 - Qiita
やったこと はてなブックマークでと検索して、ページャーが存在する限りすべてのページをスクレイピングする どうせならCSVに保存しておく アルゴリズム 検索語句を格納する変数を用意する (例)query...
ChromeDriverのパスが通りません・・
###やりたいこと seleniumとchromedriverを使ってスクレイピングしたいのですが、上手くパスが通せません。 どうしたら良いでしょうか。 windows 7 anacond
Selenium webdriverよく使う操作メソッドまとめ - Qiita
はじめに こんにちは。QAの@mochioです。 本記事はLIFULL Advent Calendar 2017 20日目の記事になります。 業務で自動テストを実施しておりまして、そこでSeleniumを使っております。 Selen...
scrapy crawlコマンドでスパイダーに引数を渡す | note.nkmk.me
Pythonのスクレイピング・クローリングフレームワークScrapyで、scrapy crawlコマンドでクローリングを実行する際にスパイダーに引数を渡す方法について、以下の内容を説明する。scrapy crawlコマンドの書き方 スパイダースクリプトのサンプル スパイダースクリプトの書き方・注意点 Scrapyの基本...
Google Scholarから論文の基本情報をpython で取得する - Qiita
はじめに Qiita初投稿です。 GoogleScholarで読んだ論文を整理したかったので、論文の基本情報をpythonを 使ってスクレイピングしてみました。 環境について 今回はAnaconda仮想環境内の以下のモジュ...
404 Not Found - Qiita - Qiita
タイトルとURLをコピーしました