自动刷新请求网址 自动刷新

概念
检测网络数据更新的情况,以便于爬取到最新更新出来的数据
实现核心
去重
实战中去重的方式:
记录表
记录表需要记录什么?记录的一定是爬取过的相关信息 。
例如某电影网:
爬取过的相关信息:每一部电影详情页的url只需要使用某一组数据,该组数据如果可以作为该部电影的唯一标识即可,刚好电影详情页的url就可以作为电影的唯一标识 。只要可以标识电影唯一标识的数据我们就可以统称为数据指纹 。
去重的方式对应的记录表:
python中的set集合(不可以)set集合无法持久化存储
redis中的set可以的可以持久化存储
代码案例:
zls.py
import scrapyfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Rulefrom redis import Redisfrom zlsPro.items import ZlsproItemclass 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'> = titleyield 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'> = descyield itempipeline.py
class ZlsproPipeline:def process_item(self, item, spider):coon=spider.coon #redis的连接对象coon.lpush('movieDate',item)return itemitems.py
import scrapyclass ZlsproItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()desc = scrapy.Field()数据指纹一般是经过加密的
上述案例的数据指纹没有必要加密 。
什么情况数据指纹需要加密?
如果数据的唯一标识标识的内容数据量比较大,可以使用hash将数据加密成32位密文 。目的是为了节省空间 。关注Python涛哥!学习更多Python知识!
【自动刷新请求网址 自动刷新】

自动刷新请求网址 自动刷新

文章插图
自动刷新请求网址 自动刷新

文章插图

    推荐阅读