Я использую 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()
Эти строки являются проблемой. Как я уже сказал, они исполняются до того, как паук закончил сканирование текущей страницы. На каждой странице сайта это всего лишь 3 из 15 моих списков, которые будут отправлены в конвейер.
if next_page_url:
yield Request(urlparse.urljoin(response.url, next_page_url[0]),
callback=self.parse_listings)
Это мой первый паук и может быть ошибкой дизайна с моей стороны, есть ли лучший способ сделать это?