私はscrapyを使用してサイトをクロールしています。このサイトには、ページごとに15のリストがあり、[次へ]ボタンがあります。パイプライン内のすべてのリストの解析が完了する前に、次のリンクのリクエストが呼び出されるという問題が発生しています。これが私のスパイダーのコードです:
class MySpider(CrawlSpider):
name = 'mysite.com'
allowed_domains = ['mysite.com']
start_url = 'http://www.mysite.com/'
def start_requests(self):
return [Request(self.start_url, callback=self.parse_listings)]
def parse_listings(self, response):
hxs = HtmlXPathSelector(response)
listings = hxs.select('...')
for listing in listings:
il = MySiteLoader(selector=listing)
il.add_xpath('Title', '...')
il.add_xpath('Link', '...')
item = il.load_item()
listing_url = listing.select('...').extract()
if listing_url:
yield Request(urlparse.urljoin(response.url, listing_url[0]),
meta={'item': item},
callback=self.parse_listing_details)
next_page_url = hxs.select('descendant::div[@id="pagination"]/'
'div[@class="next-link"]/a/@href').extract()
if next_page_url:
yield Request(urlparse.urljoin(response.url, next_page_url[0]),
callback=self.parse_listings)
def parse_listing_details(self, response):
hxs = HtmlXPathSelector(response)
item = response.request.meta['item']
details = hxs.select('...')
il = MySiteLoader(selector=details, item=item)
il.add_xpath('Posted_on_Date', '...')
il.add_xpath('Description', '...')
return il.load_item()
これらの線が問題です。前に言ったように、スパイダーが現在のページをクロールし終える前に実行されています。サイトのすべてのページで、これにより、私のリストの15のうち3つだけがパイプラインに送信されます。
if next_page_url:
yield Request(urlparse.urljoin(response.url, next_page_url[0]),
callback=self.parse_listings)
これは私の最初のスパイダーであり、私の側の設計上の欠陥である可能性がありますが、これを行うためのより良い方法はありますか?