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

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

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

解決済

1回答

3525閲覧

Beautiful Soupの(driver.page_source)で対象ページのHTMLが取得できない

yudouhu

総合スコア16

0グッド

1クリップ

投稿2021/08/21 19:18

Beautiful Soupでpixivの画像を一括ダウンロードできないかと思ったのですが、いざ保存をしようとすると検索オプションや古い順などで選んだ画像がHTMLとして取得できていませんでした。具体的には検索オプションで変化したURLがトップに戻っていました。原因としては(driver.page_source)が本来見ているページをもう一度、読み込むことが原因として考えられたのですが、これを解決する対処方法がわかりません。どなたか、ご教示して頂ければ幸いです。

下記にコードを記載しておりますが、問題個所はコメントアウトしております。

driver.page_source前
イメージ説明

driver.page_source後
イメージ説明

from selenium import webdriver as wb import traceback from time import sleep from bs4 import BeautifulSoup as bs4 import re import requests import os import shutil from selenium.webdriver.common.keys import Keys mail = "メールアドレス" password="パスワード" driver = webdriver.Chrome(r"C:\Users\yuuki\Documents\chromedriver_win32\chromedriver") url = "https://www.pixiv.net/" driver.get(url) sleep(3) error_flg = True try: login_button = driver.find_element_by_xpath("//a[text()='ログイン']") login_button.click() sleep(3) input_mail = driver.find_element_by_css_selector("input[autocomplete='username']") input_mail.send_keys(mail) sleep(3) input_pass = driver.find_element_by_css_selector("input[autocomplete='current-password']") input_pass.send_keys(password,Keys.ENTER) sleep(3)    #検索名を入力    serach_name = "/風景"       traget_url = url + "tags" + serach_name + "/illustrations"    driver.get(traget_url)    sleep(3) #traget_urlになっていない soup = bs4(driver.page_source) except Exception: print(traceback.format_exc())

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因としては(driver.page_source)が本来見ているページをもう一度、読み込むことが原因として考えられたのですが、これを解決する対処方法がわかりません。

解決する対処方法の前に、原因をきちんと理解できていない可能性があります。
「検索オプションや古い順などで選んだ画像が」とありましたが
掲題のコードではそもそも古い順での指定はされていらっしゃらない模様です。
URLに?order=dateとパラメータを追加してあげるか
または要素を指定してクリックしてあげる必要があるでしょう。

.page_sourceについては、driver上で現在開いているページのソースを取得するメソッドです。
bs4.BeautifulSoupでは引数としてソースを与える事でその解析ができます。

python

1# 指定の要素をクリック 2driver.find_element_by_xpath('//*[@id="root"]/div[2]/div[3]/div/div[5]/div/div/div/a/span').click() 3# ソースを変数に代入 4source = driver.page_source 5 6from bs4 import BeautifulSoup 7# BeautfulSoupの第1引数に変数sourceを与え、第2引数には任意のパーサーを 8soup = BeautifulSoup(source, 'html.parser') 9# find_allメソッドでは指定した要素(属性)に該当する全ての要素をリスト型で抽出出来る 10img_list = find_all('img') 11for img in img_list: 12 src = img.get('src') 13

※どういった仕様かは詳しくわかりませんが、今回のページではそのままimg要素を取得しても画像の閲覧ができない模様で、img要素ではなくそれぞれのリンク先を取得→各ページにアクセスを行い画像の取得を行う必要がありそうです。


python

1# 変数soupから各画像の全リンク先を持った要素を取得 2anchortags = soup.find_all('リンクのある要素') 3# 取得した要素からリンク先URLを取得しリストにまとめる 4links = [link.get('href') for link in anchortags] 5# 各ページにアクセスをし対象の画像を取得 6for link in links: 7 soup = BeautifulSoup(requests.get().content, 'html.parser') 8 img = soup.find('img').get('src') 9 10 time.sleep(1)

投稿2021/08/22 08:39

編集2021/08/23 06:56
nto

総合スコア1438

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

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

yudouhu

2021/08/22 12:26

検索オプションは一例として挙げていたので古い順などのコードを記載を失念しておりました。申し訳ありません。 >URLに?order=dateとパラメータを追加してあげるか、または要素を指定してクリックしてあげる必要があるでしょう。 一応、このどちらも試してみたのですが、トップページのURLに戻されていました。 >※どういった仕様かは詳しくわかりませんが、今回のページではそのままimg要素を取得しても画像の閲覧ができない模様で、img要素ではなくそれぞれのリンク先を取得→各ページにアクセスを行い画像の取得を行う 最終手段として、その方法を考えていたのですが、そうなると扱うコード量が複雑かつ膨大になってきます。けれど、そうするしか方法はないようですね、頑張ってみます。ありがとうございました。
nto

2021/08/23 07:00 編集

>>> 一応、このどちらも試してみたのですが、トップページのURLに戻されていました。 A.トップページのURLに対してパラメータを与えていませんか? traget_url = url + "tags" + serach_name + "/illustrations" + "?order=date" としてみてください。 >>> 最終手段として、その方法を考えていたのですが、そうなると扱うコード量が複雑かつ膨大になってきます。けれど、そうするしか方法はないようですね、頑張ってみます。 A.私としては最終手段というか、パッと見で一番最初か2番手くらいに思いつく手段でした。 またコード量も大して複雑になったり膨大になったりもしないと思います。 例にあげて追記をしたのでご確認ください。
yudouhu

2021/08/23 17:28

>>トップページのURLに対してパラメータを与えていませんか? urlは traget_url = url + "tags" + serach_name に "/illustrations" などを付けたしているのでトップページのURLに対してパラメータは与えておりません 追記されたコードに関しては私の説明不足でお手を煩わせてしまいました。本当に申し訳ありません。 私は 風景と検索 → この時点で bs4(driver.page_source)を実行 → トップページからイラストのページのURLを獲得(画像1枚目の場面です) -> bs4(driver.page_source)を実行せずに、その先にある(img)を取得する この一連の流れが複雑だと考察しておりました。 言葉ではイメージしにくいと思いますが、 yahooのトップページからホットニュースのURLを取得 -> URLの["href"]をすべて取得 -> for文で 展開し、その先のページ画像や本文を1つずつ持ってくる という感じのスクレイピングです。 しかしながら、bs4(driver.page_source)を実行せずに(img)を取得することは不可能だと思うので、絵師のトップページから画像を取得する使用に変更しようと思います。ここまで、親身になってくださり、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問