釣り情報サイト(https://anglers.jp/)から富山湾の釣り場情報をスクレイピングする.
スクレピングとは,Webサイトから大量の情報を字と動的に抽出するコンピュータソフトウェア技術.
Webスクレイピングは、Webサイトやデータベースを探り、大量のデータの中から特定のデータのみを自動で抽出することができる.
Python 3.11 64bitで行う.(他でも可)
seleniumはバージョン4を用いる。
まず、ChromeDriverをインストールする.自身のGoogleChromeのバージョンを確認し,それに合ったバージョンをインストールする. (https://chromedriver.chromium.org/downloads)。
seleniumをインストールする.バージョン3でもよいが,プログラムの書き方が異なる.
<pythonのとき> pip install selenium <notebookのとき> !python -m pip install selenium
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
インストールしたchromedriver.exeの場所を指定する.
driver_path = "chromedriver-win64/chromedriver.exe" service = Service(executable_path=driver_path)
driver1 = webdriver.Chrome(service=service, options=options) driver1.implicitly_wait(10)
url = "https://www.google.com/search?q=%E9%87%A3%E3%82%8A&oq=%E9%87%A3%E3%82%8A&gs_lcrp=EgZjaHJvbWUqCQgAEEUYOxiABDIJCAAQRRg7GIAEMgYIARAjGCcyBggCECMYJzINCAMQABiDARixAxiABDINCAQQABiDARixAxiABDINCAUQABiDARixAxiABDIGCAYQRRg9MgYIBxBFGD3SAQgxMTIxajBqNKgCALACAA&sourceid=chrome&ie=UTF-8" driver1.get(url)
link = driver1.find_elements(By.XPATH, '//span/a/h3') for i in link: print(i.text)
all = driver1.find_element(By.XPATH, '/html/body/main/div[2]/div[4]/div[1]/div[1]/div[1]/a')
driver1.execute_script('arguments[0].click();', all)
要素をクリックする.ここでall.click()としてもよいが,クリック場所が画面外の場合に要素をクリックすることができずエラーになることがある.
link = driver1.find_elements(By.XPATH, '/html/body/main/div/div/div[3]/div/a')
syousai = []
for i in range(len(link)):
driver1.execute_script('arguments[0].click();', link[i])
kikan = driver1.find_element(By.XPATH, '/html/body/main/div/div/div[2]/div[1]/div[2]/dl')
syousai.append(kikan.text)
driver1.back()
link = driver1.find_elements(By.XPATH, '/html/body/main/div/div/div[3]/div/a')
取得した情報をデータフレームに入れる
import pandas as pd
kirei = syousai[0].replace('\u3000', '').split('\n')
syousai_df = pd.DataFrame([{'1' : kirei[i*2], '2' : kirei[i*2+1]} for i in
range(int(len(kirei)/2))])