Scrapy框架总结

一、Scrapy框架的使用步骤:

    1. 创建项目:
      scrapy startproject project_name
    1. cd进项目目录:
      cd project_name
    1. 创建项目应用程序:
      scrapy genspider app_name start_url
    1. 编写爬虫文件代码、settings配置:
      codes........
    1. 执行爬虫程序:
      scrapy crawl app_name

二、Scrapy初始Url的两种写法:

  • 一种是常量start_urls,并且需要定义一个方法parse()
import scrapy
class simpleUrl(scrapy.Spider):
    name = "simpleUrl"
    start_urls = [  #另外一种写法,无需定义start_requests方法
        'http://lab.scrapyd.cn/page/1/',
        'http://lab.scrapyd.cn/page/2/',
    ]
    # 此方法名必须为:parse
    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'mingyan-%s.html' % page
        with open(filename, 'wb') as f:
          f.write(response.body)
        self.log('保存文件: %s' % filename)
  • 另一种是直接定义一个方法:star_requests()
import scrapy
class simpleUrl(scrapy.Spider):
     name = "simpleUrl"

     def start_requests(self):
         urls = [ 
            #爬取的链接由此方法通过下面链接爬取页面
            'http://lab.scrapyd.cn/page/1/',
             'http://lab.scrapyd.cn/page/2/',
         ]
         for url in urls:
             yield scrapy.Request(url=url, callback=self.parse)

三、Scrapy调试工具之scrapy shell使用方法:

调试就是验证scrapy到底有木有提取到数据的工具,如果木有它你根本不知道你写的规则到底有木有提取到数据,所以这个工具是个刚需!其实也很简单,就是在命令行输入下面一行代码而已:
scrapy shell start_url:注意:执行此命令时需先cd到项目目录下

Scrapy框架总结_第1张图片
屏幕快照 2018-11-19 下午8.03.38.png

比如我们想提取 http://lab.scrapyd.cntitle,我们可以在 [s]: 后面输入: response.css('title') ,然后回车, 立马就得到如下结果:
response

似不似很直观的验证了你提取的数据对不对?如果正确了,我们再把上面的代码放到我们蜘蛛里面,那这样就会正确的得到你想要的数据,而不会出现意外了,这就是scrapy调试工具的应用!

四、Scrapy 爬取下一页,scrapy整站爬取

接下来,还是继续爬取:http://lab.scrapyd.cn (链接独白:为神马受伤的总是我?)!我们既然要爬取下一页,那我们首先要分析链接格式,找到下一页的链接,那爬取就简单了

Scrapy框架总结_第2张图片
image.png

主要代码实现

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 arguments:指定蜘蛛参数爬取

Using spider arguments,这个东西对于许多朋友来说,简直是雪中送炭,因为有了参数配置爬取,就能加大我们爬取的灵活性,而不必重复修改、编写爬虫代码了。
  比如我们要爬取http://lab.scrapyd.cn里面的数据,原先我们需要全站的,过了几天需求变了,我们只需要:“人生”这个标签下面的内容,那我们又需要更改爬虫代码,又过了几天,需求又变,我们又需要标签:“励志”下面的内容,那我们又得改爬虫……
  如果爬虫量少还好,那如果有十个、一百个……那一天到晚我们只能不断的修改、不断的伺候这些爬虫了!
  那怎样才能让我们的爬虫更灵活呢?scrapy给我提供了可传参的爬虫,有了这么个功能,那人生就更加美丽了,上面不断变化的爬虫我们就可以这样来玩,首先按scrapy 参数格式定义好参数,如下:

import scrapy


class ArgsspiderSpider(scrapy.Spider):
    name = "argsSpider"

    def start_requests(self):
        url = 'http://lab.scrapyd.cn/'
        # 获取tag值,也就是爬取时传过来的参数
        tag = getattr(self, 'tag', None)
        # 判断是否存在tag,若存在,重新构造url
        if tag is not None:
            # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
            url = url + 'tag/' + 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命令明细:

1. Scrapy框架的命令也就十四五个,最常用的命令也就三个,即:
  scrapy startproject(创建项目)、
  scrapy crawl XX(运行XX蜘蛛)、
  scrapy shell http://www.scrapyd.cn(调试网址为http://www.scrapyd.cn的网站)

2. scrapy命令分为:全局命令、项目命令;
  很好理解,全局命令就是在哪都能用;项目命令就是只能依托你的项目

全局命令

  • startproject:
    创建项目
    scrapy startproject(创建项目)
  • genspider:
    这个命令的话是根据爬虫模板创建爬虫py文件的命令
    scrapy genspider spider_app_name start_url
  • settings:
    看字面意思,相信聪明的你已经知道它是干嘛的了!其实它就是方便你查看到你对你的scray设置了些神马参数!
    比如我们想得到爬虫项目的下载延迟,我们可以使用:
    scrapy settings --get DOWNLOAD_DELAY
    比如我们想得到爬虫项目的名字:
    scrapy settings --get BOT_NAME
  • runspider:
    这个命令有意思,之前我们运行爬虫项目除了使用:scrapy crawl XX之外,我们还能用:runspider,前者是基于项目运行,后者是基于文件运行,也就是说你按照scrapy的爬虫项目格式编写了一个py文件,那你不想创建项目,那你就可以使用runspider,比如你编写了一个:scrapyd_cn.py的爬虫文件,你要直接运行就是:
    scrapy runspider scrapy_cn.py
  • shell:
    这个命令比较重要,主要是调试用
    scrapy shell [http://www.scrapyd.cn](http://www.scrapyd.cn/)
  • fetch:
    这个命令其实也可以归结为调试命令的范畴!它的功效就是模拟我们的蜘蛛下载页面,也就是说用这个命令下载的页面就是我们蜘蛛运行时下载的页面,这样的好处就是能准确诊断出,我们的到的html结构到底是不是我们所看到的,然后能及时调整我们编写爬虫的策略!
    scrapy fetch [http://www.scrapyd.cn](http://www.scrapyd.cn/)
  • version:
    查看scrapy版本
    scrapy version

项目命令

  • crawl:
    运行爬虫文件
    scrapy crawl my_project
  • check:
    检查爬虫文件
    scrapy check my_project
  • list:
    显示有多少个爬虫文件
    scrapy list
  • edit:
    编辑文件(类似于linux系统下的vim)
    scrapy edit my_project
  • parse
    常用参数预览
    scrapy parse my_project
  • bench
    项目详细运行情况
    scrapy bench my_project

参考Scrapy中文网

你可能感兴趣的:(Scrapy框架总结)