質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

【python3 スクレイピング】ページネーションも全て含めて、最下層のURLを取得し、指定した情報を取得したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 678
退会済みユーザー

退会済みユーザー

前提・実現したいこと

python初心者です。
今回、pythonを用いてスクレイピングを実装しようとしたところ、つまづきました。

https://www.judo-ch.jp/sekkotsuinsrch/

上記のサイトの最下層ページ(例:https://www.judo-ch.jp/sekkotsuinsrch/13/13111/030318/)を全て取得し、下記2つの項目を取得したいです。

・会社名(<span class="name"></span>)
・URL(<span class="name"></span>)

最終的にはcsvファイルに出力します。
(今回の質問は、CSVファイルに出力する前の段階です。)

質問の内容

【機能1】最下層ページの一覧情報が記載されているページの取得
(例:https://www.judo-ch.jp/sekkotsuinsrch/01/list/2/)

【機能2】下層ページ(上記のURL)から最下層ページ情報の取得

それぞれ別のコードで書いた段階では、問題なく動作しました。
しかし、【機能1】と【機能2】を繋ぎ合わせたコードを書いたのですが、何も出力されませんでした。

【機能1】のコード→問題なく動作
from bs4 import BeautifulSoup
import sys
import time
import requests
import re
time.sleep(2.0)

num = 2
i = 1
r = str(i).zfill(2)

while i < 47:
    url = 'https://www.judo-ch.jp/sekkotsuinsrch/' + str(r) + '/list/' + str(num) + '/'
    res = requests.get(url)
    if res.status_code == 200:
        print(url)
        num += 1
    else:
        i += 1
【機能2】のコード→問題なく動作
url = 'https://www.judo-ch.jp/sekkotsuinsrch/13/list/2/'
res = requests.get(url)
soup = BeautifulSoup(res.text,'lxml')
links = soup.findAll('a', class_="fa_name")
for link in links:
   print(link.get('href'))
【機能1】+【機能2】→何も出力されない
from bs4 import BeautifulSoup
import sys
import time
import requests
import re
time.sleep(2.0)

num = 2
i = 1
r = str(i).zfill(2)

while i < 47:
    url = 'https://www.judo-ch.jp/sekkotsuinsrch/' + str(r) + '/list/' + str(num) + '/'
    res = requests.get(url)
    if res.status_code == 200:
        soup = BeautifulSoup(res.text,'lxml')
        links = soup.findAll('a', class_="fa_name")
        for link in links:
           print(link.get('href'))
        num += 1
    else:
        i += 1

また、上記をクリアしたら、最後に【機能3】を追加する予定です。

【機能3】最下層ページから「会社名」と「URL」を取得→問題なく動作
def get_soup(url):
    """URLのSoupを取得する"""
    html = requests.get(url)
    return BeautifulSoup(html.content, "html.parser")

def scraping_gh():
    """Software Design の情報を取得"""
    soup = get_soup("https://www.judo-ch.jp/sekkotsuinsrch/13/13201/030637/")

    # 整骨院の名称
    res_p = soup.find("span", class_="name")
    res = res_p.find(text=re.compile(""))
    print(res.string)
    # ホームページのURL
    res_p = soup.find("p", class_="lnk_url")
    res = res_p.find(text=re.compile(""))
    print(res.string)
scraping_gh()

試したこと

while i < 47: → for i in range(47):
とやってみたり、わかる範囲で色々やりましたがダメでした。

【機能1】と【機能2】を組み合わせるフェーズで、どこが間違っているか教えていただけると幸いです。
どうぞ、よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

下記で解決しました。

import sys
import requests
import re
import urllib.request, urllib.error
from bs4 import BeautifulSoup


i = 1
num = 2
while i < 48:
    for num in range(1, 300):
        zero_i = str(i).zfill(2)
        base = 'https://www.judo-ch.jp/sekkotsuinsrch/{}/list/{}/'
        url = base.format(zero_i,num)
        res = requests.get(url)
        if res.status_code == 200:
            html = requests.get(url)
            soup = BeautifulSoup(html.content,"html.parser")
            for tag in soup.find_all("h3","shisetsu_name_s"):
                link = tag.find("a")
                url = link.get("href")
                html = requests.get(url)
                get_soup = BeautifulSoup(html.content, "html.parser")
                res_p = get_soup.find("p", "lnk_url")
                if res_p is not None:
                    print(res_p.text)
                res_p = get_soup.find("span", "name")
                if res_p is not None:
                    print(res_p.text)
                res_p = get_soup.find("dd", "name")
                if res_p is not None:
                    print(res_p.text)
            for s_tag in soup.find_all("h3","shisetsu_name"):
                s_link = s_tag.find("a")
                s_url = s_link.get("href")
                html = requests.get(s_url)
                get_soup = BeautifulSoup(html.content, "html.parser")
                res_p = get_soup.find("p", "lnk_url")
                if res_p is not None:
                    print(res_p.text)
                res_p = get_soup.find("span", "name")
                if res_p is not None:
                    print(res_p.text)
                res_p = get_soup.find("dd", "name")
                if res_p is not None:
                    print(res_p.text)
            links = soup.find_all("a","fa_name")
            for link in links:
                i_url = link.get("href")
                html = requests.get(i_url)
                get_soup = BeautifulSoup(html.content, "html.parser")
                res_p = get_soup.find("p", "lnk_url")
                if res_p is not None:
                    print(res_p.text)
                res_p = get_soup.find("span", "name")
                if res_p is not None:
                    print(res_p.text)
                res_p = get_soup.find("dd", "name")
                if res_p is not None:
                    print(res_p.text)
        else:
            break
        num += 1
    else:
        break
    i += 1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Python 3.xに関する質問
  • 【python3 スクレイピング】ページネーションも全て含めて、最下層のURLを取得し、指定した情報を取得したい