前回の記事では、Pythonを使ったスクレイピングの基本を学び、ウェブからのデータ取得の基礎を身につけました。しかし、現代のプログラミングにおいて、APIが提供されている場合には、APIを利用することで、より効率的で正確なデータ取得が可能です。
ただし、APIが提供されていない場合や、特定の動的コンテンツ(例:JavaScriptで生成されたデータ)を取得する必要がある場合には、スクレイピングが非常に有効です。
今回は、ChatGPTと共にAPI学習を進めつつ、必要に応じてJavaScriptで生成されたデータや、ログインが必要なサイトのデータを取得するスクレイピング技術に挑戦していきます。この技術を習得することで、APIとスクレイピングの両方を効果的に使い分け、さらに効率的で強力なデータ取得方法を身につけることができるでしょう。
今回の目標は、Javascriptで生成されたデータの取得、ログインが必要なサイトのデータの取得を目指していきます。
APIがあればAPIを使い、必要に応じてスクレイピングを補完的に利用するのが賢明です。
APIとスクレイピングの違い
APIの優位性
APIを使うと、データを効率的かつ信頼性高く取得できます。APIは公式に提供されているため、正確で一貫性のあるデータが手に入り、ページ全体を読み込む必要がないため処理が速くなります。また、法的なリスクも低く、データが構造化されているため扱いやすいです。APIが利用できる場合は、スクレイピングよりも優先して使うべきです。
スクレイピングの役割
一方で、APIがない場合や制限がある場合、またはJavaScriptで生成された動的コンテンツを取得する際には、スクレイピングが必要になります。スクレイピングは、APIが提供されていないデータや、ログインが必要なサイトからデータを取得する際に役立ちます。
関連記事
事前準備(環境設定)
WebスクレイピングやAPI活用の分野では、JavaScriptによって動的に生成されるデータを取得する必要がますます高まっています。しかし、従来のスクレイピング手法ではこれらのデータにアクセスするのが難しい場合があります。Pythonの強力なツールを駆使すれば、この課題に対応することが可能です。本記事では、JavaScriptで動的に生成されるデータをPythonで効率的に取得するための環境設定について詳しく解説します。初めての方でも安心して進められるよう、必要なライブラリのインストールから具体的な設定手順までを丁寧に紹介します。
Webスクレイピングツールの選定
- Selenium: JavaScriptで動的に生成されるページを処理するには、ブラウザ自動化ツールであるSeleniumを使用します。Seleniumは、ブラウザを自動で操作して、完全にレンダリングされたページのソースやデータを取得することができます。
- Playwright: Seleniumの代わりに、より新しいPlaywrightを使うことも考えられます。これも同様にブラウザを操作して動的コンテンツを取得できます。
- Requests-HTML: 簡単なケースでは、Requests-HTMLライブラリを使ってJavaScriptの実行後のHTMLを取得できます。
今回は、SeleniumとおまけではRequestsを使用していきます。
Seleniumのインストール手順
- コマンドプロンプトまたはターミナルを開く:
- Windowsではコマンドプロンプト、MacやLinuxではターミナルを開きます。
- Seleniumのインストールコマンドを実行:
1 |
pip install selenium |
このコマンドを実行すると、Seleniumの最新バージョンがインストールされます。
PIPのインストールは、仮想環境内で行いましょう。
関連記事
今までのコードが
1 2 3 4 5 6 7 8 9 10 11 |
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service import time # ChromeDriver のパスを指定 chromedriver_path = 'path_to_chromedriver' # 例: 'C:\\chromedriver.exe' service = Service(executable_path=chromedriver_path) # WebDriver を作成 driver = webdriver.Chrome(service=service) |
現在のコード
1 2 3 4 5 |
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() |
1 |
driver = webdriver.Chrome() |
この一行で済むようになったので、めっちゃ簡単にデータの収集ができるようになりました。
Seleniumを使った動的コンテンツのスクレイピング(ChromeDriverパス指定不要版)
目標
最新バージョンのSeleniumを使用して、動的に生成されるウェブページのデータを取得する方法を学びます。このバージョンでは、ChromeDriverのパス指定が不要となっています。
使用したニュースサイト
URL:https://news.ycombinator.com/news
APIがある時は基本的にはAPIを使用しましょう
URL:https://github.com/HackerNews/API
JavaScriptで生成されたデータの取得の問題点
通常のスクレイピングでは、サーバーから返されるHTMLコードからデータを直接取得しますが、JavaScriptで動的に生成されるコンテンツは、そのままでは取得できません。このような場合には、以下のような方法があります。
Selenium
を使用する:Selenium
は、ブラウザを自動操作してJavaScriptで生成されたコンテンツを取得できるツールです。
- APIを活用する:
- ウェブページがデータを取得する際に使用しているAPIを直接呼び出すことで、必要なデータを取得することができます。
具体例: Seleniumを使ってニュースサイトからタイトルを取得
- ChromeDriverのセットアップ:
- 最新バージョンのSeleniumとChromeDriverを使用する場合、パスの指定は不要です。Seleniumは環境変数に登録されているChromeDriverを自動的に検出します。
- Seleniumスクリプトを作成:
- 動的に生成されるコンテンツを含むウェブページにアクセスし、データを取得します。
ニュースサイトのタイトルを取得するスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from selenium import webdriver from selenium.webdriver.common.by import By import time # ChromeDriverのセットアップ(パス指定不要) driver = webdriver.Chrome() # 動的コンテンツを含むニュースサイトにアクセス driver.get('https://news.ycombinator.com/') # ページが完全に読み込まれるまで待機 time.sleep(5) # 記事タイトルを取得 titles = driver.find_elements(By.CLASS_NAME, 'title') for title in titles: print(title.text) # ブラウザを閉じる driver.quit() |
出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
DevTools listening on ws://127.0.0.1:56498/devtools/browser/4d4c5e47-02c5-4e72-a2d4-13c8447ac39d 1. Mourning and moving on: rituals for leaving a career (franceshocutt.com) 2. Designing my own watch (2020) (willem.com) 3. I've built my first successful side project, and I hate it (switowski.com) 4. A 20-part deep dive into how linkers work (2008) (lwn.net) 5. Celebrating 6 years since Valve announced Steam Play Proton for Linux (gamingonlinux.com) 6. SIMD Matters: Graph Coloring (box2d.org) 7. How to build a 50k ton forging press (construction-physics.com) 8. Code as Art (awwsmm.com) 9. Launch HN: Outerport (YC S24) – Instant hot-swapping for AI model weights 10. Euphemisms are best changed frequently (2016) (aeon.co) 11. Do low-level optimizations matter? Faster quicksort with cmov (2020) (cantrip.org) 12. I'm tired of fixing customers' AI generated code (medium.com/thetateman) 13. Euclid's Proof that √2 is Irrational (mathsisfun.com) 14. Self-Hosting DNS (ghostdev.xyz) 15. Why isn't Colorado's snowpack ending up in the Colorado River? (phys.org) 16. Turnstyle – An esoteric, graphical functional language (jaspervdj.be) 17. Rye and Uv: August Is Harvest Season for Python Packaging (pocoo.org) 18. Show HN: Handwriter.ttf – Handwriting Synthesis with Harfbuzz WASM (github.com/hsfzxjy) 19. If you can't code, remember this video (twitter.com/0xluffyb) 20. Mathematicians prove Hawking wrong about the most extreme black holes (quantamagazine.org) 21. Breaking down a record-setting day on the Texas grid (gridstatus.io) 22. Make Firefox Private Again (make-firefox-private-again.com) 23. Midjourney web experience is now open to everyone (midjourney.com) 24. Revisiting the Classics: Jensen's Inequality (2023) (francisbach.com) 25. US hospital told family their daughter had checked out when in fact she'd died (theguardian.com) 26. Meticulous (YC S21) is hiring to eliminate E2E UI tests 27. Google Play will no longer pay to discover vulnerabilities in Android apps (androidauthority.com) 28. Distributed Locks with Redis (2014) (redis.io) 29. Self-Supervised Learning for Videos (lightly.ai) 30. Webtoon Targets 170 Pirate Domains Through DMCA Subpoena (torrentfreak.com) More |
ログインが必要なサイトからデータを取得
Pythonでのログインとデータ取得注意点
学習する前に必ず読んでね
最近では多くのウェブサイトで2段階認証(二要素認証、2FA)が導入されており
これにより自動ログインやデータ取得が難しくなっています。
関連記事
セッション管理と認証
ログインが必要なウェブサイトにアクセスする場合、まずはユーザーとしてログインし、その後に保護されたコンテンツへアクセスします。これには、通常以下の手順が含まれます。
- ログインフォームに情報を送信:
- ユーザー名やパスワードをログインフォームに送信し、認証を行います。
- セッションを維持:
- サーバーから送られてくるセッションIDやクッキーを保持して、認証された状態を維持します。
- 保護されたページからデータを取得:
- 認証済みの状態で、保護されたページにアクセスしてデータを取得します。
Pythonでのログインとデータ取得の例
以下は、Pythonのrequests
ライブラリを使って、ログインが必要なサイトからデータを取得する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import requests # ログイン情報を設定 login_url = 'https://uta.pw/sakusibbs/' login_data = { 'username': 'JS-TESTER', 'password': 'ipCU12ySxI' } # セッションを開始 session = requests.Session() # ログインリクエストを送信 response = session.post(login_url, data=login_data) # ログイン成功を確認 if response.status_code == 200: print("ログイン成功") # 保護されたページにアクセス protected_url = 'https://uta.pw/sakusibbs/users.php?action=login&m=try' response = session.get(protected_url) # ページからデータを取得 if response.status_code == 200: print(response.text) else: print(f"データ取得に失敗しました: {response.status_code}") else: print(f"ログインに失敗しました: {response.status_code}") |
まとめ
今回の記事では、APIとスクレイピングの違いやそれぞれの役割について学びました。APIを使うことで、効率的で信頼性の高いデータ取得が可能であり、APIが提供されている場合にはそれを優先して利用すべきです。しかし、APIがない場合や特定の動的コンテンツを取得する必要がある場合には、スクレイピングが有効な手段となります。
特に、JavaScriptで生成されたデータやログインが必要なサイトのデータを取得する際には、Seleniumやrequestsライブラリを活用したスクレイピング技術が重要です。今回紹介した方法を活用することで、APIとスクレイピングを効果的に使い分け、あらゆるシナリオでデータ取得の技術を最大限に発揮できるようになります。
今後も、さらに高度なデータ取得手法や実践的なプロジェクトに取り組んでいきますので、引き続きご期待ください。
関連記事
Pythonを学びたい方はこちらの記事を参考にしてみてください
関連記事
プログラミング学習を進めているけれど、まだ副収入につなげられていない…そんなあなたへ!今こそ、学んだスキルを活かして副業に挑戦する絶好のチャンスです。プログラミングだけでなく、自分のスキルや商品をネットで販売する『ネットショップ』を開設してみませんか?
ネットショップを持つことで、自分の知識やスキルをより多くの人に届け、副収入を得ることが可能です。学んできたプログラミングを活かして、ショップのカスタマイズや運営も自由自在に行えますし、もし商品作成が難しい場合でも、デジタル商品やサービス提供など、いろんな選択肢があります。
このステップで一歩踏み出せば、今学んでいることが副収入に直結し、自分の時間をより有効に使うことができるはずです!一緒にネットショップを開設し、副業の第一歩を踏み出しましょう!
タイトルテキスト
プログラミングを学びたいけど、どこから始めたらいいのか分からない、自分に合っているか不安…そんな悩みを持っている方におすすめしたいのが、 無料相談 サービスです!
この無料相談では、あなたの現状や目標に合わせて、最適な学習プランを一緒に考えてくれます。どんなスキルが必要なのか、どうやって学習を進めると効果的かを具体的にアドバイスしてもらえるので、無駄なく効率的にスタートを切ることができます。
さらに、プログラミング学習には同じ目標を持つ 仲間 がいること、そして頼りになる メンター の存在がとても大きな支えになります。独学ではどうしてもつまずきやすい部分も、メンターがあなたの成長に合わせて親身にサポートしてくれるので、安心して学びを進められます。
まずは 無料相談 で、あなたに合ったプランを見つけて、スキルアップへの第一歩を踏み出してみませんか?今なら、迷っている方でも気軽に相談できるチャンスです!