WEBから情報を得る(WEB SCRAPING)忘備録
今回はWEBスクレ―ピングで情報をとる方法をメモリます。これは2024年12月28日時点での情報です。Ubuntu24.04にて実施してます。requestsでHTTPでGETするだと、JavaScriptでスクロールするごとに新しい情報が追加されるようなサイトもあるためある程度それに対応するため初めから対応を見込んでSeleniumで情報をとり、Beautiful Soupで取ったHTML情報の解析を考慮します。最近ではLLMで解析できてしまうため現在ではBeautiful SOupは明らかに不要なTAGをそぎ落として、あるいは必要な部分だけ摘出してLLMへの入力トークンを小さくするためだけに使うことが多くなってます。今回はとりあえずHTMLデータを取ってくるとこまでメモリます。(必要になったらまたBSでの情報整理とLLMへの入力解析の記事を書こうと思います。)
- Chromeをインストール(現時点では131が安定版では最新のよう)
# wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
# apt install ./google-chrome-stable_current_amd64.deb
# google-chrome --version
Google Chrome 131.0.6778.204
- Driverのインストール
https://googlechromelabs.github.io/chrome-for-testing/#stable
から安定版でダウンロードしました
# wget https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.108/linux64/chromedriver-linux64.zip
# apt install unzip
# unzip chromedriver-linux64.zip
# cd chromedriver-linux64
# cp chromedriver /usr/bin/
# chmod +x /usr/bin/chromedriver
# # chromedriver --version
ChromeDriver 131.0.6778.108 (3b014839fbc4fb688b2f5af512d6ce312ad208b1-refs/branch-heads/6778@{#2393})
ここからPYTHON環境の構築とその中でのライブラリインストールを実施します
- PYTHON仮想環境設定
# python3 -m venv webscrape
# source webscrape/bin/activate
- 必要ライブラリのインストール
(webscrape) # pip install selenium webdriver-manager
(webscrape) # pip install beautifulsoup4 lxml
- テスト
実際に動かすときは対象のサイトのオーナー、パートナーからの開発(勤め先や顧客やクライアントなど)、開発テストのための許可をもらうことを想定してます。まったく関係のないURLからスクレ―ピングするときは十分注意が必要です。
その場合まず、robots.txtの確認をします。(SCRAPINGを禁止している場合もあるので注意が必要です。また禁止してなくても極端な負荷をかけると問題になります。)
たとえばこのZENNの場合は
以下のよう。
User-agent: Yahoo Pipes 1.0
Disallow: /
User-agent: 008
Disallow: /
User-agent: voltron
Disallow: /
User-agent: Bytespider
Disallow: /
User-agent: Livelapbot
Disallow: /
User-agent: Megalodon
Disallow: /
User-agent: ia_archiver
Disallow: /
Sitemap: https://zenn.dev/sitemaps/_index.xml
とりあえず、ChormeDRIVERでは大丈夫そう
一応利用規約も確認(対象とするサイトに同様の事項があれば必ず確認ください)
https://zenn.dev/terms
その上で、HTMLを持ってきて、保存する。
(実際には許可をもらった別の対象ページからHTML持ってきて、Beautiful Soupで不要部分そぎ落としてLLMに解析させる使用方法を想定します。)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
# Seleniumの設定
options = webdriver.ChromeOptions()
options.add_argument("--headless") # ヘッドレスモード(UIを表示しない)
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
# ChromeDriverのパスを指定してWebDriverを起動
driver = webdriver.Chrome(options=options)
def get_full_page_html(url):
try:
driver.get(url)
time.sleep(2) # ページの初期ロードを待機
# ページの高さを取得してスクロールを開始
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# ページの一番下までスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # コンテンツのロードを待機
# 新しい高さを確認
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
# スクロールで高さが変わらなければ終了
break
last_height = new_height
# ページのHTMLを取得
html = driver.page_source
return html
except Exception as e:
print(f"エラーが発生しました: {e}")
finally:
driver.quit()
# URLを指定
url = "https://yourallowed.homepage.com/" # 対象のURLを設定(適宜変えてください)
html_content = get_full_page_html(url)
# 結果をファイルに保存(任意)
with open("your_contents.html", "w", encoding="utf-8") as file:
file.write(html_content)
print("HTMLを保存しました。")
HTMLが保存されてました。相対リンクなどは当然機能しませんが、通常のサイトですとそこそこ必要な情報はとれそうです。(LLMでRAGなどの情報元として使うとなかなかいいかもしれません。)
Discussion