プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Python
  • 【Python】Seleniumでクローリング環境を構築
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Python】Seleniumでクローリング環境を構築

05.31

  • miyabisan2
  • コメントを書く

この記事は4分で読めます

Seleniumとは?

Webブラウザ操作を自動化するためのツールでPythonライブラリとは別に準備されています。主にWebアプリのテストや、Webスクレイピングに使われます。

BeautifulSoup+ Requestとの比較

最近は無限スクロール(初期レンダリングで全てのデータが描画されず、スクロールするたびに描画されていく方式)のサイトが多いです。そうした無限スクロールにはJavaScriptの技術が使われておりどうしても静的なDOM操作だけでは対応できません。

そうした場合であっても、Seleniumによる自動クローリングで実際のDOM操作を再現する手法を使えば情報を取得することが可能になります。

対応ブラウザ

様々なブラウザに対応しています。現状はChromeで使っていけば良いでしょう。

セットアップの流れ

以下のステップが必要になります。

  1. Selenium本体をダウンロードする。
  2. PythonライブラリのSeleniumをインストールする。
  3. Pythonで使えるようにする。

ツールのSeleniumのダウンロード

まずは自分のChromeのバージョンを確認しましょう。(「Google Chromeについて」から確認できます。)

https://sites.google.com/a/chromium.org/chromedriver/downloads

一応、上記が公式サイトにはなるのですが公式のバージョンでは若干古い場合があります。Webで「chromedriver バージョン番号」と検索して自分のChromeと同じバージョンのChrome Webドライバーをダウンロードしましょう。

PythonのSeleniumライブラリをインストールする。

1
2
3
conda install selenium
or
pip install selenium

クローリングのサンプル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from time import sleep
 
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
 
# Chromeドライバーをダウンロードしたパスを記述
chrome_driver_path = 'User/xxx/chromedriver'
 
options = Options()
# Chromeをシークレットモードで起動する。
options.add_argument('--incognito')
 
driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
driver.get('https://yahoo.co.jp')
 
sleep(5)
 
driver.quit()

ちなみに、上記サンプルではChromeドライバーのパスを指定していますが、実行コードと同じ階層にWebDriverを配置すればパスを指定しなくても実行できるのでそちらの方が早いかもしれません。

クローリングとスクレピングの違い

クローリングはブラウザを自動で立ち上げて実際に自動操作を行わせる一連の流れのことを言います。それに対してスクレイピングはWebから情報を取得することを指します。微妙に違うので単語の違いを抑えておきましょう。

検索する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from time import sleep
 
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
 
# Chromeドライバーをダウンロードしたパスを記述
chrome_driver_path = '/Users/xxx/chromedriver'
 
options = Options()
options.add_argument('--incognito')
 
driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
driver.get('検索サイトのURL')
 
sleep(3)
 
search_box = driver.find_element_by_class_name('class名')
# りんごと検索します。
search_box.send_keys('りんご')
search_box.submit()
 
sleep(3)
 
driver.quit()

sleep(3)

待機します。クローリングは実際のブラウザを使ってサイトの情報を読み込むので完全に読み込み終えるまでの待ち時間が発生します。

find_element_by_class_name

CSSのclass名でelementにアクセスができます。なお、他にもCSSセレクタを使って要素を特定することも可能です。

無限スクロールにおいてスクロールする

書き方1:ブラウザのスクロールメソッドを利用する。

前提として検索結果が出ているコードに対して実行する必要があります。

1
2
3
4
5
6
height = 300
while height < 2000:
 
    driver.execute_script("window.scrollTo(0, {});".format(height))
    height += 100
    sleep(1)

初期値を300として高さ2000まで徐々にスクロールさせるサンプルコードです。要件に応じて変数の値は適宜いじったりして調整をする必要があります。

driver.execute_script

上記構文でJavaScriptを実行することができます。ループをさせて徐々にスクロールさせています。

書き方2:Endキーでキーボード操作でスクロールする。

1
2
3
4
5
6
from selenium.webdriver.common.keys import Keys
 
scroll_count=10
for i in range(scroll_count):
      driver.find_element_by_tag_name('body').send_keys(Keys.END)
      sleep(1)

このような書き方もあります。サンプルでは「Keys.END」を使っていますが、「Keys.PAGE_DOWN」でないとうまく動かないページもあります。

その他メソッド

1
find_element_by_tag_name('タグ名')

HTMLのタグ名(例:imgタグなど)で要素を取得できます。

1
2
3
 
get_attribute('属性名')
 

取得した要素に対して属性を指定して取得できます。

ヘッドレスモードで実行する

1
2
3
4
5
6
7
8
9
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
 
# Chromeドライバーをダウンロードしたパスを記述
chrome_driver_path = 'User/xxx/chromedriver'
options = Options()
options.add_argument('--headless')
 
driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)

ヘッドレスモードはブラウザ操作を非表示にして実行するモードです。途中の実行状態は確認できませんが、その分早く実行できるのがメリットになります。

オプション一覧

--headlessヘッドレスモード基本こちらの方が若干早いらしいです。ただ、もしスクレイピングにダウンロード操作などがある場合はヘッドレスだと無理です。
--incognitoシークレットモード
--disable-gpuGPUの無効化headlessモードで必要な暫定的なフラグ。こちらの方が安定するらしいです。
--disable-extensions拡張機能の無効化スクレイピング時に不用意にChrome拡張機能が動作しないようOFFにするようにしましょう。
--proxy-server='direct://'プロキシサーバーの設定Proxy経由ではなく直接接続する。
--proxy-bypass-list=*プロキシサーバーの設定全てのホスト名
--start-maximizedウインドウサイズの最大化起動時にウインドウサイズを最大化する。

add_experimental_option

"excludeSwitches", ["enable-logging"]「システムに接続されたデバイスが機能していません」を消す

通常モード

履歴(検索履歴、閲覧履歴、閲覧時間)、Cookie、キャッシュ画像、ダウンロードしたデータ、ログイン情報、入力情報(キーボード履歴)が記録が端末内のアプリやアカウントに保存されます。

シークレットモード

アプリなどを閉じると履歴(検索履歴、閲覧履歴、閲覧時間)、Cookie、キャッシュ画像、ダウンロードしたデータ、ログイン情報、入力情報が保存されず破棄される。ただし「キーボードの入力履歴(過去に検索で利用した入力候補など)」だけは残ります。

お気に入り、リーディングリスト、視聴履歴、検索履歴、保存、いいね等が利用できなくなります。

セッションごとに情報が保持され、セッションが切れると破棄されます。

「シークレットモード」よりも「ゲストモード」の方が過去にアクセスしたURLが表示されないので安全です。

利用できるアプリ

Chrome、Edgeなどのブラウザアプリ、Youtubeでも利用できます。

ゲストモード

PCのみしか使えないです。過去に入力したURLが表示されないのでシークレットモードより安全です。

スポンサーリンク
  • 2023 05.31
  • miyabisan2
  • コメントを書く
  • Python
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2023 07.20

    【Python】ValueError: Timeout value connect was エラーの対処

  2. 2023 06.26

    【Python】モジュール、自作モジュール、パッケージ、ライブラリ

  3. 2023 06.09

    【Python】Scrapy Item、Item Loader、Item pipelineの基本

  4. 2023 05.30

    【Python】スクレイピング結果をCSVに保存する。

  5. 2023 06.24

    【Python】pep8、linter(flake8)、フォーマッター(black、isort)、VSCode拡張機能(autopep8)

  6. 2023 06.04

    【Python】Scrapyで複数ページを操る。

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Python】VSCodeで環境構築

【Python】Scrapyの構成、処理の流れ

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • WebRTC
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー