Web スクレイピング は、Web サイトからデータを収集するための強力なツールです。製品レビューの収集、価格の追跡、あるいは私たちの場合は Goodreads 書籍のスクレイピングなど、Web スクレイピングはデータ駆動型アプリケーションに無限の機会を提供します。
このブログ投稿では、Web スクレイピングの基礎、Python BeautifulSoup ライブラリの能力を探り、Goodreads Choice Awards データをスクレイピングするために設計された Python スクリプトを詳しく説明します。最後に、さらなる分析や応用のためにこのデータを CSV ファイルに保存する方法について説明します。
Goodreads とは何ですか?
Goodreads は、読者と書籍の推奨のための世界最大のプラットフォームです。ユーザーは書評、著者詳細、人気ランキングにアクセスできます。 Goodreads は毎年、読者がフィクション、ファンタジー、ロマンスなどのさまざまなジャンルでお気に入りの本に投票する Goodreads Choice Awards を主催しています。このため、Goodreads は、話題の本や著者に関する洞察を収集するための Web スクレイピングの理想的なターゲットになります。
Web スクレイピングには、自動化された方法で Web サイトからデータを抽出することが含まれます。これにより、次のようなタスクの情報を収集して構造化できます。
スクリプトに入る前に、必要なライブラリをインストールする必要があります。
Python をインストールします
システムに Python がインストールされていることを確認してください。
必要なライブラリをインストールします
pip を使用して必要なライブラリをインストールします。
pip install beautifulsoup4 pip install requests
リクエスト: HTTP リクエストを URL に送信し、Web ページのコンテンツを取得できるようにします。
BeautifulSoup: HTML の解析とデータ抽出を簡素化します。
これらのインストールが完了したら、スクレイピングの準備は完了です!
BeautifulSoup は、HTML および XML ドキュメントを解析するための Python ライブラリです。これにより、開発者はページ構造をナビゲートし、コンテンツを抽出し、生の HTML を構造化フォーマットに変換できます。
BeautifulSoup の主要なメソッド
スクリプトで使用する重要なメソッドをいくつか示します:
メソッドの完全なリストについては、BeautifulSoup のドキュメントを参照してください。
必要なライブラリをインポートし、ブラウザを模倣するカスタム ヘッダーを定義することから始めましょう。これにより、Web サイトによるブロックを回避できます。
pip install beautifulsoup4 pip install requests
まず、Goodreads’ Choice Awards ページとメイン アプリケーションの URL を定義します。 start_url にリクエストを送信し、Web ページのコンテンツを取得します。
from bs4 import BeautifulSoup as bs import requests import re import csv HEADERS = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64)...", "Accept-Language": "en-US, en;q=0.5", }
各カテゴリには、ジャンルとそれぞれのページへのリンクが含まれています。 Soup.select を使用して、.category クラスの下にリストされているすべてのカテゴリを抽出します。
次に、各カテゴリを繰り返し処理して、ジャンル名とそのページ URL を取得します。
app_url = "https://www.goodreads.com" start_url = "https://www.goodreads.com/choiceawards/best-books-2024" res = requests.get(start_url, headers=HEADERS) soup = bs(res.text, 'html.parser') categories = soup.select('.category')
ここでは、さらなる処理のためにカテゴリ名 (ジャンル) とカテゴリ ページの URL を抽出します。
各 category_url に別のリクエストを送信し、そのカテゴリの下にあるすべての書籍を見つけます。
for index, category in enumerate(categories): genre = category.select('h4.category__copy')[0].text.strip() url = category.select('a')[0].get('href') category_url = f"{app_url}{url}"
category_books には、それぞれのカテゴリにあるすべての書籍のリストが含まれます。
書籍のリストを取得したら、各書籍を反復処理してデータを抽出します。
投票を抽出
res = requests.get(category_url, headers=HEADERS) soup = bs(res.text, 'html.parser') category_books = soup.select('.resultShown a.pollAnswer__bookLink')
DOM を見ると、category 要素の親要素に投票数が存在します。したがって、find_parent メソッドを使用して要素を見つけて投票数を抽出する必要があります。
本のタイトル、著者、画像の URL を抽出
for book_index, book in enumerate(category_books): parent_tag = book.find_parent(class_='resultShown') votes = parent_tag.find(class_='result').text.strip() book_votes = clean_string(votes).split(" ")[0].replace(",", "")
各書籍の URL、表紙画像 URL、タイトル、著者が抽出されます。
clean_string 関数は、タイトルが適切にフォーマットされていることを保証します。スクリプトの先頭で定義できます
book_url = book.get('href') book_url_formatted = f"{app_url}{book_url}" book_img = book.find('img') book_img_url = book_img.get('src') book_img_alt = book_img.get('alt') book_title = clean_string(book_img_alt) print(book_title) book_name = book_title.split('by')[0].strip() book_author = book_title.split('by')[1].strip()
書籍の詳細をさらに抽出
評価、レビューなど、書籍に関する詳細を取得するには、別のリクエストを book_url_formatted に送信します。
def clean_string(string): cleaned = re.sub(r'\s+', ' ', string).strip() return cleaned
ここで get_rateds_reviews は、適切にフォーマットされた評価とレビューのテキストを返します。
この関数はスクリプトの先頭で定義できます。
pip install beautifulsoup4 pip install requests
各書籍の詳細ページに移動すると、評価、レビュー、詳細な説明などの追加情報が抽出されます。ここでは、本の説明要素が存在するかどうかもチェックし、存在しない場合はスクリプトが失敗しないようにデフォルトの説明を追加します。
from bs4 import BeautifulSoup as bs import requests import re import csv HEADERS = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64)...", "Accept-Language": "en-US, en;q=0.5", }
ここでは、著者の詳細、出版情報、その他のメタデータも収集しています。
本の辞書を作成する
書籍から抽出したすべてのデータを辞書に保存しましょう。
app_url = "https://www.goodreads.com" start_url = "https://www.goodreads.com/choiceawards/best-books-2024" res = requests.get(start_url, headers=HEADERS) soup = bs(res.text, 'html.parser') categories = soup.select('.category')
この辞書を使用して、csv ファイルにデータを追加します。
Python の標準ライブラリの一部である csv モジュールを使用します。したがって、別途インストールする必要はありません。
まず、これが最初のエントリかどうかを確認する必要があります。このチェックは、CSV ファイルの最初の行にヘッダーを追加するために必要です。
for index, category in enumerate(categories): genre = category.select('h4.category__copy')[0].text.strip() url = category.select('a')[0].get('href') category_url = f"{app_url}{url}"
ここでは、ヘッダー エントリを含む新しい CSV ファイルを作成する mode="w" を使用しています。
後続のすべてのエントリについて、データを CSV ファイルに追加します。
res = requests.get(category_url, headers=HEADERS) soup = bs(res.text, 'html.parser') category_books = soup.select('.resultShown a.pollAnswer__bookLink')
mode="a" はデータを CSV ファイルに追加します。
さあ、スクリプトの実行中、座ってリラックスして、コーヒー ☕️ を飲みながらお楽しみください。
完了すると、最終的なデータは次のようになります:
完全なソース コードは、この github リポジトリで見つけることができます。
Python と BeautifulSoup を使用して Goodreads データをスクレイピングする方法を学びました。基本的なセットアップから CSV ファイルへのデータの保存に始まり、スクレイピング プロセスのあらゆる側面を調査しました。スクレイピングされたデータは次の用途に使用できます:
Web スクレイピングは、クリエイティブなデータ分析とアプリケーションの可能性を広げます。 BeautifulSoup のようなライブラリを使用すると、複雑なスクレイピング タスクも管理可能になります。スクレイピング中は倫理慣行に従い、ウェブサイトの利用規約を尊重することを忘れないでください!
以上がPython と BeautifulSoup を使用して Goodreads からデータをスクレイピングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。