增量式爬虫

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

去重方法

  • 将爬取过程中产生的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

原文地址:https://www.cnblogs.com/open-yang/p/11343413.html