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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

スクレイピング

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1389閲覧

【webスクレイピング】cssセレクタでURL取得後URLページの中身を取得できない

zonkota

総合スコア4

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

スクレイピング

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/02/08 13:00

最終的な目標

プログラミング初学者です。
Udemyという動画サイトの講座でやったことを競馬のサイトで応用し、それを元にデータベースを作成することを目標にしています。

環境

Anaconda-Navigatorで環境を作り、vscode(Python)でスクレイピングするためのコードを記述しています。

やりたいこと

cssセレクタで指定したURLを取得し、
そのURLを辿って、詳細情報を取得する。

詰まっている部分

・cssセレクタで複数指定したはずのURLを一つしか取得できない。
・詳細ページへ遷移後のデータが取得できない

やってみたこと

spider①のコードではURLを取得できています。

spider①

1import scrapy 2import logging 3 4class KeibaDbSpider(scrapy.Spider): 5 name = 'keiba_db' 6 allowed_domains = ['race.netkeiba.com'] 7 start_urls = ['https://race.netkeiba.com/race/result.html?race_id=202207011001&rf=race_list'] 8 9 #URL情報を取得する 10 def parse(self, response): 11 #cssセレクタを絞り込む 12 race_results = response.css('#All_Result_Table > tbody > tr') 13 14 for race_result in race_results: 15 yield{ 16 #馬名のURLを取得 17 'bameiUrl' : race_result.css('td > span > a::attr(href)').get(), 18 }

spider①結果

1[ 2{"bameiUrl": "https://db.netkeiba.com/horse/2019102502"}, 3{"bameiUrl": "https://db.netkeiba.com/horse/2019101714"}, 4{"bameiUrl": "https://db.netkeiba.com/horse/2019106083"}, 5{"bameiUrl": "https://db.netkeiba.com/horse/2019103928"}, 6{"bameiUrl": "https://db.netkeiba.com/horse/2019104549"}, 7{"bameiUrl": "https://db.netkeiba.com/horse/2019106565"}, 8{"bameiUrl": "https://db.netkeiba.com/horse/2019100873"}, 9{"bameiUrl": "https://db.netkeiba.com/horse/2019104251"}, 10{"bameiUrl": "https://db.netkeiba.com/horse/2019102354"}, 11{"bameiUrl": "https://db.netkeiba.com/horse/2019101739"}, 12{"bameiUrl": "https://db.netkeiba.com/horse/2019104311"}, 13{"bameiUrl": "https://db.netkeiba.com/horse/2019101706"}, 14{"bameiUrl": "https://db.netkeiba.com/horse/2019101795"}, 15{"bameiUrl": "https://db.netkeiba.com/horse/2019102353"}, 16{"bameiUrl": "https://db.netkeiba.com/horse/2019106625"}, 17{"bameiUrl": "https://db.netkeiba.com/horse/2019100265"} 18]

しかし、spider②のコードのように詳細ページに遷移できるように書き換えるとURLを1つしか取得できなくなっています(ログで確認)
また、詳細情報も取得することができていません。
講座で学んだコードをほぼ真似て作成したのですが、うまく取得できませんでした。

spider②

1import scrapy 2import logging 3 4class KeibaDbSpider(scrapy.Spider): 5 name = 'keiba_db' 6 allowed_domains = ['race.netkeiba.com'] 7 start_urls = ['https://race.netkeiba.com/race/result.html?race_id=202207011001&rf=race_list'] 8 9 #URLから詳細ページへ遷移する 10 def parse(self, response): 11 #cssセレクタを絞り込む 12 race_results = response.css('#All_Result_Table > tbody > tr') 13 14 for race_result in race_results: 15 # yield{ 16 # #馬名のURLを取得 17 # 'bameiUrl' : race_result.css('td > span > a::attr(href)').get(), 18 # } 19 20 #cssセレクタでURLを指定(16個) 21 yield response.follow(url=race_result.css('td > span > a::attr(href)').get(), 22        callback=self.parse_item) 23 24 #詳細ページから情報を取得する 25 def parse_item(self,response): 26 #詳細ページのcssセレクタを絞り込む 27 syosai = response.css('#contents > div.db_main_race.fc > div') 28 yield{ 29 #開催地を取得する 30 'kaisai' : syosai.css('table > tbody > tr:nth-child(1) > td:nth-child(2) > a::text').get(), 31 }

最後に

初めての投稿です。
どうしても自力でこの事象を解決することができず、調べても調べ方が下手なのかいい情報を得られず、しかしどうしても諦めることもできなかったので投稿しました。
初めての質問で質問内容に不足している部分やわかりづらい部分もあるかもしれませんが、皆さまのお力をお借りさせて頂きたいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Scrapy のログを確認しますと、以下の様なメッセージが出力されています。

log

12022-02-09 00:34:44 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'db.netkeiba.com': <GET https://db.netkeiba.com/horse/2019102502>

なので、allowed_domainsdb.netkeiba.com を追加します。

python

1 #allowed_domains = ['race.netkeiba.com'] 2 allowed_domains = ['race.netkeiba.com', 'db.netkeiba.com']

投稿2022/02/08 15:35

melian

総合スコア21181

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

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

zonkota

2022/02/09 00:28

早速の解答ありがとうございます!3日ほど悩んでいたのが嘘のようです! 本当に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問