最終的な目標
プログラミング初学者です。
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 }
最後に
初めての投稿です。
どうしても自力でこの事象を解決することができず、調べても調べ方が下手なのかいい情報を得られず、しかしどうしても諦めることもできなかったので投稿しました。
初めての質問で質問内容に不足している部分やわかりづらい部分もあるかもしれませんが、皆さまのお力をお借りさせて頂きたいです。よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/09 00:28