pythonにおけるrequestの仕様についてわからないことがあります。
Scrapyでaタグをたどり、Webグラフの構造(ノードとリンクの関係)を深さ2まで保存しようと考えています。
以下が現在実装中のspiderです
class SpiderSpider(scrapy.Spider): name = 'spider' allowed_domains = [] start_urls = ["http://1", "http://2"] href_list = [] def parse(self, response): seed_node = {} seed_node['url'] = response.url seed_node['type'] = "seed" self.href_list.__init__() self.href_list.extend(response.xpath('//body//a/@href').extract()) self.href_list = list(set(self.href_list)) for href in self.href_list: href = response.urljoin(href) request = scrapy.Request(href, callback=self.parse_next) request.meta['source'] = response.url print("request: href=", href, "source=", response.url) yield request print("yield seed node:", seed_node['url']) yield seed_node def parse_next(self, response): node = {} node['url'] = response.url node['type'] = "normal" node['source'] = response.meta['source'] self.href_list.__init__() self.href_list.extend(response.xpath('//body//a/@href').extract()) self.href_list = list(set(self.href_list)) for href in self.href_list: href = response.urljoin(href) request = scrapy.Request(href, callback=self.parse_next) request.meta['source'] = response.url print("request: href=", href, "source=", response.url) yield request print("yield node:", node['url'], "source=", node['source']) yield node
このとき、ウェブの構造が以下のようなダミーデータを用意し
プログラムを走らせてみます。
ページ | リンク先 |
---|---|
1(seed) | 3, 4 |
2(seed) | 3, 5 |
3 | 6 |
4 | 6 |
5 | 6 |
6 | ・・・ |
するとprint文の出力は以下のようになります
request: href=4 source=1 request: href=3 source=1 yield seed node:1 request: href=5 source=2 request: href=3 source=2 yield seed node:2 request: href=6 source=4 yield node:4 source=1 request: href=6 source=3 yield node:3 source=1 request: href=6 source=5 yield node:5 source=2
つまり一番最後に「yield node:3 source=2」が出力されず、
2→3のリンク情報が取り出せていません。
一度ページ3へのrequestをyieldしてしまっているので後半のrequestが無視される形になっているのでしょうか?
初心者のためのrequestやyieldの仕組みも詳しく理解できていません。
どうしたらうまく実装できるでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。