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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

562閲覧

Pythonで全ページのタイトル名をスクレイピングしたいのですが、ご教示いただけますと幸いです。

stepbystep16

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/02/04 07:40

編集2022/02/06 02:59

現在、Pythonで全ページの会社名を取得したいと思っているのですが、Printで行っても、エラー文も表示されずうまく行っているかと思うのですが、処理が実行されずに困っています。

ご教示いただけますと幸いでございます。

【行いたい内容】
ページ内の紹介写真に記載されている「〇〇株式会社」を”全ページ”スクレイピングしたいと考えています。

1ページだけなら取得はできるのですが、for文で、次のページ→「〇〇株式会社」全取得→次のページ→「〇〇株式会社」全取得・・・として取得をしたいです。

data_col = ["information1", "information2"] while True: res = requests.get('https://onlystory.co.jp/stories/?order=new') res.raise_for_status() html = BeautifulSoup(res.text, 'lxml') detail_url_list = html.find_all("company-name-s company-edit-hidden") next_page = html.find("next") for i in range(len(detail_url_list)): res2 = requests.get(urljoin(base_url, detail_url_list[i].a.get("href"))) res2.raise_for_status() html2 = BeautifulSoup(res2.text, 'lxml') information1 = html2.img.get("name") information2 = html2.a.get("href") s = pd.Series([information1, information2], index=data_col) df = df.append(s, ignore_index=True) df.to_csv(save_csv) time.sleep(5) if bool(next_page) == False: break dynamic_url = urljoin(base_url, next_page.a.get("href")) time.sleep(5)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2022/02/04 08:30

利用規約の禁止事項に以下が提示されていますが問題ないのでしょうか。 (10)マクロ及び操作を自動化する機能やツール等を使用する行為
stepbystep16

2022/02/06 02:48

ご指摘ありがとうございます。 現在、この企業様のサポートをしているものになりますので、許可をいただきスクレイピングを行いたいと思います。
guest

回答1

0

ベストアンサー

最初に全体のページ数を取得して、個々のページで企業名を抽出します。
※ 115 ページもありますので、実際には最初の数ページのみに限定してテストを行いました

python

1import requests 2from bs4 import BeautifulSoup 3 4search_url = 'https://onlystory.co.jp/stories?order=new' 5 6# number of pages 7headers = { 8 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0' 9} 10r = requests.get(search_url, headers=headers) 11r.raise_for_status() 12html = BeautifulSoup(r.text, 'lxml') 13num_pages = html.select_one('nav.pagination > span:nth-last-of-type(3)').text 14num_pages = int(num_pages) 15 16# scrape every page 17company_names = [] 18for i in range(1, num_pages+1): 19 r = requests.get(f'{search_url}&page={i}') 20 r.raise_for_status() 21 html = BeautifulSoup(r.text, 'lxml') 22 name = html.select('div.ele-list-thumb-container > div[class="company-name-s company-edit-hidden"]') 23 for n in name: 24 company_names.append(n.text.strip()) 25 26from pprint import pprint 27pprint(company_names) 28 29# 30['ギグセールス株式会社', 31 '株式会社リプカ', 32 '京都医塾株式会社', 33 '株式会社SNSコーチ', 34 '株式会社G-KIT', 35 '株式会社Srush', 36 '株式会社トリプルアイズ', 37 'DeFactory株式会社', 38 : 39

投稿2022/02/04 08:50

melian

総合スコア21118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stepbystep16

2022/02/06 02:58

ありがとうございます!!無事全てスクレイピングできました! 一点ご教示いただきたいのですが、スクレイピングの際に間隔をあけて行わないと攻撃として見做されると言うことでTime.sleep(5)などで5秒間隔をあけていただのですが、こちらは不要と言うことになりますでしょうか? (115ページある中で5秒間隔取ってしまうと相当出力に時間がかかるかもしれませんが・・・)
melian

2022/02/06 03:05

はい、攻撃と見なされてしまう可能性は高いと思います。一応、ページごとに1〜2秒程度の間隔をあけてアクセスする方がよいかもしれません。
stepbystep16

2022/02/07 03:38 編集

ご回答いただきありがとうございます。 そのようにいたします。 攻撃と見做される可能性があるということで、こちらでお試しをしていない状況で確認するのは恐縮ではございますが、Time.sleep(5)を入れる場所は下記の箇所という認識で問題ないでしょうか。 ーーーーーーーーーーーーーーーーーーーー # number of pages headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0' } r = requests.get(search_url, headers=headers) ーーーー time.sleep(5) ーーーー r.raise_for_status() html = BeautifulSoup(r.text, 'lxml') num_pages = html.select_one('nav.pagination > span:nth-last-of-type(3)').text num_pages = int(num_pages) ーーーーーーーーーーーーーーーーーーーー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問