irpas技术客

自定义注解传入动态参数_Scrapy中传入自定义参数_老宋的茶书会

irpas 7376

简介

在爬虫程序中,有时候我们想要获取整个网站的信息,所以我们写了一个整站爬虫的程序,但是有时候这样也不是很方便,因为采集时间比较长,而有时候我们又只想采集该网站下的某一个板块的内容。例如下面的网站中:

如果指定美食街等板块,就能自动采集该板块的内容会比较方便。Scrapy中是允许我们这样做的!!

通常我们执行Scrapy的时候是类似这样的:scrapy crawl spiderName

在加入参数后我们可以这样执行:

scrapy crawl spiderName -a parameter1=value1 -a parameter2=value2

我们可以增加分类或者其他参数来命令爬虫。爬虫文件中可以获取这些参数:

class MySpider(Spider): name = 'myspider' ... def parse(self, response): ... if self.parameter1 == value1: # this is True ? # or also if getattr(self, parameter2) == value2: # this is also True

通过使用-a可以向爬虫文件中定义的类传递属性,然后在该类中获取该属性即可实现传入自定义参数。

Scrapy的源码是这样写的:

class Spider(object_ref): """Base class for scrapy spiders. All spiders must inherit from this class. """ # 爬虫名字 name = None # 常用设置 custom_settings = None ? def __init__(self, name=None, **kwargs): if name is not None: self.name = name elif not getattr(self, 'name', None): raise ValueError("%s must have a name" % type(self).__name__) self.__dict__.update(kwargs) # hasattr() 用于判断对象是否包含某属性 if not hasattr(self, 'start_urls'): self.start_urls = []

通过-a参数传递的变量其实就是通过初始化方法传递进来的,当然也可以自定义这样的方法:

import scrapy ? ? class QuotesSpider(scrapy.Spider): name = 'quotes' allowed_domains = ['quotes.com'] ? def __init__(self,num='', *args,**kwargs): super().__init__(*args, **kwargs) self.num = num self.start_urls = [f'http://quotes.com/{self.num}']

当然还可以通过getattr来获取对象的属性:

import scrapy ? ? class QuotesSpider(scrapy.Spider): name = 'quotes' allowed_domains = ['quotes.com'] ? def start_requests(self): num = getattr(self, num, False) if num: url = f'hppt://quotes.com/{num}' yield scrapy.Request(url)

通过命令:scrapy crawl quotes -a num=7来执行

关于作者:

****************************************

姓名:麦艳涛网名:挖掘机小王子Q群:581465069

****************************************

转载请注明出处:https://zhuanlan.zhihu.com/p/62584367


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #自定义注解参数动态参数 #crawl