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

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

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

Q&A

解決済

1回答

553閲覧

競馬ラボというサイトのとあるページからリンクを抜き出そうとしても、うまくいかないのでコードの直し方を教えてください。

kazusa

総合スコア3

1グッド

1クリップ

投稿2025/01/08 10:05

実現したいこと

https://www.keibalab.jp/db/race/202501130711/
このページ内の全てのリンクのURLを抜き出して、リストall_linksの中に要素として入れたのちに、内包表記を利用して/db/horse/を要素内に持つもののみを要素とした新しいリストhorse_linksを作成したい。

前提

【python最速データ収集術】と【python2年生スクレイピングのしくみ】という本を参考に、ネットでもいろいろと調べながらプログラミングを進めています。

(ちなみに実際にそれで競馬の平均タイム一覧が載っているサイトをスクレピングしてページ遷移をしながらすべての平均タイムをExcelに書き込むというプログラムを自力で作成したことがあります。)

開発者ツールで上記URLで取得したい部分のhtmlを見たところ、おそらくpython2年生の63ページ下部に載っていたコードのコピペでいけるのではないかと思ったのですが、それをコピペし実行しただけでもエラーがでていないのにURLが取得できていない、という状況なので非常に困っています。

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

エラーは発生していないが、取得できているはずのURLがターミナルにprintされないので困っています。

該当のソースコード

#ソースコード import requests from bs4 import BeautifulSoup load_url = "https://www.keibalab.jp/db/race/202501130711/" html = requests.get(load_url) soup = BeautifulSoup(html.content,"html.parser") all_links = [] # sp = soup.find("tbody") # ←この部分があったほうがいいのか不明 for element in soup.find_all("a"): print(element.text) url = element.get("href") print(url) all_links.append(element) print("↓ここからリストの中身") horse_links = [l for l in all_links if "/db/horse/" in l] for x in horse_links: print(x) ####################################### #ちなみにpython2年生の63ページのコピペというのはこの部分です #import requests #from bs4 import BeautifulSoup #load_url = "https://www.keibalab.jp/db/race/202501130711/" #html = requests.get(load_url) #soup = BeautifulSoup(html.content,"html.parser") #for element in soup.find_all("a"): #print(element.text) #url = element.get("href") #print(url) #######################################

補足情報 なぜかrequests.getのgetは黄色なのにelement.getのgetは白色です。動かない理由と関係があるのかはわかりませんが...

melian👍を押しています

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

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

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

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

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

melian

2025/01/08 10:16

print(soup) を実行してみると判るかと思います。("You don't have permission to access this resource.") <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access this resource.</p> </body></html>
kazusa

2025/01/08 11:21

コメントありがとうございます。 コメントいただいた通りにとりあえずprint(soup)をして、かつ、この状態について軽く検索してみました。 私は初心者でこの状態について知らなかったので、的外れなことを言っているかもしれませんが、競馬ラボの利用規約にスクレイピング禁止と書いておらず、かつ、このサイトの別のページにスクレイピングをし情報を取得できているプログラムも発見することができました。https://saisaikenken.hatenablog.com/entry/2021/10/05/163922 (おそらくheadlesschromeというものを使っている?) なので https://teratail.com/questions/156800 の質問にあるように、UserAgentをリクエストに与えるかHeadlessChromeを使用する、という方向性で考えていけばよいのでしょうか? また、UserAgentかHeadlessChromeを利用するようにコードを書き換えるだけでよいのでしょうか? それ以外の部分は、目的を達成できるような正しいコードに現状なっているという認識で大丈夫でしょうか? ご返信いただければ幸いです。
guest

回答1

0

ベストアンサー

UserAgentをリクエストに与えるかHeadlessChromeを使用する、という方向性で考えていけばよいのでしょうか?

requests でも user-agent を指定することができます。

python

1import requests 2from bs4 import BeautifulSoup 3 4load_url = "https://www.keibalab.jp/db/race/202501130711/" 5headers = { 6 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3' 7} 8html = requests.get(load_url, headers=headers) 9soup = BeautifulSoup(html.content,"html.parser") 10 11all_links = [] 12 13for element in soup.find_all("a"): 14 print(element.text) 15 url = element.get("href") 16 print(url) 17 ## element ではなく url を追加(append)します 18 # all_links.append(element) 19 all_links.append(url) 20 21print("↓ここからリストの中身") 22 23horse_links = [l for l in all_links if "/db/horse/" in l] 24 25for x in horse_links: 26 print(x)

なお、soup.select()(CSS セレクタ)を使うと以下の様に書くこともできます。

python

1load_url = "https://www.keibalab.jp/db/race/202501130711/" 2headers = { 3 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3' 4} 5html = requests.get(load_url, headers=headers) 6soup = BeautifulSoup(html.content,"html.parser") 7all_links = soup.select('a[href*="/db/horse/"]') 8 9print("↓ここからリストの中身") 10horse_links = [l.attrs['href'] for l in all_links] 11for x in horse_links: 12 print(x)

投稿2025/01/08 11:23

melian

総合スコア21185

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

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

kazusa

2025/01/11 17:35

返信が遅くなり申し訳ありません! user-agentについてよくわかりましたし、実際にuser-agentを利用して競馬ラボからスクレイピングをすることができました。 わかりやすい回答ありがとうございました!助かりました! もし次の機会がありましたら気が向いたらでいいのでご回答いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問