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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

2290閲覧

【Python】soup.find_all('a')で、リンク先のURLが拾えないリンク先(例えば、href="javascript:void(0);"など)のページに対する、 ウェブサイトのスクレイ

Xboy

総合スコア0

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/08/05 05:29

前提・実現したいこと

全くの趣味の話の質問で、大変恐縮なのですが、
keirin.jpで公開している、「開催日程」ページ(http://keirin.jp/pc/raceschedule)から検索できる、
過去の全レースのデータを取得したいと思っています。

Beautifulsoup、Requests、Seleniumで、できる限りシンプルなコードで実現したいと思っています。

 取得したいデータは、keirin.jpで公開している「開催日程」ページから閲覧可能な、各レースの以下の内容です。
・1999年1月~2021年8月(開催済みレース)の全レースに対する、
・各レースの「初日~最終日」の、「R1~最終R(例えばR1~R10とか)」に対する、
・「開催日」「レースプログラム」「天候」「払戻金」「着順」「基本情報」「直近成績」「当場成績」「オッズ」「コメント着度数」「競争結果」「選手名」(プロフィール/通算成績)
の、文字データです。

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

まずは各ページを表示させ、データが取得できるかというところをやっていました。

欲しいデータがありそうなページのリンクに関する情報が、以下のような情報になっていて、
どのように指定すれば、リンク先に行けて情報が取得できるのか分からず、途方に暮れてしまいました。

「<a data-pprm-dkbn="1" data-pprm-encp="Op5YUKjlmvIFbWItz0h98Iu4KiydX8VNIIrdFfcTVJ0"
data-pprm-href="/pc/racelist" href="javascript:void(0);">」

  ※すべて、このような形ではないかも知れませんが、いずれにしても遷移先のURLがわからないケースです。

   URLが分かり、以下のように指定して情報を入手するということをイメージしていました。
load_url = "リンク先のURL"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")

該当のソースコード

import requests
from bs4 import BeautifulSoup

load_url = "http://keirin.jp/pc/raceschedule?scyy=2001&scym=01"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
links = soup.find_all('a')

print(links)

試したこと

スクレイピングの超初心者です。(keirinも初心者です。)

「Octoparse」などの外部のスクレイピングサービスを使わず、Beautifulsoup、Requests、Seleniumで、
できる限りシンプルなコードで実現できるような方法を探しています。
(外部サービスが、突然使えなくなったりすると困ってしまうし、自作のコードであれば、自分で手直しもできるだろうと、
あくまで自分でコードを書いて実現したいと思っています。)

多くのPythonのスクレイピング関連の本を見ましたが、遷移先のURLが取得できるケースでの紹介がほとんどで、
基本的なことしか書いてないか、逆に記載がありそうな本であっても、ずばりのケースの紹介ではなく、
合わせて初心者には難し過ぎて理解が出来ない内容のどちらかで、
今回のようなケースの情報を得るにも、Webでどのように検索すれば、たどり着けるのかも分からず困っています。

Keirin.jpのデータをスクレイピングする方法など、紹介のあるサイトもありますが、
重要な部分が書かれていないか、外部スクレイピングサービスが紹介されているものでした。

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

Windows10
python 3.9.5

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

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

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

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

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

quickquip

2021/08/07 02:02

Seleniumを使って素直に書いたら実現できそうですが、何がな問題ですか?!
Xboy

2021/08/07 04:16 編集

ご質問ありがとうございます。(大変お手数をおかけいたしております。 すみません。) 問題は以下です。 問題:Seleniumでは、私の知識が乏しすぎて、記述の仕方自体が分からない状況です。 私の現状の理解でお伝えさせていただきます。  -例-   開催日程ページの内容の、「ある個所」を一例にしていいますと。   遷移したいリンクの箇所が、   <a data-pprm-dkbn="1" data-pprm-encp="Op5YUKjlmvIFbWItz0h98Gd8fAtE_1qZeNS5m9JwXKY"    data-pprm-href="/pc/racelist" href="javascript:void(0);">    といったところがあるのですが。  Seleniumについて紹介されているWebページで、よく見かけるのは「driver.find_element_by_xpath('//*[@〇〇〇〇]').click()」なんですが、   上記の遷移したいリンクの箇所の情報(と思っている)を元に、どのようにxpathの()内を記述すればいいかが分からない状況です。 Webなどの情報を元に、いろいろ考えている中で、Xpathも遷移先のURLを知ってないと書けないんじゃないかと感じているところもありました。(恐らく、ここも間違ってますでしょうか。) この理解も間違っている可能性もありますし、何しろSeleniumについて知識不足している状況で。(すみません。) 実のところBeautifulsoup、Requestsも知識は少ないのですが、Seleniumでは、それ以上知識に乏しいといったところです。 (多くの人にとって、当たり前のことも、分からない状況です・・・。) なので、希望としては、超初心者でもわかる、一番シンプルな記述で実現できる方法が知りたいと思っていました。
guest

回答1

0

<a data-pprm-dkbn="1" data-pprm-encp="Op5YUKjlmvIFbWItz0h98Iu4KiydX8VNIIrdFfcTVJ0" data-pprm-href="/pc/racelist" href="javascript:void(0);">
はJavaScriptで表示されているので最初の取得のみselenium使用してJavaScript実行後HTMLを取得して
取得後はBeautifulSoupで解析していくのはどうでしょうか?

from bs4 import BeautifulSoup from selenium import webdriver import chromedriver_binary load_url = "http://keirin.jp/pc/raceschedule?scyy=2001&scym=01" driver = webdriver.Chrome() driver.get(load_url) driver.set_script_timeout(5) html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html, "html.parser")

投稿2021/08/07 08:10

holy_

総合スコア364

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

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

Xboy

2021/08/07 13:15 編集

holyさん、ご回答ありがとうございます!(お手数をおかけいたしました。) 理解が追い付いていない可能性があり、出来ればもう少し詳細を教えていただけると助かります。 不明なところは「最初の取得のみselenium使用してJavaScript実行後HTMLを取得して、取得後はBeautifulSoupで解析」というところの、「JavaScript実行」について、この処理が動作していないように見えてます・・・。 (JavaScript実行は、教えていただいたコードで言うとどこの処理になるのでしょうか。) 教えていただいたコードでの実際の動作は以下の状況でした。 (最後のsoupの中身を書き出すため、Print(soup)だけ追加し、実行してみました。) Chromeが別ウィンドウで立ち上がり、「http://keirin.jp/pc/raceschedule?scyy=2001&scym=01」 のページが表示されました。(これが、driver.get(load_url)の処理で、「最初の取得のみselenium使用して」のことを指していると理解しましたが、あってますでしょうか。) そのまましばらく放置してみましたが、そこから動きはありませんでした。 表示されたSOUPの中身は「http://keirin.jp/pc/raceschedule?scyy=2001&scym=01」ページのHTMLのようです。 (<a data-pprm-dkbn="1" data-pprm-encp="Op5YUKjlmvIFbWItz0h98Iu4KiydX8VNIIrdFfcTVJ0" data-pprm-href="/pc/racelist" href="javascript:void(0);">へ遷移したページのHTMLの情報は取得できませんでした。) 何か、私のコードの利用の仕方、理解が間違ってますでしょうか。 ブラウザのほうに何か設定がいるとかなのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問