• scrapy框架初识


    一.scrapy简介

       Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式
    ,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。
      五大核心组件工作流程:

      • 引擎(Scrapy)
        用来处理整个系统的数据流处理, 触发事务(框架核心)
      • 调度器(Scheduler)
        用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
      • 下载器(Downloader)
        用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
      • 爬虫(Spiders)
        爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
      • 项目管道(Pipeline)
        负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

    二.安装

      Linux:
    
          pip3 install scrapy
    
     
    
      Windows:
    
          a. pip3 install wheel
    
          b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    
          c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
    
          d. pip3 install pywin32
    
          e. pip3 install scrapy
    其实:应该还要装一个lxml,这之前在使用xpath的时候已经装了

    三.基础使用

      1.创建项目

    1.在命令行中使用命令进入即将创建爬虫项目的文件夹

    2.在命令行执行 scrapy starproject 爬虫项目名称(就会在当前文件夹创建项目名称的文件夹) ---->创建项目

    3.在命令行执行 cd 项目名称文件夹

    4.在命令行执行 scrapy genspider 爬虫文件名称 www.xxx.com -----创建爬虫文件(存放在spider文件夹)
      执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件
    5.
      5.


    注:各个文件描述:
      scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
      items.py 设置数据存储模板,用于结构化数据,如:Django的Model pipelines 数据持久化处理
      settings.py 配置文件,如:递归的层数、并发数,延迟下载等
      spiders 爬虫目录,如:创建文件,编写爬虫解析规则
      scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
      items.py 设置数据存储模板,用于结构化数据,如:Django的Model pipelines 数据持久化处理
      settings.py 配置文件,如:递归的层数、并发数,延迟下载等 spiders 爬虫目录,如:创建文件,编写爬虫解析规则

         2.查看一下爬虫文件的内容

    import scrapy
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai' #应用名称
        #允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
        allowed_domains = ['https://www.qiushibaike.com/']
        #起始爬取的url
        start_urls = ['https://www.qiushibaike.com/']
    
         #访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll 
         def parse(self, response):
            print(response.text) #获取字符串类型的响应内容
            print(response.body)#获取字节类型的相应内容

      3.修改配置

    在stttings文件中:修改配置:
      1.修改robots协议,表示我们不准从robots协议
        ROBOTSTXT_OBEY = False

      2.UA伪装
        默认是这样的:
    USER_AGENT = 'firstblood (+http://www.yourdomain.com)'
        修改:USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
               Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400'

      4.执行爬虫程序

    1.在命令行进入所在项目文件夹

    2. 执行scrapy crawl 爬虫文件名称 --nolog (表示不打印日志)

       5.本地持久化存储

    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai'
        # allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.qiushibaike.com/text/']
    
    
        def parse(self, response):
            all_data = []
            div_list=response.xpath('//div[@id="content-left"]/div')
            for div in  div_list:
                # author=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
                #这边xpath解析出来的是一个select对象列表,我们要从select对象拿出数据data
                #必须执行extract,extract_first这种方法你必须保证,select对象只有一个数据
    #当你的解析写的不对的话,返回给你的是一个None值 author=div.xpath('./div[1]/a[2]/h2/text()').extract_first() #extract(),这个方法是取出select对象的所有data content=div.xpath('./a[1]/div/span//text()').extract() content=''.join(content) dic={ 'author':author, 'content':content } all_data.append(dic) # 1.基于终端命令的持久化存储,不支持txt,支持csv,jsason等等 #返回给终端执行命令进行终端本地持久化存储 return all_data

    执行命令:scrapy crawl qiubai -o qiushibaike.csv

    scrapy框架的我们常用的xpath并不是同一个,有点差别,器解析出来的是select对象,数据存放在select对象的data当中

    支持的本地存储格式


       debug信息的认识

      

      6.管道本地持久化储存

    #还有大前提就是要使用管道持久化存储,必须去settings.py把这边的注释给放开
    #要通过中间件持久化存储必须放开这个注释,字典后面的数字表示优先级
    #数字越小优先级越高
    ITEM_PIPELINES = {
    'QiuBaiPRO.pipelines.QiubaiproPipeline': 300,
    }

    #
    爬虫文件 # -*- coding: utf-8 -*-
    import scrapy from QiuBaiPRO.items import QiubaiproItem
    class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.qiushibaike.com/text/'] # 2.基于管道的持久化存储(基于管道的持久化存储必须写下管道文件当中) def parse(self,response): div_list=response.xpath('//div[@id="content-left"]/div') for div in div_list: author=div.xpath('./div[1]/a[2]/h2/text()')[0].extract() content=div.xpath('./a[1]/div/span//text()').extract() content=''.join(content) #实例话一个item对象(容器) item=QiubaiproItem() item['author']=author item['content']=content #返回给pipline去持久化存储 yield item #items.py import scrapy class QiubaiproItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() 创建容器 author=scrapy.Field() content=scrapy.Field()

    #piplines.py # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    from scrapy.exceptions import DropItem
    class QiubaiproPipeline(object): 
      f
    =None # 开启爬虫时执行程序执行一次,重写父类的方法,可以开启数据库等,要记得参数有一个spider不要忘记了
      def open_spider(self,spider):
        self.f
    =open('./qiushibaike.txt','w',encoding='utf-8') #提取处理数据(保存数据)
      def process_item(self, item, spider): self.f.write(item['author']+':'+item['content']+' ')
         #raise DropItem() # 后续的 pipeline的process_item方法不再执行
         return item #要记得把数据返回给下一个存储的,要不然下一个存储的就拿不到数据了     
    #.关闭爬虫时执行也是只执行一次,重写父类方法,可以关闭数据库等,重写父类要要有参数spider,不要忘记了 def colse_spider(self,spider): self.f .close()

          7.管道mysql储存

    
    
    #还有大前提就是要使用管道持久化存储,必须去settings.py把这边的注释给放开
    
    
    #要通过中间件持久化存储必须放开这个注释,字典后面的数字表示优先级
    #数字越小优先级越高
    ITEM_PIPELINES = {
    'QiuBaiPRO.pipelines.QiubaiproPipeline': 300,
    }



    爬虫文件:
    # -*- coding: utf-8 -*- import scrapy from QiuBaiPRO.items import QiubaiproItem class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.qiushibaike.com/text/'] # 2.基于管道的持久化存储(基于管道的持久化存储必须写下管道文件当中) def parse(self,response): div_list=response.xpath('//div[@id="content-left"]/div') for div in div_list: try : author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract() except Exception as e: print(e) continue content = div.xpath('./a[1]/div/span//text()').extract() content = ''.join(content) # 实例话一个item对象(容器) item = QiubaiproItem() item['author'] = author item['content'] = content # 返回给pipline去持久化存储 yield item #pipline.py class Mysql_PipeLine(object): conn=None cursor=None def open_spider(self,spider): self.conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',db='qiubai') def process_item(self, item, spider): self.cursor=self.conn.cursor() print(item['author']) try: self.cursor.execute('insert into qiubai values ("%s","%s")'% (item['author'],item['content'])) self.conn.commit() except Exception as e: # print(e)
           return item  #要记得把数据返回
      def close_spider(self,spider):
      self.cursor.close()
      self.conn.close()
     

      8.redis同理

    class Redis_PipeLine(object):
        conn=None
        def open_spider(self,spider):#m没有设置密码就先不设置了
            self.conn=Redis(host='127.0.0.1',port=6379,)
        def process_item(self,item,spider):
            dic={
                'author':item['author],
                'content':item['content']
            }
            self.conn.lpush('qiubai',dic)
        return item #要记得把数据返回
    #不要关闭,局部用重写方法,也不需要提交

    #redis如果使用不了要指定redis的版本
    pip install -U redis==2.10.6

       9.scrapy中一些常用的属性

    我们所有自己写的爬虫都是继承与spider.Spider这个类
    
    name
    
    定义爬虫名字,我们通过命令启动的时候用的就是这个名字,这个名字必须是唯一的
    
    allowed_domains
    
    包含了spider允许爬取的域名列表。当offsiteMiddleware启用时,域名不在列表中URL不会被访问
    所以在爬虫文件中,每次生成Request请求时都会进行和这里的域名进行判断
    
    start_urls
    
    起始的url列表
    这里会通过spider.Spider方法中会调用start_request循环请求这个列表中每个地址。
    
    custom_settings
    
    自定义配置,可以覆盖settings的配置,主要用于当我们对爬虫有特定需求设置的时候
    
    设置的是以字典的方式设置:custom_settings = {}
    
    from_crawler
    
    这是一个类方法,我们定义这样一个类方法,可以通过crawler.settings.get()这种方式获取settings配置文件中的信息,同时这个也可以在pipeline中使用
    
    start_requests()
    这个方法必须返回一个可迭代对象,该对象包含了spider用于爬取的第一个Request请求
    这个方法是在被继承的父类中spider.Spider中写的,默认是通过get请求,如果我们需要修改最开始的这个请求,可以重写这个方法,如我们想通过post请求
    
    make_requests_from_url(url)
    这个也是在父类中start_requests调用的,当然这个方法我们也可以重写
    
    parse(response)
    这个其实默认的回调函数
    负责处理response并返回处理的数据以及跟进的url
    该方法以及其他的Request回调函数必须返回一个包含Request或Item的可迭代对象或者dict或者None对象(解析完成的数据要构造成这几种格式才能发送给pipeline处理,否则会报错)

     Spider must return Request, BaseItem, dict or None

     
  • 相关阅读:
    Spring Junit 读取WEB-INF下的配置文件
    cron表达式详解
    jQuery.Validate验证库
    CentOS6.x升级MySQL版本5.1到5.6
    Linux下部署
    jQuery插件之ajaxFileUpload
    javascript深入理解js闭包
    STM32常用参考资料
    STM32点灯需要的文件
    【编程1】写一个函数判断系统是大端还是小端
  • 原文地址:https://www.cnblogs.com/tjp40922/p/10458040.html
Copyright © 2020-2023  润新知