天天看点

@onsubmit 向方法传递参数_Scrapy中传入自定义参数

@onsubmit 向方法传递参数_Scrapy中传入自定义参数
简介

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

@onsubmit 向方法传递参数_Scrapy中传入自定义参数

如果指定美食街等板块,就能自动采集该板块的内容会比较方便。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