scrapy arguments:指定蜘蛛参数爬取

时间:2018-01-21 15:27作者:scrapy中文网阅读:

本来截止上一文档:《scrapy爬取下一页》,scrapy快速入门,该入的也入了差不多了,也该结束了,但编写scrapy文档的骚年却意犹未尽,在这里又给我们提到了Using spider arguments,这个东西对于许多朋友来说,简直是雪中送炭,因为有了参数配置爬取,就能加大我们爬取的灵活性,而不必重复修改、编写蜘蛛代码,举个栗子:

比如我们要爬取http://lab.scrapyd.cn里面的数据,原先我们需要全站的,于是我们写呀、写呀,终于写了一个全站爬虫(其实就是上一文档的内容即可全站爬取);过了几天需求变了,我们只需要:“人生”这个标签下面的内容,那我们又需要更改爬虫;又过了几天,需求又变,我们又需要标签:“励志”下面的内容,那我们又得改爬虫……最终出现下面的情况:
for{
  又过了几天……需求又变……又改……
}

如果爬虫量少还好,那如果有十个、一百个……那一天到晚我们只能不断的修改、不断的伺候这些爬虫了,于是性生活都没有了!那怎样才能让我们的爬虫更灵活呢?scrapy给我提供了可传参的爬虫,有了这么个功能,那人生就更加美丽了,上面不断变化的爬虫我们就可以这样来玩,首先按scrapy 参数格式定义好参数,如下:
    def start_requests(self):
        url = 'http://lab.scrapyd.cn/'
        tag = getattr(self, 'tag', None)  # 获取tag值,也就是爬取时传过来的参数
        if tag is not None:  # 判断是否存在tag,若存在,重新构造url
            url = url + 'tag/' + tag  # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
        yield scrapy.Request(url, self.parse)  # 发送请求爬取参数内容
可以看到   tag = getattr(self, 'tag', None)  就是获取传过来的参数,然后根据不同的参数,构造不同的url,然后进行不同的爬取,经过这么一个处理,我们的蜘蛛就灰常的灵活了,我们来看一下完整代码:
# -*- coding: utf-8 -*-

import scrapy


class ArgsspiderSpider(scrapy.Spider):

    name = "argsSpider"

    def start_requests(self):
        url = 'http://lab.scrapyd.cn/'
        tag = getattr(self, 'tag', None)  # 获取tag值,也就是爬取时传过来的参数
        if tag is not None:  # 判断是否存在tag,若存在,重新构造url
            url = url + 'tag/' + tag  # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
        yield scrapy.Request(url, self.parse)  # 发送请求爬取参数内容

    """
    以下内容为上一讲知识,若不清楚具体细节,请查看上一讲!
    """

    def parse(self, response):
        mingyan = response.css('div.quote')
        for v in mingyan:
            text = v.css('.text::text').extract_first()
            tags = v.css('.tags .tag::text').extract()
            tags = ','.join(tags)
            fileName = '%s-语录.txt' % tags
            with open(fileName, "a+") as f:
                f.write(text)
                f.write('\n')
                f.write('标签:' + tags)
                f.write('\n-------\n')
                f.close()
        next_page = response.css('li.next a::attr(href)').extract_first()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

代码写好之后,那我们要如何传参呢?如何运行呢?比如我们要爬取标签:爱情,我们可以这样:
scrapy crawl argsSpider -a tag=爱情
要爬取标签:励志,我们可以这样:
scrapy crawl argsSpider -a tag=励志
参数:tag=爱情、tag=励志就可以在爬取的时候传进去我们蜘蛛里面,我们就可以不修改蜘蛛,愉快的爬取了!更多关于scrapy arguments的细节,后面scrapy中文文档我们还会再详谈,这里的话先用上面的栗子给大家卖卖关子,你可以先下载源码运行了试试看,感受一下scrapy的灵活!

argSpider源码:github



评论去哪里了?

由于搜狐畅言广告越来越丧心病狂,用它一个评论,半个网页都被它占领,感觉已经把灵魂出卖给了魔鬼!SO,为了息众怒小编只能暂且关闭评论,若您实在想找我说话,欢迎关注公众号,给我留言,么么哒!