zoukankan      html  css  js  c++  java
  • 增量式爬虫

    增量式爬虫通过爬虫程序监测某网站数据更新的情况,以便可以爬取到该网站更新出的新数据。增量式爬虫核心在于跳过之前已经爬去过的数据,也就是实现请求去重!

    去重方法

    • 将爬取过程中产生的url进行存储,存储在redis的set中。当下次进行数据爬取时,首先对即将要发起的请求对应的url在存储的url的set中做判断,如果存在则不进行请求,否则才进行请求。
    • 对爬取到的网页内容进行唯一标识的制定,然后将该唯一表示存储至redis的set中。当下次爬取到网页数据的时候,在进行持久化存储之前,首先可以先判断该数据的唯一标识在redis的set中是否存在,在决定是否进行持久化存储。

    增量式爬虫案例

      4567电影网电影及描述信息(http://www.4567kan.com/index.php/vod/show/id/5.html

      1.创建爬虫项目(基于CrawlSpider类)

       scrapy startproject zls_moviePro

       cd zls_moviePro

      scrapy genspider -t crawl zls_movieTest www.xxx.com

      2.编写爬虫文件zls_movieTest.py  

     1 # -*- coding: utf-8 -*-
     2 import scrapy
     3 from scrapy.linkextractors import LinkExtractor
     4 from scrapy.spiders import CrawlSpider, Rule
     5 from redis import Redis
     6 from zls_moviePro.items import ZlsMovieproItem
     7 
     8 #获取电影名称及对应的描述
     9 class ZlsMovietestSpider(CrawlSpider):
    10     #连接redis数据库
    11     conn = Redis(host='127.0.0.1', port=6379)
    12     name = 'zls_movieTest'
    13     # allowed_domains = ['www.xxx.com']
    14     start_urls = ['http://www.4567kan.com/index.php/vod/show/id/5.html']
    15 
    16     rules = (
    17         Rule(LinkExtractor(allow=r'index.php/vod/show/id/5/page/d+.html'), callback='parse_item', follow=True),
    18     )
    19 
    20     def parse_item(self, response):
    21 
    22         li_list=response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
    23         for li in li_list:
    24             item = ZlsMovieproItem()
    25             item['name']  = li.xpath('.//div[@class="stui-vodlist__detail"]/h4/a/text()').extract_first()
    26             url='http://www.4567kan.com'+li.xpath('.//div[@class="stui-vodlist__detail"]/h4/a/@href').extract_first()
    27             #经电影详情的url存在redis数据库的集合中,可以去重进行判断是否爬取过
    28             ex = self.conn.sadd('movie_detail_urls', url)#添加成功返回1,否则为0
    29             if ex==1:
    30                 print('数据有更新,正在下载...')
    31                 yield scrapy.Request(url=url, callback=self.parse_detail, meta={'item': item})
    32             else:
    33                 print('暂无数据更新!')
    34 
    35     def parse_detail(self, response):
    36         movie_desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
    37         item = response.meta['item']
    38         item['desc'] = movie_desc
    39         yield item
    zls_movieTest.py

      3.items.py字段属性定义

    1 import scrapy
    2 
    3 
    4 class ZlsMovieproItem(scrapy.Item):
    5     # define the fields for your item here like:
    6     name = scrapy.Field()
    7     desc=scrapy.Field()
    8     pass
    items.py

      4.pipelines.py管道配置

    1 class ZlsMovieproPipeline(object):
    2     def process_item(self, item, spider):
    3         spider.conn.lpush('movie_data',item)#spider为爬虫文件类的实例化对象,将item字典数据存储在redis数据库的movie_data对应的列表中
    4         return item
    pipelines.py

      5.settings.py配置文件

     1 #UA伪装
     2 USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
     3 #robots协议
     4 ROBOTSTXT_OBEY = False
     5 #日志输出等级
     6 LOG_LEVEL="ERROR"
     7 
     8 #开启管道
     9 ITEM_PIPELINES = {
    10    'zls_moviePro.pipelines.ZlsMovieproPipeline': 300,
    11 }
    settings.py

      6.启动爬虫项目

      scrapy crawl  zls_movieTest

  • 相关阅读:
    JavaScript-Runoob-JS函数:JavaScript 函数调用
    JavaScript-Runoob-JS函数:JavaScript 函数参数
    JavaScript-Runoob-JS函数:JavaScript 函数定义
    JavaScript-Runoob:JavaScript 代码规范
    Serverless架构的前世今生
    【华为云技术分享】STM32L476移植华为LiteOS系列教程(二)---开发前准备
    8分钟为你详解React、Angular、Vue三大前端技术
    【华为云技术分享】云容器引擎 CCE权限管理实践
    【极客思考】设计模式:你确定你真的理解了单例模式吗?
    最终,我决定将代码迁出x86架构!
  • 原文地址:https://www.cnblogs.com/open-yang/p/11343413.html
Copyright © 2011-2022 走看看