在爬虫程序中,有时候我们想要获取整个网站的信息,所以我们写了一个整站爬虫的程序,但是有时候这样也不是很方便,因为采集时间比较长,而有时候我们又只想采集该网站下的某一个板块的内容。例如下面的网站中:
如果指定美食街等板块,就能自动采集该板块的内容会比较方便。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