この記事では、以下の事項を説明します。
この記事に該当するGitHubレポジトリはこちらにあります。
Selenium: これはなに?どのように使用する?
Seleniumは、ブラウザの自動化行動を可能にするさまざまなツールやライブラリを含むオープンソースのソフトウェアです。これには次のようなものがあります。
- ウェブページごとの要素アクション/取得 (close、back、get_cookie、get_screenshot_as_png、get_window_sizeなど)
- サイトテスト
- アラートプロンプトやクッキーの管理(追加/削除)
- 要素の送信実行
- データの収集/ウェブスクレイピング
Firefox、Chrome、Safari、Internet Browserなど、ほとんどのブラウザと互換性があります。また、Python、Node.js、C#、JavaScript、PHPなど、多様なプログラミング言語でのテストの書き込みに使用できます。
お使いいただけるように、official Selenium 4.1.5 documentation libraryのリンクをご用意しました。
Puppeteer vs Selenium
Puppeteer vs Seleniumについて議論し、考慮されている皆様 – JavaScriptとChromeを主に中心とする場合には、Puppeteerのほうが利便性が高いと思います。その一方で、複数のブラウザ間でブラウザアプロケーションのテストやウェブデータの収集を実施する場合には、Seleniumが最良の選択でしょう。
Seleniumを活用してスクレイピングを行う手順ガイド
手順1:Seleniumをインストール
お使いのコンピューターにpip(Pythonのインストールパッケージ<など)がある場合には、これを開いて次を入力するだけです。
pip install -U selenium
これがない場合には、PyPIをダウンロードして解凍し、次を実行します。
python setup.py install
Seleniumがお使いのブラウザとやり取りするには、ドライバが必要となるのでご注意ください。こちらは主なブラウザ用ドライバのリンクです。是非ご利用ください。
Firefoxをブラウザの例として使ってみましょう。これを実行するにはまずFirefoxを開き、Yahooなどのウェブページにアクセスし、「seleniumhq」を検索してから、ブラウザを閉じます。こちらがコードに表示されるものです:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get('http://www.yahoo.com')
assert 'Yahoo' in browser.title
elem = browser.find_element(By.NAME, 'p') # Find the search box
elem.send_keys('seleniumhq' + Keys.RETURN)
browser.quit()
手順2:サポート用パッケージをインポート
Seleniumは個別に使用されるわけではなく、たとえばPanda(オープンソースデータ分析ツールを使用するためのツール)などの他のプログラムと協力して機能します。これを実行するには、次を入力します:
from selenium import webdriver
import time
import pandas as pd
手順3:変数の定義
この手順では、ターゲットフォルダ、検索クエリ、ターゲットサイトを定義します。この例では、LinkedInに公開されている競合他社のさまざまな採用情報をマッピングすることを目的としています。入力は次のようになります。
FILE_PATH_FOLDER = 'F:....Competitive_Analysis'
search_query = 'https://www.linkedin.com/q-chief-financial-officer-jobs.html'
driver = webdriver.Chrome(executable_path='C:/.../chromedriver_win32/chromedriver.exe')
job_details = []
手順4:HTMLタグ検査
HTMLサイトには通常、指定するターゲットサイトに表示される情報に関連付けられるそれぞれのタグに独特の識別子があります。この技術では、ターゲットサイトをすぐにクローリングするためにこのHTMLサイトを適切に活用します。これを実行するには:
- ページ上の任意の場所を右クリックし、「検査」を押します
- 続いて、左上に表示される矢印をクリックするか、またはCtrl+Shift+Cキーを押して特定の要素を検査し、希望するHTMLタグを取得します
このように表示されます:
driver.get(search_query)
time.sleep(5)
job_list = driver.find_elements_by_xpath("//div[@data-tn-component='organicJob']")
手順5:特定のデータポイント抽出
Seleniumウェブドライバの「find_elements_by_xpath」属性を使用してターゲットとするデータポイントを抽出し、ターゲットデータが収集されてからブラウザを閉じます。
次のようなデータポイントをターゲットにします。
- 職種
- 会社概要
- 勤務地
- 職務内容
- 求人日時が更新されました
このように表示されます:
for each_job in job_list:
# Getting job info
job_title = each_job.find_elements_by_xpath(".//h2[@class='title']/a")[0]
job_company = each_job.find_elements_by_xpath(".//span[@class='company']")[0]
job_location = each_job.find_elements_by_xpath(".//span[@class='location accessible-contrast-color-location']")[0]
job_summary = each_job.find_elements_by_xpath(".//div[@class='summary']")[0]
job_publish_date = each_job.find_elements_by_xpath(".//span[@class='date ']")[0]
# Saving job info
job_info = [job_title.text, job_company.text, job_location.text, job_summary.text, job_publish_date.text]
# Saving into job_details
job_details.append(job_info)
driver.quit()
上記のセレクターはターゲットに応じて変更されることがあるため、問題のセレクターが正しいことを必ず確認し、事前に正しいと仮定しないでください。
手順6:出力の準備にデータを保存
この時点では次に示すように、データフレームに列を追加し、「to_csv」属性を使用して取得したすべてのデータをCSV形式で保存します。
job_details_df = pd.DataFrame(job_details)
job_details_df.columns = ['title', 'company', 'location', 'summary', 'publish_date']
job_details_df.to_csv('job_details.csv', index=False)
必要なCSVファイルは次の場所からダウンロードできます。 FILE_PATH_FOLDER
これで、Seleniumを活用した最初のウェブスクレイピングジョブを正しく完了しました。
Seleniumとプロキシを統合する
Seleniumにプロキシを統合することで、次のようなことができます。
- 多様なジオロケーションでデータ収集を実行する
- ブロックされるリスクなしでデータを大規模に収集できるようになります(「過剰な数」の同時/連続リクエストを送信するIPのレート制限など)。この場合、専用のウェブアンブロックサービスも併せてご覧ください。
- 実際のユーザーIPの視点からデータを収集することができるため、警戒心の強いターゲットサイトからミスリードされた情報を提供されることはありません
Bright Dataのダッシュボードにアクセスし、「ゾーンを作成」をクリックします。「ネットワークタイプ」を選択し、「保存」をクリックします。次に、Seleniumにアクセスし、「setProxy」機能の「プロキシIP:ポート」に入力します。たとえば、HTTPとHTTPSの両方でzproxy.lum-superproxy.io:22225。
「sendKeys」入力ではユーザーのBright DataアカウントIDを入力し、プロキシゾーン名(lum-customer-CUSTOMER-zone-YOURZONE)を入力します。ゾーンのパスワードはゾーン設定で見つかります。
クレジットカードは必要ありません