我是scrapy和python的新手,我很难理解这个流程。我无法理解将"抓取到下一页的位置"功能。我不确定它应该在我回调到parse_data之后还是在它自己的parse_data函数中出现
脚本逻辑: 对于类别中的类别,刮取类别中的所有页面。
选项1:
import scrapy
class Amazon01Spider(scrapy.Spider):
name = 'amazon0.1'
allowed_domains = ['amazon.com']
start_urls = ['https://amazon.com/Books/s?ie=UTF8&page=1&rh=n%3A283155&srs=9187220011']
def parse(self, response):
cats = response.xpath('//*[@id="leftNavContainer"]//*[@class="a-unordered-list a-nostyle a-vertical s-ref-indent-two"]//li//@href').extract()
for cat in cats:
yield scrapy.Request("https://amazon.com/"+""+cat, callback = self.parse_data)
def parse_data(self, response):
items = response.xpath('//*[@class="a-fixed-left-grid-col a-col-right"]')
for item in items:
name = item.xpath('.//*[@class="a-row a-spacing-small"]/div/a/h2/text()').extract_first()
yield {'Name': name}
next_page_url = response.xpath('//*[@class="pagnLink"]/a/@href').extract_first()
yield scrapy.Request("https://amazon.com/"+""+next_page_url, callback = self.parse_data)
选项2:
import scrapy
class Amazon01Spider(scrapy.Spider):
name = 'amazon0.1'
allowed_domains = ['amazon.com']
start_urls = ['https://amazon.com/Books/s?ie=UTF8&page=1&rh=n%3A283155&srs=9187220011']
def parse(self, response):
cats = response.xpath('//*[@id="leftNavContainer"]//*[@class="a-unordered-list a-nostyle a-vertical s-ref-indent-two"]//li//@href').extract()
for cat in cats:
yield scrapy.Request("https://amazon.com/"+""+cat, callback = self.parse_data)
next_page_url = response.xpath('//*[@class="pagnLink"]/a/@href').extract_first()
yield scrapy.Request("https://amazon.com/"+""+next_page_url)
def parse_data(self, response):
items = response.xpath('//*[@class="a-fixed-left-grid-col a-col-right"]')
for item in items:
name = item.xpath('.//*[@class="a-row a-spacing-small"]/div/a/h2/text()').extract_first()
yield {'Name': name}
答案 0 :(得分:0)
在您的具体示例中,我会选择选项1,因为它完全遵循您的预期脚本逻辑。一般来说,如果有更多的方法来实现目标,我更喜欢遵循某种自上而下的原则,即从主页面开始,从该页面提取数据,如果可能的话,请求到下一页/其他顶级页面,并最终产生对较低级别页面的请求。有几个原因可以这样做。首先,它更容易出错,因为在上层方法中发生分页,如果在较低级别的方法中存在任何错误(解析等),您的分页可能甚至不会发生。此外,通过这种方式,您可以克服不必要的重复请求过滤。