Scrapyを用いてクローリング&スクレイピングを行なっており、
なんとなく欲しい情報を取得できたものの思った通りに並んで
くれず、原因や解決方法がわからない状態です。
<やりたいこと>
ページAに複数ページ(仮にページBとCとDとします)のリンクが貼られており、
更にページBとCとDからリンク先のページがあるとします。
↓こんな感じです。(伝わりますでしょうか・・・)
階層1 | 階層2 | 階層3 |
---|---|---|
ページA | ページB | ページB' |
ページC | ページC' | |
ページD |
ページAから地名を取得し、
次に、ページBやCで、宿泊施設の名前を取得し、
更に、ページB'やページDで、宿泊施設のURLを取得したいです。
※ページBには複数の宿泊施設の名前があり、全て取得したく、ページB'には1つしかURLは存在しないです。
※ページBとCはページAから、ページC'とDはページCからそれぞれリンクが貼られています。
【表1】
列1 | 列2 | 列3 |
---|---|---|
熱海 | ホテル熱海 | http://www.hotel_atami.jp/ |
長野 | ホテル長野 | http://www.hotel_nagano.jp/ |
長野 | 民宿長野 | http://www.minsyuku_nagano.jp/ |
というようにCSV形式で取得したいのですが、実際には
【表2】
列1 | 列2 | 列3 |
---|---|---|
熱海 | ホテル熱海 | |
長野 | ホテル長野,民宿長野 | |
http://www.minsyuku_nagano.jp/ | ||
http://www.hotel_nagano.jp/ | ||
http://www.minsyuku_nagano.jp/ |
のように空欄ができたりしてしまいます。
どうしたら表1のように取得ができますでしょうか?
また、なぜ現在はこのような取得結果になっているのでしょうか?
python
1from scrapy.spiders import CrawlSpider, Rule 2from scrapy.linkextractors import LinkExtractor 3from project1.items import Project1Item 4 5class Project1Spider(CrawlSpider): 6 name = 'project1' 7 allowed_domains = ['syukuhaku.jp'] 8 start_urls = ('http://syukuhaku.jp/',) 9 10 rules = ( 11 Rule(LinkExtractor(allow=r'/cgi-bin/\w+'), callback='parse_topics', follow=True), 12 Rule(LinkExtractor(allow=r'/dettail/\w+'), callback='parse_topics_detail'), 13 ) 14 15 16 def parse_topics(self, response): 17 item = Project1Item() 18 item['area'] = response.css('#main > h1 > span:nth-child(1)::text').extract() 19 item['name'] = response.css('#main > h1 > span:nth-child(3)::text').extract() 20 yield item 21 22 23 def parse_topics_detail(self, response): 24 item = Project1Item() 25 item['url'] = response.css('#base-info > table > tr > td > a::attr("href")').extract_first() 26 yield item 27
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。