技術雑記帳兼日記帳

AWS、Python、Terraformの使い方をコッソリ

python スクレイピング その4

はじめに

今回はseleniumSlashdotを開いて、ブラウザを操作して結果を表示するプログラムを書いてみた。

準備

最初にpipで以下をインストールしておく。

$ pip install selenium
$ pip install chromedriver
$ pip install chromedriver-binary==90.0.4430.93

※chromedriver-binaryは自分の環境のバージョンを記載。

  • sele.py
from selenium import webdriver
from bs4 import BeautifulSoup
import time

url = 'https://srad.jp/'
keyword = 'Linux'

driver = webdriver.Chrome(executable_path="chromedriverのパス")
driver.get(url)

search = driver.find_element_by_name("fhfilter")
search.send_keys(keyword)
search.submit()

soup = BeautifulSoup(driver.page_source, "html.parser")
results = soup.find_all("h2", attrs={"class": "story"})

for i, result in enumerate(results):
    tag = result.find("a")
    print("%d: %s : %s" % (i + 1, tag.get_text(), "https:"+tag["href"]))

driver.quit()
  • 実行方法と結果
$ python sele.py 
1: Windows 10 Insider Preview ビルド21376、WSLのLinux GUIアプリサポートで発生していた問題を解決 : https://linux.srad.jp/story/21/05/08/0455217/
2: Vine Linuxの現状は?(追記: リリース版終了が宣言される) : https://linux.srad.jp/story/21/05/04/0459248/
3: Windows 10 Insider PreviewのLinux GUIアプリ実行サポート、現時点ではHaswell世代以降のCPUが必要 : https://linux.srad.jp/story/21/04/29/0430220/
4: ミネソタ大研究者、研究のためとしてLinuxカーネルに意図的に脆弱性コードをコミット : https://linux.srad.jp/story/21/04/25/1954223/
5: M1 Mac正式対応のOS仮想化ソフト「Parallels Desktop 16.5」が公開 : https://linux.srad.jp/story/21/04/19/0129216/
6: SCO Linux FUDは滅びぬ、何度でも蘇るさ! : https://linux.srad.jp/story/21/04/04/1616223/
7: FSF運営チーム、執行役員をはじめ3名が辞任へ : https://opensource.srad.jp/story/21/04/03/0837231/
8: Linux Foundation、Linux 30周年記念ロゴ画像を公開 : https://linux.srad.jp/story/21/03/21/058252/
9: 7-Zip 20.01 alpha、Linuxに対応 : https://linux.srad.jp/story/21/03/16/1622251/
10: 火星の空飛ぶLinux : https://linux.srad.jp/story/21/03/11/1655218/
11: Linux 5.12 rc2、重大なバグ修正のため予定より数日早くリリース : https://linux.srad.jp/story/21/03/07/0039241/
12: Linus Torvalds、6日間の電源喪失を切り抜ける : https://linux.srad.jp/story/21/03/02/1653247/
13: アップデート適用が進まないLinux Mint、より多くのユーザーに迅速なアップデート適用を実行してもらうための改善計画 : https://linux.srad.jp/story/21/02/28/1940228/
14: M1 Mac上でUbuntuデスクトップの起動に成功との発表。ネットワーク機能も動作可能 : https://linux.srad.jp/story/21/01/24/1511237/
  • 注意

sele.py を実行しても、Chromeのバージョンとドライバのバージョンが違うと動かない。
下記でバージョン一覧が取れるのでChromeのバージョンが90版台なら、chromedriver-binaryも同じ番号帯を選んで再インストールする。

$ pip install chromedriver-binary==
  • 簡単な解説

executable_pathは未指定でも良いらしいが自分の環境だとNGだったので指定している。

from selenium import webdriver
from bs4 import BeautifulSoup
import time

url = 'https://srad.jp/'
keyword = 'Linux'

driver = webdriver.Chrome(executable_path="chromedriverのパス")
driver.get(url)

「fhfilter」が検索ボックスでそこにsend_keys()でキーワードを送信してsubmit()している。

search = driver.find_element_by_name("fhfilter")
search.send_keys(keyword)
search.submit()

「driver.page_source」でまるっと結果を取得している。
その結果をBeautifulSoupで解析して、enumerateで回して表示している。
題名はaタグの内容をget_text()で取得し、アトリビュートのhrefを取得して表示している。

soup = BeautifulSoup(driver.page_source, "html.parser")
results = soup.find_all("h2", attrs={"class": "story"})

for i, result in enumerate(results):
    tag = result.find("a")
    print("%d: %s : %s" % (i + 1, tag.get_text(), "https:"+tag["href"]))

driver.quit()

まとめ

forの表示は最初はダラダラ3行くらい書いてたけど、今の書き方のほうがスッキリして良い。
この癖を付けていきたい。