実現したいこと
スクレイピングで画像/動画作品を収集する際、各Webページにアクセスした時に、作品が表示される場合は取得し、表示されない場合は取得しないようにしたい。
前提
閲覧頂きありがとうございます。
現在、danbooruというイラスト投稿サイトにおいて、特定のタグが付与されている作品を収集するソースコードを作っています。
下部に掲示しているソースコードの仕組みについて説明します。
まず以下のページのhtmlをrequestしたあとに作品を収集します。
https://danbooru.donmai.us/posts/6681790?q=sylveon
その後、nextクラスにある次のページのhtmlをrequestして作品を収集します。
https://danbooru.donmai.us/posts/6680502?q=sylveon
そしてまたnextクラスにある次のページのURLをrequestして作品を収集するというのを繰り返してスクレイピングを行います。
そして、danbooruの特徴として、R18である一部の作品は「Disable all」を押さないと表示されないようになっています。2つ目のURLの次のページは下記のURLであり、表示されない作品ページに該当いたします。
https://danbooru.donmai.us/posts/6655703?q=sylveon 【閲覧注意】
この作品ページは左上にある「Disable all」を押すことで作品を表示できるようになります。
その上で私のやりたいことは、3つ目のURLにあるような、表示を制限されているR18作品は収集しないように設定することです。現状のソースコードでは、表示を制限されている作品であろうとなかろうと収集してしまいます。
上記のことを実現するためのお力添えをいただきたいです。よろしくお願い致します。
該当のソースコード
Python
1import requests 2from bs4 import BeautifulSoup 3import os 4import time 5 6output_dir = "danbooru_img/sylveon" 7end_times = 10000 8url = "https://danbooru.donmai.us/posts/6681790?q=sylveon" 9 10for page in range(end_times): 11 response = requests.get(url) 12 13 if not os.path.exists(output_dir): 14 os.makedirs(output_dir) 15 16 soup = BeautifulSoup(response.text, "html.parser") 17 18 try: 19 source = soup.find("img", id="image").get("src") 20 except AttributeError: # 作品が画像ではなく動画である場合はエラーが発生するのでこちらを実行 21 source = soup.find("video").get("src") 22 23 img = requests.get(source) 24 25 with open(f"{output_dir}/{source.split('/')[-1]}", 'wb') as f: 26 f.write(img.content) 27 28 time.sleep(1) 29 30 next = soup.find("a", class_="next").get("href") 31 url = f"https://danbooru.donmai.us/{next}" #次のページのURLを作成 32
試したこと
調べてみた結果、Seleniumを使うと実現できるのではないかと思いました。ですが、その場合は動作が遅くなるデメリットがあるためできるだけ使用したくありません。
JavaScriptの動作が関係しているのではと思いましたが、JavaScriptの知識が全くなく、開発者ツールで見てみてもソースコードがあまりにも多い&複雑すぎて見当がつきません。
補足情報
Python==3.11.5
requests==2.31.0
beautifulsoup4==4.12.2

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/24 13:27 編集
2023/09/24 12:44
2023/09/24 13:26 編集
2023/09/24 13:27
2023/09/24 15:42