zoukankan      html  css  js  c++  java
  • 11.scrapy框架简介和基础应用

    一、什么是Scrapy???

        Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。

        所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。

        对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

    二、Scrapy安装

      Linux:

          pip3 install scrapy

      Windows:

          a. pip3 install wheel

          b. 下载twisted框架,下载与cpython版本对应的版本   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

       安装成功之后可以输入可以通过输入scrapy检测是否安装成功,

       注意:

          不管比在任何地方进行安装,都默认是全局安装

         

    三、基础使用

      注意:在操作使用scrapy框架的时,所有的执行命令都需要通过cmd命令行去操作

      1. 创建项目: scrapy  startproject  项目名称

        注意:创建项目的时候要切换到创建目录的文件夹下面  

        

     项目目录结构:

        

       spiders      爬虫目录,必须要在这个目录下面,新创建一个爬虫文件(就是一个py文件)   如:创建文件,编写爬虫解析规则
       scrapy.cfg   项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
           注意: 这个文件千万不要去打开,更不要去修改它里面的内容
       items.py     设置数据存储模板,用于结构化数据,如:Django的Model
       middlewares.py  中间件应用
       pipelines    管道,做通信使用,数据持久化处理   
    settings.py 配置文件,如:递归的层数、并发数,延迟下载等

      2. 创建爬虫应用程序

        2.1  首先,要进入项目目录

           cd project_name(项目名称)

        2. 2  创建爬虫文件

          scrapy genspider  爬虫文件的名称  爬取网页的起始url 

          列如:scrapy genspider  baidu  www.baidu.com

        

      3. 编写爬虫文件:在步骤2执行完毕,会在项目的spiders目录下面生成一个应用名的py爬虫文件

       源码如下:

      # -*- coding: utf-8 -*-
      import scrapy
    
    
      # FirstSpider类名是指定好的,继承了scrapy.Spider父类
      # 进行数据的爬取和解析
      class FirstSpider(scrapy.Spider):
          # 爬虫文件的名称: 根据名称可以定位到当前的爬虫文件
          name = 'first'
          # 允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
          # 通常情况下,我们将这个域名注释掉
          allowed_domains = ['www.baidu.com']
          # 起始爬取的url列表,里面可以有多个url,
          # 通常我们一个爬虫项目中只写一个url
          start_urls = ['http://www.baidu.com/']
    
          # parse是访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的
          # url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll
          # 简单来说:response就是起始url对应的响应对象
          def parse(self, response):
              print(response)
              # print(response.text) # 获取的是字符串类型的响应内容
              # print(response.body) # 获取的是字节类型的响应内容

      4.设置修改setting.py配置文件相关配置

      修改内容及其结果如下:

        19行: USER_AGENT 默认是注销的更改为如下:

              USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'

              UA反扒机制,进行伪装请求载体身份操作

        20行: ROBOTSTXT_OBEY = False

            默认是true更改为false,可以忽略或者不遵守robots协议

      5. 执行爬虫程序:

          scrapy crawl  爬虫文件名称

             scrapy crawl  爬虫文件名称 --nolog  

          执行爬虫程序的时候,默认是有日志打印,在其后面添加 --nolog表示曲线日志打印

      示例: 将糗百首页中段子的内容和标题进行爬取

      # -*- coding: utf-8 -*-
      import scrapy
    
    
      class QiubaidemoSpider(scrapy.Spider):
          name = 'qiubaiDemo'
          # allowed_domains = ['www.xxxx.com']
          start_urls = ['https://www.qiushibaike.com/text/']
          def parse(self, response):
              # xpath为response中的方法,可以将xpath表达式直接作用于该函数中
              div_list = response.xpath('//div[@id="content-left"]/div')
              # 用于存储解析到的数据
              dic_data = []
    
              for div in div_list:
                  # xpath函数返回的为列表,列表中存放的数据(div)为Selector类型的数据
                  # title = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()')[0].extract()
                  # content = div.xpath('./a/div/span[1]/text()')[0].extract()
                  title = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()').extract_first()
                  content = div.xpath('./a/div/span[1]/text()').extract_first()
    
                  # 将解析到的数据封装到字典中
                  dic = {
                      "title":title,
                      "content":content
                  }
                  # 将数据储存到dic_data这个列表中
                  dic_data.append(dic)
                  # 基于终端指令的持久化存储:可以通过终端指令的形式将parse方法的返回值中存储的数据进行本地磁盘的持久化存储
              return dic_data

    所用知识点详解:

      1. xpath为response中的方法,可以将xpath表达式直接作用于该函数中

       response.xpath()

         2. xpath函数返回的为列表,列表中存放的数据为Selector类型的数据

       3. 我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出

         注意:

          extract()  取出的是多个内容值,

            如果Selector对象中只有一个对象值,我们可以通过extract_first()来获取

        示例:

          title = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()')[0].extract()
         title = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()').extract_first()
          这两种方法都是取一个值,但建议使用下面这种方法

       4. 储存数据的方法都是一样的

         4.1   先把将解析到的数据封装到字典中

         4.2   创建一个空列表 ,用于储存解析到数据

         4.3   把封装的字典,添加列表中

         4.4    把列表返回,在做持续化存储

      注意: 千万不要忘记配置setting文件

  • 相关阅读:
    python爬虫,scrapy,获取响应的cookie,获取返回的cookie
    this指向
    闭包的10种形式
    nodejs 公私钥文件加密解密
    mysql基础知识
    nodejs 连接mysql 集群,开启事务,事务回滚封装
    pm2 启动eggjs,
    js身份证验证,二代身份证,大陆,权重验证,正规
    nodejs限制IP一段时间内的访问次数
    nodejs链接mysql集群,nodejs PoolCluster : Error: Too many connections
  • 原文地址:https://www.cnblogs.com/mwhylj/p/10250108.html
Copyright © 2011-2022 走看看