假设我有一个单独的HTML文件,其中包含多个不同结构的部分,这些部分需要广泛不同的刮削。蜘蛛布局的最佳实践是什么?
我应该用一个蜘蛛还是更多蜘蛛?我是否应该多次请求同一个URL,每次都使用不同的回调函数?或者只是按顺序解析不同的部分?同时,也要考虑到的缓存和其他部分的性能限制。在
那么,有什么最佳实践建议吗?社区中使用的规则或惯例?在
如果我多次请求一个URL,它是否被缓存/限制?或者对引擎的每个请求都会导致对“外部web服务器”的请求?在
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
函数,而是为不同的任务/部分使用多个函数,有没有特别好/不好的方法来构建它(例如“如何从何处屈服”)?在
为了回答您关于如何构建spider/最佳实践的问题,我通常会这样做:
避免构建在同一页面上工作的多个蜘蛛——因为目标网站的带宽通常是瓶颈,在网站上创建不必要的流量并不被认为是礼貌的抓取。
对同一个URL创建多个请求也是一样的:这可能会给目标网站造成不必要的流量,这不是很好的scraper行为。另外,scrapy在默认情况下过滤重复的请求,因此您可能会突然想知道为什么没有执行所有的请求。
(注:有一些方法可以解决这个问题,也可以使用代理等。。。但这让事情变得不必要复杂)
因此,如果您想避免大型解析方法执行许多不同的操作,请随意将其拆分。与你在自己的例子中建议的非常相似。我甚至会更进一步,将完整的处理步骤封装到单独的解析方法中,例如
基于这个模板,您甚至可能希望将不同的解析方法重构为不同的Mixin类。在
如果这是一个单一的网页,我会建议使用一个蜘蛛。请求页面一次并解析所需的所有数据(您可以为此使用一个或多个函数)。在
例如,我还建议使用物品
如果你想把你的爬网数据保存到一个数据库,你应该使用管道。在
相关问题 更多 >
编程相关推荐