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

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

新規登録して質問してみよう
ただいま回答率
85.44%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3701閲覧

Pythonスクレイピング勉強 Seleniumでボタンが押せない&JavaScript実行できない

Misuki_itsuki

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2023/04/10 14:44

編集2023/04/10 14:46

実現したいこと

以下のサイトでホットランキング女性向けのボタンを押したい
(内容が切り替わりリロードされる)
https://www.alphapolis.co.jp/novel/ranking/hot

前提

スクレイピングの勉強をしています。
上記のサイトで女性向けランキング情報を取得したいのですが、デフォルトは男性向け情報になっており、ボタンを押さないとサイトの情報が切り替わりません。

発生している問題・エラーメッセージ

立ち上がるブラウザを見ていますがボタンが押された様子がありません。
XPathでのボタン操作を試したのですがうまくいかず、切替そのものを行うjavascript関数を呼び出そうとしたのですがうまくいかないようです。
また、以下のようなエラーも出ています。

Error parsing cert retrieved from AIA (as DER):
ERROR: Couldn't read tbsCertificate as SEQUENCE
ERROR: Failed parsing Certificate

USB: usb_device_handle_win.cc:1046 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F)

該当のソースコード

Python
PythonでSeleniumを使い以下のようなコードを書きました。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-ssl-errors')

driver_path = "実際のdriverのパス"

service = Service(executable_path=driver_path)

browser = webdriver.Chrome(service=service,options=chrome_options)

url = "https://www.alphapolis.co.jp/novel/ranking/hot"
browser.get(url)

WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print("Page fully loaded")

browser.set_window_size(1920, 1080)

#button = browser.find_element(By.XPATH,'//*[@id="ranking-for"]/li[2]')
#button.click()
browser.execute_script('changeGenre();')

time.sleep(20)

html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')

filename = "hot.txt"
with open(filename, mode= "w" , encoding="utf-8") as f:
f.write(html)

browser.quit()

試したこと

CSS_SelecterではなくXPathでの指定、XPathではなくJavaScriptの実行
ブラウザを読み込むまで待つ処理を入れた

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
Python 3.10.11
Selenium 4.8.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

ブラウザでページを開き、該当のボタンをクリックしてみたことろ、1度では画面の内容は変わらず、2度押すと画面が切り替わりました。どういう仕組みになっているのかは不明ですが、ボタンをクリックし再読み込みが終わった後に、再度同じボタンの要素を探してクリックすると、更に再読み込みが発生して画面が切り替わります。

私の環境では、以下のようにすると目的のページ内容が取得できました

python

1button = browser.find_element(By.XPATH,'//*[@id="ranking-for"]/li[2]') 2button.click() 3time.sleep(3) 4 5# 同一要素の再取得(使いまわしは出来ない) 6button_again = browser.find_element(By.XPATH,'//*[@id="ranking-for"]/li[2]') 7button_again.click() 8time.sleep(3) 9 10html = browser.page_source 11print(html)

投稿2023/04/11 01:14

Demerara

総合スコア397

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

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

Misuki_itsuki

2023/04/11 03:56

ありがとうございます!無事できました 2回押さないといけないうえ取得した要素の使いまわしができないということもあるんですね…… 学び始めたばかりで詰まっていたので本当に助かりました。
otn

2023/04/11 06:46

> 取得した要素の使いまわしができない ページ遷移(同じURLでもページの作り直し)が発生すると、それ以前に取得した要素は無効になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問