リオラボ
icon

④Pythonで複数ページをまとめてスクレイピングする方法を解説【サンプルコード】

このブログではPythonを使ったスクレイピングを、初心者向けにサンプルコード付きで解説しています。以下に紹介する記事では、①から⑨のステップでスクレイピングの方法を学び、実践に役立てられるよう体系的にまとめています。

【①〜⑨まとめ】PythonでWebスクレイピングを実践する方法【サンプルコード付き】

【①〜⑨まとめ】PythonでWebスクレイピングを実践する方法【サンプルコード付き】

Posted on 9月 29, 2024 | Category: Python

このブログではPythonスクレイピングを初心者向けに解説していきます。順番に各記事で解説しており入門者向けです。サンプルコード付きで解説するので実践的…


最初の記事ではBeautifulSoup(Requests)を使ったスクレイピングの基本について解説しました。

また、こちらの記事では各要素を取得する方法について解説しましたが、いずれも一つのページをスクレイピングする方法です。

実際のところ複数のページをまとめてスクレイピングしたい場合が多く、その方法について解説していきます。

 

単一のページをスクレイピングする場合のおさらい

 

ここでは簡単に記事のタイトルを取得しています。例では10記事のタイトルが取得できました。しかし1ページ目しか取得できていませんね。
また、ページ内に複数のリンクがある場合、そのリンク先内容も取得したいところ。

ここからは複数のページをまとめて処理する方法を説明していきます。

以下、2つのパターンで説明していきます。

 

パターン1:URLでページ数を指定してスクレイピング

ニュースサイトやブログなどで1ページ目、2ページ目、3ページ目・・・のようにページネーションがあり、それらのページをまとめて取得したい場合です。

トップページ:example.com
2ページ目:example.com&page=2
3ページ目:example.com&page=3

このようにページ数がURLのパラメータである場合、簡単に取得できます。

指定したページURLのデータを取得する

 

ここでは単一のページをスクレイピングする場合と同じように、そのページ内の記事タイトルを取得しています。そして追加したコードは以下の点です。

 

 

get_links_from_page()という関数を作成していますが、引数が1であればトップページ、2以降であれば{page_number}、つまり指定したページが表示されるということです。
fetch_article_titles(2)による出力結果は上記のように、2ページ目の内容が得られます。

これによりまずは指定したページの内容が取得できました。ただし現状では1ページづつの指定しかできないので、まとめて複数ページを処理できるようにします。

 

複数URLのデータをまとめて取得する

 

 

page_range という変数に、取得したいページ数を設定しています。この例では、3ページ分のリンクを取得することを指定しています。

 

 

for ループは、指定された範囲内の数値を順番に取り出して処理を行う構文です。
range(1, page_range + 1) は、1から page_range(この場合は3)までの数値のシーケンスを生成します。page_range + 1 としているのは、range() 関数が終了値を含まないため、3ページまでのループを実現するためです。
つまり、page_number には 1, 2, 3 の値が順に代入されます。

 

 

各ページ番号に対して fetch_article_titles(page_number) 関数を呼び出します。

 

先ほどのコードに関数をループさせる処理を加えています。これによりpage_rangeで指定したページ数だけをまとめて処理することができるようになりました。

出力結果は上記のように、1ページ目から3ページ目までの内容が得られます。とはいえ結果が出力(print)されただけなので、実際のところはCSVなどに保存したいところです。それについては以下の記事で解説します。

⑨PythonでスクレイピングしたデータをCSVファイルに書き出す方法を解説

⑨PythonでスクレイピングしたデータをCSVファイルに書き出す方法を解説

Posted on 9月 29, 2024 | Category: Python

このブログではPythonを使ったスクレイピングを、初心者向けにサンプルコード付きで解説しています。以下に紹介する記事では、①から⑨のステップでスクレイピ…


 

パターン2:ページの中から各リンクを見つけクリック先のコンテンツ内容を取得

ページの中に複数の不規則な遷移先URLがある場合です。例えば商品サイトの検索結果画面でアイテム1、アイテム2・・・とあって、各商品の内容を取得したい時ですね。
この場合、各アイテムのURLは不規則である場合が多いです。なのでまずは各アイテムのURLを取得し、その後で各URLの中身をスクレイピングすることになります。

スクレイピングするサイトを見てみると、ページ内に20のリンクがあります。
このページに表示されているタイトルや画像であればそのままスクレイピングできますが、リンクをクリックした先の情報が欲しいため、工夫が必要です。

 

指定ページから各リンク先を見つける

以下、順番に説明していきます。

 

urljoin: ベースURLと相対URLを組み合わせて完全なURLを生成するための関数です。

 

base_url: 相対URLを完全なURLに変換するために使用するベースURLです。
links: 記事の情報を格納するための空のリストです。
count: 記事のIDを管理するためのカウンタです。

 

webpage_soup.select(“.post-link”): post-linkクラスを持つすべての<a>タグを取得します。
if a_tags:: a_tagsが空でないか確認します。
for a_tag in a_tags:: 各a_tagをループ処理します。
href = a_tag.get(‘href’): href属性を取得します(相対URL)。
href = urljoin(base_url, href): ベースURLと組み合わせて完全なURLを作成します。
title_div = a_tag.select_one(“.post-title”).text.strip(): 記事タイトルを取得し、前後の空白を削除します。

 

記事タイトル、URL、IDを含む辞書を作成し、linksリストに追加します。
countをインクリメントして次のIDに備えます。

 

この関数ではpost-linkクラスを持つすべての<a>タグを取得します。取得したリンクはIDと記事タイトルを付けて、辞書形式でリストに保存しています。今回のようにリンクが相対URLの場合、urljoinを使って完全なURLを作成しましょう。

この状態だとリンク一覧を取得しているだけなので、この後のコードで各リンクの内容を取得していきます。

 

各リンク先の内容をまとめて取得する

 

まず先ほど取得した各リンクをループさせ、後は単一のページで各要素を取得するのと同様の処理を実施します。
ここではリンク先に記事タイトル(h1タグ)しかありませんが、例えば商品ページであれば商品名、金額などを取得するように処理しましょう。

 

find_links関数を実行し、その戻り値をlinksに格納します。そしてlinksから各リンクのURLだけを抽出します。

 

url_list内の各URLに対してループを開始します。

 

アイテム内容を取得し、リストに格納します。

 

fetch_item_datas関数を実行し、その結果を表示します。これにより、各ページから取得したアイテム内容が出力されます。

このように処理することで、ページ内にある各リンクを取得し、その後リンク先の内容をまとめて取得することができます。これであればURLが不規則な場合でも問題なく処理できます。

まとめ

この記事では、複数のページをまとめてスクレイピングする方法を解説しました。
ニュースサイトの記事をまとめて取得したり、ショッピングサイトの各商品データを一括で取得する際などに利用できます。