実現したいこと
スクレイピングで画像/動画作品を収集する際、各Webページにアクセスした時に、作品が表示される場合は取得し、表示されない場合は取得しないようにしたい(私の1つ前の質問とは内容が異なります)。
前提
閲覧頂きありがとうございます。
現在、danbooruというイラスト投稿サイトにおいて、特定のタグが付与されている作品を収集するソースコードを作っています。
下部に掲示しているソースコードの仕組みについて説明します。
まず以下のページのhtmlをrequestしたあとに作品を収集します。
https://danbooru.donmai.us/posts/6632499?q=jolteon
その後、nextクラスにある次のページのhtmlをrequestして作品を収集します。
https://danbooru.donmai.us/posts/6619855?q=jolteon
そしてまたnextクラスにある次のページのURLをrequestして作品を収集するというのを繰り返してスクレイピングを行います。
そして、danbooruの特徴として、擬人化(?)である一部の作品は、左上にある「Disable all」を押さないと表示されないようになっています。2つ目のURLの次のページは下記のURLであり、表示されない作品ページに該当いたします。
https://danbooru.donmai.us/posts/6619346?q=jolteon
その上で私のやりたいことは、3つ目のURLにあるような、擬人化されているため表示を制限されており「Disable all」を押さないといけない作品は収集しないように設定することです。現状のソースコードでは、表示を制限されている作品であろうとなかろうと収集してしまいます。
上記のことを実現するためのお力添えをいただきたいです。よろしくお願い致します。
### 該当のソースコード import requests from bs4 import BeautifulSoup import os import time output_dir = "danbooru_img/jolteon" end_times = 10000 url = "https://danbooru.donmai.us/posts/6632499?q=jolteon" for page in range(end_times): response = requests.get(url) if not os.path.exists(output_dir): os.makedirs(output_dir) soup = BeautifulSoup(response.text, "html.parser") try: source = soup.find("img", id="image").get("src") except AttributeError: # 作品が画像ではなく動画である場合はエラーが発生するのでこちらを実行 source = soup.find("video").get("src") img = requests.get(source) with open(f"{output_dir}/{source.split('/')[-1]}", 'wb') as f: f.write(img.content) time.sleep(1) next = soup.find("a", class_="next").get("href") url = f"https://danbooru.donmai.us/{next}" #次のページのURLを作成
試したこと
調べてみた結果、Seleniumを使うと実現できるのではないかと思いました。ですが、その場合は動作が遅くなるデメリットがあるためできるだけ使用したくありません。
加えて、開発者ツールを除いてみると、擬人化の作品ページには下の写真のような黄色で示してある部分がありました。ですがその部分はrenposeで解析したhtmlにはなかったため、find等で認識ができないという状態です。
補足情報(FW/ツールのバージョンなど)
Python==3.11.5
requests==2.31.0
beautifulsoup4==4.12.2
回答1件
あなたの回答
tips
プレビュー