概念
检测网络数据更新的情况,以便于爬取到最新更新出来的数据
实现核心
去重
实战中去重的方式:
记录表
记录表需要记录什么?记录的一定是爬取过的相关信息。
例如某电影网:
只要可以标识电影唯一标识的数据我们可以统称位数据指纹。
去重的方式对应的记录表:
python中的set集合(不可以)
set集合无法持久化存储
redis中的set可以的
可以持久化存储
代码案例:
zls.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from zlsPro.items import ZlsproItem
class ZlsSpider(CrawlSpider):
name = 'zls'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://www.4567kp.com/frim/index1.html']
coon = Redis(host='127.0.0.1', port=6379)
rules = (
Rule(LinkExtractor(allow=r'frim/index1-\d+\.html'), callback='parse_item', follow=False),
)
def parse_item(self, response):
li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
for li in li_list:
title = li.xpath('./div/div/h4/a/text()').extract_first()
detail_url = 'http://www.4567kp.com' + li.xpath('./div/div/h4/a/@href').extract_first()
ex = self.coon.sadd('movie_urls', detail_url)
# ex==1插入成功,ex==0插入失败
if ex == 1: # detail_url表示的电影没有存在于记录表中
# 爬取电影数据:发起请求
print('有新数据更新,正在爬取新数据....')
item = ZlsproItem()
item['title'] = title
yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={
'item': item})
else: # 存在于记录表中
print('暂无数据更新!')
def parse_detail(self, response):
# 解析电影简介
desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
item = response.meta['item']
item['desc'] = desc
yield item
pipeline.py
class ZlsproPipeline:
def process_item(self, item, spider):
coon=spider.coon #redis的连接对象
coon.lpush('movieDate',item)
return item
items.py
import scrapy
class ZlsproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
desc = scrapy.Field()
数据指纹一般是经过加密的
上述案例的数据指纹没有必要加密。
什么情况数据指纹需要加密?
关注Python涛哥!学习更多Python知识!