zoukankan      html  css  js  c++  java
  • 爬虫 第八天

    爬虫 第八天

    • xpath表达式中可以使用管道符是的xpath表达式更加具有通用性
      xpath('./div/p//text() | ./span/a/div//text()')
      strip('/ ')

    scrapy如何爬取图片数据(ImagePileLine)
    - 爬虫文件中将二进制资源的url进行爬取和解析,将其存储到item中向管道提交
    - 在管道文件中指定对应的管道类
    - 父类:from scrapy.pipelines.images import ImagesPipeline
    - 配置文件中:
    - #自动创建一个指定的文件夹:IMAGES_STORE = './imgsLib'
    - 自定义一个基于ImagesPipeline该父类的管道类,重写如下三个方法:
    #发起请求
    def get_media_requests(self,item,info):
    print(item)
    img_src = item['img_src']
    #请求传参,将meta字典传递给了file_path这个方法
    yield scrapy.Request(url=img_src,meta={'item':item})

                #定制get_media_request请求到数据持久化存储的路径(文件夹的路径+文件名称)
                def file_path(self,request,response=None,info=None):
                    #通过request.meta接收请求传参传递过来的meta字典
                    img_name = request.meta['item']['img_name']
                    return img_name
    
                #将item传递给下一个即将被执行的管道类
                def item_completed(self,request,item,info):
                    return item
    

    CrawlSpider全站数据爬取
    - CrawlSpider就是Spider的一个子类
    - 如何创建一个基于CrawlSpider的一个爬虫文件
    - scrapy genspider -t crawl spiderName www.xxx.com
    - LinkExtractor(Allow="正则表达式"):链接提取器
    - 作用:根据指定的规则(Allow)进行url的提取
    - 注意:Allow=“”:可以将网站的所有链接都捕获到
    - Rule(link,callback,fllow=True):规则解析器
    - 作用:
    - 1.接受到link提取到的链接,然后对其进行请求发送
    - 2.根据指定规则对请求到的数据进行数据解析
    - follow=True:将链接提取器 继续作用到 链接提取器 提取到的链接 对应的页面源码中

    - 深度爬取:
        - 让手动请求发送,请求传参和LinkExtractor,Rule一起使用实现深度爬取
    

    分布式
    - 概念:搭建一个分布式机群,共同执行一组代码,联合对同一个资源的数据进行分布且联合爬取
    - 实现方式:
    - 简称:scrapy+redis
    - 全程:Scrapy框架+scrapy-redis组件
    - 原生的scrapy框架是无法实现分布式
    - 原生scrapy中的调度器和管道无法被共享
    - scrapy-redis组件的作用
    - 可以给原生的scrapy框架提供可以被共享的管道和调度器
    - 环境的安装:
    - pip install scrapy-redis
    - 实现流程:
    - 修改爬虫文件中爬虫类对应的操作
    - 1.导包:from scrapy_redis.spiders import RedisCrawlSpider
    - 2.将爬虫类的父类修改成RedisCrawlSpider
    - 3.将start_url删除,添加一个redis_key=‘可以被共享调度器队列的名称’
    - 4.进行常规的请求和解析和向管道提交item的操作即可
    - 对settings.py配置
    - 配置管道:
    ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400
    }
    - 调度器的配置:
    # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
    SCHEDULER_PERSIST = True
    增量式

             - 对redis进行配置
                REDIS_HOST = 'redis服务的ip地址'
                REDIS_PORT = 6379
    
        - redis的配置文件进行修改:redis.windows.conf
            - 56行:#bind 127.0.0.1
            - 75行:protected-mode no
    
        - 启动redis服务和客户端:
            - 携带配置文件启动redis服务:
                - redis-server.exe redis.windows.conf
            - 启动客户:
                - redis-cli
    
         - 启动程序:
            - 在终端中进入到爬虫文件对应的目录中:
                - scrapy runspider fbs.py
         - 向调度器的队列中仍入一个起始的url:
            - redis-cli:
                - lpush redis_key的属性值  www.xxx.com
    

    增量式爬虫

    • 监测网站数据更新的情况。以便于爬取到最新更新出来的数据
      • 核心:去重
        • 记录表:
      • 特性:永久性存储 (redis中的set)
      • 作用:记录爬取过的数据对应的url
        • 可以以明文的形式存储(url数据长度较短)
        • 记录的数据对其生成一个【数据指纹】(url数据长度长)
          • 数据指纹就是该组数据的唯一标识
  • 相关阅读:
    mssql 循环的写法,备用
    用了十几年的windows记录下我不知道的几个快捷键
    折腾了下java下webservice,折腾了大半天,居然是eclipse的版本不对
    连接Linux 下mysql 慢的问题,解决之
    解决windows7蓝屏的方法
    MySQL錯誤:Value '00000000' can not be represented as java.sql.Date解決方法[转]
    jdbc连接三种数据库的连接语句写法(备查)
    遇到一个json解析的错误,费了好大的劲,最后发现是少了一个包
    【转】The reference to entity "characterEncoding" must end with the ';' delimiter
    synaptics 插入USB鼠标禁用,网上
  • 原文地址:https://www.cnblogs.com/bky20061005/p/12180195.html
Copyright © 2011-2022 走看看