【发布时间】:2017-05-07 01:15:57
【问题描述】:
鉴于我有一个 HTML 文件,其中包含多个具有不同结构的部分,这些部分需要大不相同的抓取。 蜘蛛布局的最佳做法是什么?
我应该使用一只蜘蛛还是多只蜘蛛?我是否应该多次请求同一个 URL,每次都使用不同的回调函数?或者只是顺序解析不同的部分?我问的是能够很好地与框架的其他部分(例如 items 和 pipleines 配合使用)以及性能、限制和缓存方面。
那么,有什么最佳实践建议吗?社区中使用的规则或约定?
多个请求
如果我多次请求一个 URL,它会被缓存/限制吗?还是对引擎的每个请求都会导致对“外部网络服务器”的请求?
class MultiSpider(scrapy.Spider):
"""Parse the parts in parallel."""
name = 'multispider'
def start_requests(self):
url = 'https://en.wikipedia.org/wiki/Main_Page'
yield scrapy.Request(url=url, callback=self.parser_01)
yield scrapy.Request(url=url, callback=self.parser_02)
def parser_01(self, response):
selector = response.xpath('//some/path')
if selector is not None:
# do stuff with *selector* and
yield {}
def parser_0(self, response):
selector = response.xpath('//some/other/path')
if selector is not None:
# do very different stuff with *selector* and
yield {}
多个解析器函数
如果我想避免使用庞大的 parse 函数,而是将多个函数用于不同的任务/部分,是否有特别好的/坏的方法来构建它(例如“如何从哪里产生”)?
class SeqSpider(scrapy.Spider):
"""Parse the page sequentially."""
name = 'seqspider'
start_urls = ['https://en.wikipedia.org/wiki/Main_Page', ]
def parse(self, response):
selector = response.xpath('//some/path')
if selector:
yield from self.parser_01(response, selector):
selector = response.xpath('//some/other/path')
if selector:
yield from self.parser_02(response, selector):
def parser_01(self, response, selector):
# do stuff with *selector* and
yield {}
def parser_0(self, response, selector):
# do very different stuff with *selector* and
yield {}
【问题讨论】:
标签: python scrapy scrapy-spider