博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
增量式 爬虫
阅读量:6704 次
发布时间:2019-06-25

本文共 4510 字,大约阅读时间需要 15 分钟。

增量式 爬虫

概念: 监测网站的数据更新的情况,只爬取网站更新的数据.

核心: 去重

实现 Redis  set集合也行

--  如何实现redis去重? -- 

# 爬取电影站的更新数据   url去重  https://www.4567tv.tv/frim/index1.html # 下面代码以 http://www.922dyy.com/dianying/dongzuopian/ 为例 作为起始页
# spider.py 爬虫文件# -*- coding: utf-8 -*-import scrapyfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Rulefrom redis import Redisfrom shipin.items import ShipinItemclass DianyingSpider(CrawlSpider):    conn = Redis(host='127.0.0.1',port=6379) # 连接对象    name = 'dianying'    # allowed_domains = ['www.xx.com']    start_urls = ['http://www.922dyy.com/dianying/dongzuopian/']    rules = (        Rule(LinkExtractor(allow=r'/dongzuopian/index\d+\.html'), callback='parse_item', follow=False), #这里需要所有页面时候改为True    )  # 只提取页码url    def parse_item(self, response):        # 解析出当前页码对应页面中 电影详情页 的url        li_list = response.xpath('/html/body/div[2]/div[2]/div[2]/ul/li')        for li in li_list:            # 解析详情页的url            detail_url = 'http://www.922dyy.com' + li.xpath('./div/a/@href').extract_first()            #            ex = self.conn.sadd('mp4_detail_url',detail_url) # 有返回值            # ex == 1 该url没有被请求过     ex==0在集合中,该url已经被请求过了            if ex==1:                print('有新数据可爬.....')                yield scrapy.Request(url=detail_url,callback=self.parse_detail)            else:                print('暂无新数据可以爬取')    def parse_detail(self,response):        name = response.xpath('//*[@id="film_name"]/text()').extract_first()        m_type = response.xpath('//*[@id="left_info"]/p[1]/text()').extract_first()        print(name,'--',m_type)        item = ShipinItem() #实例化        item['name'] = name        item['m_type'] = m_type        yield item
# items.py# -*- coding: utf-8 -*-import scrapyclass ShipinItem(scrapy.Item):    name = scrapy.Field()    m_type = scrapy.Field()
# pipelines.py 管道# -*- coding: utf-8 -*-class ShipinPipeline(object):    def process_item(self, item, spider):        conn = spider.conn        dic = {            'name':item['name'],            'm_type':item['m_type']        }        conn.lpush('movie_data',str(dic)) #一般这里不str的话会报错,数据类型dict的错误        return item
# settings.py  里面ITEM_PIPELINES = {   'shipin.pipelines.ShipinPipeline': 300,}BOT_NAME = 'shipin'SPIDER_MODULES = ['shipin.spiders']NEWSPIDER_MODULE = 'shipin.spiders'USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'ROBOTSTXT_OBEY = FalseLOG_LEVEL = 'ERROR'

流程: scrapy startproject Name 

    cd Name 

    scrapy genspider -t crawl 爬虫文件名 www.example.com  

注意点: 增量式爬虫,会判断url在不在集合里面,sadd (集合的方法) 返回值1就是没在里面,就是新数据.   

    lpush lrange llen  --key  都是redis里面列表类型的方法

下面是糗事百科段子页面的数据 (作者/段子)   增量式爬取

# 爬虫.py# -*- coding: utf-8 -*-import scrapy,hashlibfrom qbPro.items import QbproItemfrom redis import Redis# 只爬取当前页面class QiubaiSpider(scrapy.Spider):    name = 'qiubai'    conn = Redis(host='127.0.0.1',port=6379)    start_urls = ['https://www.qiushibaike.com/text/']    def parse(self, response):        div_list = response.xpath('//*[@id="content-left"]/div')        for div in div_list:            # 数据指纹:爬取到一条数据的唯一标识            author = div.xpath('./div/a[2]/h2/text() | ./div/span[2]/h2/text()').extract_first().strip()            content = div.xpath('./a/div/span[1]//text()').extract()            content = ''.join(content).replace('\n','')            item = QbproItem()  # 实例化            item['author'] = author            item['content'] = content            # 给爬取到的数据生成一个数据指纹            data = author+content            hash_key = hashlib.sha256(data.encode()).hexdigest()            ex = self.conn.sadd('hash_key',hash_key)  # 输指纹存进 集合里面            if ex == 1:                print('有数据更新')                yield item            else:                print('无数据更新')
# items.py# -*- coding: utf-8 -*-import scrapyclass QbproItem(scrapy.Item):    author = scrapy.Field()    content = scrapy.Field()
# pipelines.py  管道# -*- coding: utf-8 -*-class QbproPipeline(object):    def process_item(self, item, spider):        conn = spider.conn        dic = {            'author': item['author'],            'content': item['content']        }        conn.lpush('qiubai', str(dic))        return item
# settings.py  设置 ITEM_PIPELINES = {   'qbPro.pipelines.QbproPipeline': 300,}USER_AGENT =  'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'ROBOTSTXT_OBEY = FalseLOG_LEVEL = 'ERROR'

 

转载于:https://www.cnblogs.com/zhangchen-sx/p/10849234.html

你可能感兴趣的文章
Hadoop设置环境变量注意事项
查看>>
SAP MM Service Specification的使用?
查看>>
github优质图书
查看>>
第 35 章 dnsmasq
查看>>
武汉往事之借钱识朋友
查看>>
python中的文件操作
查看>>
ASM基本配置问题
查看>>
让程序猿和攻城狮更敬业
查看>>
aix 下删除一个卷组vg
查看>>
Oracle体系结构之内存结构(SGA、PGA)
查看>>
[20160526]bbed修改数据记录(不等长).txt
查看>>
Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)
查看>>
《Programming WPF》翻译 第8章 5.创建动画过程
查看>>
HDOJ 2094 产生冠军
查看>>
一次面试引发的思考(中小型网站优化思考) (转)
查看>>
Unicode字段也有collation
查看>>
变量 - PHP手册笔记
查看>>
AliDaTalk | 51.8%!淘宝村网商,30岁年轻人顶起半边天
查看>>
Sql Server之旅——第十四站 深入的探讨锁机制
查看>>
[20170215]设置log_archive_dest_state_2
查看>>