zoukankan      html  css  js  c++  java
  • Python网络爬虫——Scrapy框架简介和应用

    一.什么是Scrapy?

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

    - scrapy:爬虫框架
    - 具有哪些功能:异步爬取,高性能的数据解析+持久化存储操作
    - 框架:集成了很多功能且具有很强通用性的一个项目模板
    - 如何学习框架:
      - 学习框架爱的功能模块的具体使用
    - 环境的安装:

      - linux

        - pip3 install scrapy

      - windows
      - 1.pip3 install wheel
      - 2.下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
      - 3.进行下载目录,执行pip3 install Twisted‑19.7.0‑cp37‑cp37m‑win_amd64.whl
      - 4.pip3 install pywin32
      - 5.pip3 install scrapy

    - 使用流程:
      - 创建一个工程:scrapy startproject firstBlood
      - cd firstBlood(进入项目目录)
      - 创建爬虫文件:scrapy genspider first www.xxx.com
      - 执行:scrapy crawl first 【不显示日志后面加--nolog】

    - 目录图片:

        

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

    - 编写爬虫文件:在步骤2执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:

    # -*- coding: utf-8 -*-
    import scrapy
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai' #应用名称
        #允许爬取的域名(如果遇到非该域名的url则爬取不到数据)【一般注释掉】
        allowed_domains = ['https://www.qiushibaike.com/']
        #起始url列表:列表中存放的url都会被scray进行自动的请求发送
        start_urls = ['https://www.qiushibaike.com/']
    
         #访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll 
         def parse(self, response):
            print(response.text) #获取字符串类型的响应内容
            print(response.body)#获取字节类型的相应内容

    - 设置修改settings.py配置文件相关配置:

    修改内容及其结果如下:
    19行:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' # 伪装请求载体身份
    22行:ROBOTSTXT_OBEY = False  # 可以忽略或者不遵守robots协议
    - 执行爬虫程序:scrapy crawl  应用名称【后面加--nolog,不会输出日志文件】

    - 持久化存储:
      - 基于终端指令:scrapy crawl qiubai -ofilepath.csv
        - 好处:便捷
        - 弊端:局限性强(只可以将数据写入本地文件,文件后缀有要求)
      - 基于管道
        - 基于持久化存储的所有操作都必须写入到管道文件的管道类中

    - 日志类型:INFO DEBUG ERROR

      - LOG_LEVEL= 'ERROR'【setting最后加入这句,日志只打印错误信息】

    总结:

    - scrapy框架基本使用
      - 创建工程
        - 终端指令:scrapy startproject ProName
      - 创建爬虫文件【创建在指定目录中】
        - cd ProName
        - scrapy genspider SpiderName www.xxx.com
      - 爬床类的相关属性和方法
        - 爬虫文件的名称:name【名称唯一】【运行时通过name找到对应文件】
        - 起始的url列表:start_urls【存储url,会被scrapy自动的请求发送,有多少url就发送多少期请求】
        - parse方法:【用来解析start_urls列表中url对应的响应数据,start_urls中有多少url就调用多少次parse方法】
          - response.xpath()【返回存储selector对象的列表】-->[selector,selector]
            - extract()【拿到xpath返回所有列表中selector对象】
            - extract_first()【拿到selector对象列表中对应的第0个数据】
      - 数据持久化存储
        - 基于终端指令持久化存储
          - scrapy crawl SpiderName -o ./file【执行爬虫文件时】
          - 只可以将parse方法的返回值进行持久化存储【将解析到的数据以字典形式添加到列表中】
        - 基于管道持久化存储
          - 编码流程:
            - 数据解析【parse方法】
            - 在item类中声明相关属性,用于存储解析到的数据【xxx = scrapy.Field()】
            - 将解析到的数据存储封装到item类型的对象中【item = item文件中的类()】【item['xxx']=xxx】
            - 将item对象提交给给管道类【yield item】
            - item会被管道类中的proce_item方法中的item参数进行接收
            - process_item方法中编写基于item持久化存储的操作【存储到本地/数据库】
            - 在配置文件【setting】中开启管道
          - 管道细节处理:
            - 管道文件中一个类对应的是什么?
              - 一个类表示的是将解析到的数据存储到某一个具体的平台中
            - process_item方法中的返回值表示什么含义?
              - 【return item】是将item传递给下一个即将被执行的管道类
            - open_spider,close_spider
              - 重写父类的两种方法,爬虫开启,爬虫结束各调用一次

    实例:城市名获取

    #1.爬虫文件
    # -*- coding: utf-8 -*-
    import scrapy
    from pachong.items import PachongItem
    
    class A111Spider(scrapy.Spider):
        name = '111'
        # allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.aqistudy.cn/historydata/']
    
        def parse(self, response):
            lis = response.xpath('//div[@class="hot"]/div[2]/ul/li')
            for li in lis:
                city_name = li.xpath('./a/text()').extract_first()
                item = PachongItem()
                item['city_name'] = city_name
    
                yield item
    # ------------------------------------------------------------------
    #2.items文件
    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class PachongItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        city_name = scrapy.Field()
    #-----------------------------------------------------------------
    #3.pipelines管道文件
    # -*- 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
    
    
    class PachongPipeline(object):
        f = None
        def open_spider(self,spider):
            print('开始爬取数据......')
            self.f = open('./111.txt','w',encoding='utf-8')
    
        def process_item(self, item, spider):
            city_name = item['city_name']
            self.f.write(city_name+'
    ')
    
            return item
        def close_spider(self,spider):
            print('结束爬取......')
            self.f.close()
    #-------------------------------------------------------------
    #4.setting文件
    # -*- coding: utf-8 -*-
    
    # Scrapy settings for pachong project
    
    BOT_NAME = 'pachong'
    
    SPIDER_MODULES = ['pachong.spiders']
    NEWSPIDER_MODULE = 'pachong.spiders'
    
    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    
    # Configure item pipelines
    # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {
       'pachong.pipelines.PachongPipeline': 300,
    }
    
    # 设置显示的日志类型
    LOG_LEVEL = 'ERROR'
  • 相关阅读:
    Jmeter安装与环境部署
    BVT & BAT (版本验证测试和版本验收测试)
    测试计划(Test Plan)
    小米8se从miui12降级刷机手记
    网络传输---HttpURLConnection
    mybatis 中 foreach collection的三种用法
    XStream--java对象与xml形式文件相互转换
    idea问题总结记录
    ssh框架配置过程
    ssm框架配置过程
  • 原文地址:https://www.cnblogs.com/bilx/p/11575615.html
Copyright © 2011-2022 走看看