このブログではPythonを使ったスクレイピングを、初心者向けにサンプルコード付きで解説しています。以下に紹介する記事では、①から⑨のステップでスクレイピングの方法を学び、実践に役立てられるよう体系的にまとめています。
【①〜⑨まとめ】PythonでWebスクレイピングを実践する方法【サンプルコード付き】
このブログではPythonスクレイピングを初心者向けに解説していきます。順番に各記事で解説しており入門者向けです。サンプルコード付きで解説するので実践的…
最初の記事では、BeautifulSoup(Requests)を使ったスクレイピングの基本について解説します。
以下で紹介するサンプルコードでは、指定したウェブサイトのURLからHTMLコンテンツを取得し、特定の要素を表示します。
ここではシンプルにページのタイトルだけを取得していますが、特定のタグやクラス名を指定することで他の要素をスクレイピングできます。
なお、ここで紹介するサンプルコードはあくまでコード自体を分かりやすく説明するためのものです。実際にスクレイピングしたいWebサイトのURLに置き換えて実施してください。
注意: 対象ウェブサイトの利用規約を確認しましょう。スクレイピングを禁止している場合や、過度なアクセスでサーバーに負荷をかけないようにしましょう。ウェブサイトのrobots.txtファイルにスクレイピングに関する制限が記載されていることが多いです。
目次
BeautifulSoupのインストール
BeautifulSoupはPythonのライブラリで、HTMLやXMLの解析を簡単に行えるツールです。BeautifulSoupはpipを使ってインストールできます。以下のコマンドでインストールします。
1 |
pip install beautifulsoup4 |
サンプルコード全文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import requests from bs4 import BeautifulSoup # 1. ウェブページをリクエストして、指定されたURLからデータを取得 url = 'https://scraping-for-beginner.herokuapp.com/ranking/' # 変数urlに対象のURLを代入 webpage_response = requests.get(url) # 2. コンテンツ属性を使用して、ウェブページのコンテンツを取得 webpage_content = webpage_response.content # 3. BeautifulSoupを使用して、取得したウェブページのコンテンツを解析可能な形式に変換 webpage_soup = BeautifulSoup(webpage_content, "html.parser") # 4. 特定の要素を取得(例:タイトル) title = webpage_soup.title.string print(f'ページタイトル: {title}') # 結果 ページタイトル: Webスクレイピング入門者のためのサイト |
BeautifulSoupを使ってページを取得する流れ
上記コードは、requestsとBeautifulSoupライブラリを使用して、指定されたウェブページのHTMLを取得し解析する流れを実現しています。
ここでは対象ウェブページのタイトルを取得して表示しています。
1 2 |
import requests from bs4 import BeautifulSoup |
・requests: ウェブページにHTTPリクエストを送信してデータを取得するためのライブラリです。
・BeautifulSoup: HTMLやXMLファイルを解析して操作しやすいオブジェクトに変換するためのライブラリです。
1. ウェブページをリクエストして、指定されたURLからデータを取得
1 2 |
url = 'https://scraping-for-beginner.herokuapp.com/ranking/' webpage_response = requests.get(url) |
・url = : 解析対象となるウェブページのURLを変数urlに代入しています。
・requests.get(url): 指定したURLに対してHTTP GETリクエストを送信し、サーバーからHTMLデータを受け取りますwebpage_responseには、リクエストに対するレスポンス(ウェブページのデータ)が格納されます。
2. コンテンツ属性を使用して、ウェブページのコンテンツを取得
1 |
webpage_content = webpage_response.content |
・webpage_response.content: ウェブページのHTMLコンテンツ全体をバイナリ形式で取得します。このバイナリデータを変数webpage_contentに格納しています。HTML全体をそのまま文字列として取得したい場合は.textを使用することもできますが、.contentはバイナリデータの処理に向いています。
3. BeautifulSoupを使用して、取得したウェブページのコンテンツを解析可能な形式に変換
1 |
webpage_soup = BeautifulSoup(webpage_content, "html.parser") |
・BeautifulSoup(webpage_content, “html.parser”): 取得したHTMLコンテンツをBeautifulSoupで解析できる形式に変換します。html.parserはPythonに標準で搭載されているHTMLパーサーで、HTML文書を解析するために使用されます。webpage_soupには解析されたHTMLの構造が格納され、Pythonオブジェクトとして扱うことができます。
4. 特定の要素を取得(例:タイトル)
1 2 3 |
title = webpage_soup.title.string print(f'ページタイトル: {title}') # 結果 ページタイトル: Webスクレイピング入門者のためのサイト |
・webpage_soup.title.string: BeautifulSoupで解析されたHTML文書の中から、<title>タグの内容を取得します。<title>タグは、通常ブラウザのタブやウィンドウのタイトルバーに表示されるウェブページの名前が格納されているタグです。.stringを使うことで、そのタグ内のテキスト部分のみを抽出します。
・print(f’ページタイトル: {title}’): f文字列(f-string)を使用して、取得したページタイトルを出力します。title変数に格納されたページのタイトルをページタイトル:というテキストと一緒に表示します。
他の要素を取得したい場合
例えばショッピングサイトであれば商品名、価格、説明文などを取得したいかと思います。
webpage_soup変数には、ウェブサイトのHTMLコンテンツが取得されています。あとはそこから自身が欲しいデータを指定してあげればいいということになります。
ウェブサイトをChromeなどで検証することでHTML構造が確認できますが、例えば見出しがh2タグだったとします。
その場合、以下のようにすることでページにある全ての見出しをセレクトすることができます。他にもクラス名を指定したり、最初の要素だけを取得することができます。
1 2 |
h2_tags = webpage_soup.select("h2") print(h2_tags) |
特定の要素を取得する方法については以下の記事で詳しく解説しています。
4つのステップでひとまずWebサイトのタイトルを取得できた
上記の4ステップでひとまずウェブサイトのタイトルを取得できました。簡単な流れは以下の通りです。
・requests.get()で指定されたURLからHTMLデータを取得
・webpage_response.contentで取得したHTMLコンテンツをバイナリ形式で保存
・BeautifulSoupを使用して、HTMLを解析可能な形式に変換
・webpage_soup.title.stringで、HTML内の<title>タグの内容を取得し、ページタイトルを出力
今回はウェブサイトのURLからHTMLコンテンツを取得し、<title>タグの内容を出力しました。とりあえずこれでスクレイピングができたことになります。
次回からの記事で解説しますが、あとは今回のコードをベースに実際に取得したい内容、例えばページのタイトルや説明文、画像などを取得し、それをCSVファイルなどに保存していけばいいということです。
Requestsを使ったスクレイピングですが、シンプルなデータ取得であれば今回のように簡単に実現が可能です。これをベースに取得内容を増やしていきましょう。
ただしウェブサイトがjavaScriptで動的に生成される場合、Seleniumが必要になります。Seleniumについては以下の記事で解説しています。
②【Python】Seleniumを使ったスクレイピングの基本を解説【サンプルコード】
このブログではPythonを使ったスクレイピングを、初心者向けにサンプルコード付きで解説しています。以下に紹介する記事では、①から⑨のステップでスクレイピ…