增量式爬蟲

增量式爬蟲–轉(zhuǎn)載

18.增量式爬蟲

增量式爬蟲

引言:

? 當我們在瀏覽相關網(wǎng)頁的時候會發(fā)現(xiàn),某些網(wǎng)站定時會在原有網(wǎng)頁數(shù)據(jù)的基礎上更新一批數(shù)據(jù),例如某電影網(wǎng)站會實時更新一批最近熱門的電影仓犬。小說網(wǎng)站會根據(jù)作者創(chuàng)作的進度實時更新最新的章節(jié)數(shù)據(jù)等等芒粹。那么,類似的情景着降,當我們在爬蟲的過程中遇到時,我們是不是需要定時更新程序以便能爬取到網(wǎng)站中最近更新的數(shù)據(jù)呢拗军?

一.增量式爬蟲

概念:通過爬蟲程序監(jiān)測某網(wǎng)站數(shù)據(jù)更新的情況任洞,以便可以爬取到該網(wǎng)站更新出的新數(shù)據(jù)。

如何進行增量式的爬取工作:

在發(fā)送請求之前判斷這個URL是不是之前爬取過

在解析內(nèi)容后判斷這部分內(nèi)容是不是之前爬取過

寫入存儲介質(zhì)時判斷內(nèi)容是不是已經(jīng)在介質(zhì)中存在

分析:

? 不難發(fā)現(xiàn)发侵,其實增量爬取的核心是去重交掏, 至于去重的操作在哪個步驟起作用,只能說各有利弊刃鳄。在我看來盅弛,前兩種思路需要根據(jù)實際情況取一個(也可能都用)。第一種思路適合不斷有新頁面出現(xiàn)的網(wǎng)站,比如說小說的新章節(jié)熊尉,每天的最新新聞等等罐柳;第二種思路則適合頁面內(nèi)容會更新的網(wǎng)站。第三個思路是相當于是最后的一道防線狰住。這樣做可以最大程度上達到去重的目的张吉。

去重方法

將爬取過程中產(chǎn)生的url進行存儲,存儲在redis的set中催植。當下次進行數(shù)據(jù)爬取時肮蛹,首先對即將要發(fā)起的請求對應的url在存儲的url的set中做判斷,如果存在則不進行請求创南,否則才進行請求伦忠。

對爬取到的網(wǎng)頁內(nèi)容進行唯一標識的制定,然后將該唯一表示存儲至redis的set中稿辙。當下次爬取到網(wǎng)頁數(shù)據(jù)的時候昆码,在進行持久化存儲之前,首先可以先判斷該數(shù)據(jù)的唯一標識在redis的set中是否存在邻储,在決定是否進行持久化存儲赋咽。

二.項目案例

- 需求:爬取4567tv網(wǎng)站中所有的電影詳情數(shù)據(jù)。

爬蟲文件:

# -- coding: utf-8 --

import scrapy

from scrapy.linkextractors import LinkExtractor

from scrapy.spiders import CrawlSpider, Rule

from redis import Redis

from incrementPro.items import IncrementproItem

class MovieSpider(CrawlSpider):

? name = 'movie'

? # allowed_domains = ['www.xxx.com']

? start_urls = ['http://www.4567tv.tv/frim/index7-11.html']

? rules = (

? Rule(LinkExtractor(allow=r'/frim/index7-\d+.html'), callback='parse_item', follow=True),

? )

? #創(chuàng)建redis鏈接對象

? conn = Redis(host='127.0.0.1',port=6379)

? def parse_item(self, response):

? li_list = response.xpath('//li[@class="p1 m1"]')

? for li in li_list:

? #獲取詳情頁的url

? detail_url = 'http://www.4567tv.tv'+li.xpath('./a/@href').extract_first()

? #將詳情頁的url存入redis的set中

? ex = self.conn.sadd('urls',detail_url)

? if ex == 1:

? print('該url沒有被爬取過吨娜,可以進行數(shù)據(jù)的爬取')

? yield scrapy.Request(url=detail_url,callback=self.parst_detail)

? else:

? print('數(shù)據(jù)還沒有更新脓匿,暫無新數(shù)據(jù)可爬取宦赠!')

? #解析詳情頁中的電影名稱和類型陪毡,進行持久化存儲

? def parst_detail(self,response):

? item = IncrementproItem()

? item['name'] = response.xpath('//dt[@class="name"]/text()').extract_first()

? item['kind'] = response.xpath('//div[@class="ct-c"]/dl/dt[4]//text()').extract()

? item['kind'] = ''.join(item['kind'])

? yield item

管道文件:

# -- coding: utf-8 --

# Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

from redis import Redis

class IncrementproPipeline(object):

? conn = None

? def open_spider(self,spider):

? self.conn = Redis(host='127.0.0.1',port=6379)

? def process_item(self, item, spider):

? dic = {

? 'name':item['name'],

? 'kind':item['kind']

? }

? print(dic)

? self.conn.lpush('movieData',dic)

? return item

- 需求:爬取糗事百科中的段子和作者數(shù)據(jù)。

爬蟲文件:

# -- coding: utf-8 --

import scrapy

from scrapy.linkextractors import LinkExtractor

from scrapy.spiders import CrawlSpider, Rule

from incrementByDataPro.items import IncrementbydataproItem

from redis import Redis

import hashlib

class QiubaiSpider(CrawlSpider):

? name = 'qiubai'

? # allowed_domains = ['www.xxx.com']

? start_urls = ['https://www.qiushibaike.com/text/']

? rules = (

? Rule(LinkExtractor(allow=r'/text/page/\d+/'), callback='parse_item', follow=True),

? Rule(LinkExtractor(allow=r'/text/$'), callback='parse_item', follow=True),

? )

? #創(chuàng)建redis鏈接對象

? conn = Redis(host='127.0.0.1',port=6379)

? def parse_item(self, response):

? div_list = response.xpath('//div[@id="content-left"]/div')

? for div in div_list:

? item = IncrementbydataproItem()

? item['author'] = div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()').extract_first()

? item['content'] = div.xpath('.//div[@class="content"]/span/text()').extract_first()

? #將解析到的數(shù)據(jù)值生成一個唯一的標識進行redis存儲

? source = item['author']+item['content']

? source_id = hashlib.sha256(source.encode()).hexdigest()

? #將解析內(nèi)容的唯一表示存儲到redis的data_id中

? ex = self.conn.sadd('data_id',source_id)

? if ex == 1:

? print('該條數(shù)據(jù)沒有爬取過勾扭,可以爬取......')

? yield item

? else:

? print('該條數(shù)據(jù)已經(jīng)爬取過了毡琉,不需要再次爬取了!!!')

管道文件:

# -- coding: utf-8 --

# Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

from redis import Redis

class IncrementbydataproPipeline(object):

? conn = None

? def open_spider(self, spider):

? self.conn = Redis(host='127.0.0.1', port=6379)

? def process_item(self, item, spider):

? dic = {

? 'author': item['author'],

? 'content': item['content']

? }

? # print(dic)

? self.conn.lpush('qiubaiData', dic)

? return item

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妙色,隨后出現(xiàn)的幾起案子绊起,更是在濱河造成了極大的恐慌,老刑警劉巖燎斩,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜂绎,居然都是意外死亡栅表,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門师枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怪瓶,“玉大人,你說我怎么就攤上這事践美∠捶。” “怎么了找岖?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敛滋。 經(jīng)常有香客問我许布,道長,這世上最難降的妖魔是什么绎晃? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任蜜唾,我火速辦了婚禮,結果婚禮上庶艾,老公的妹妹穿的比我還像新娘袁余。我一直安慰自己,他們只是感情好咱揍,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布颖榜。 她就那樣靜靜地躺著,像睡著了一般煤裙。 火紅的嫁衣襯著肌膚如雪掩完。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天积暖,我揣著相機與錄音藤为,去河邊找鬼。 笑死夺刑,一個胖子當著我的面吹牛缅疟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遍愿,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼存淫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沼填?” 一聲冷哼從身側(cè)響起桅咆,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坞笙,沒想到半個月后岩饼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡薛夜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年籍茧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梯澜。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寞冯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吮龄,我是刑警寧澤俭茧,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站漓帚,受9級特大地震影響母债,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胰默,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一场斑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牵署,春花似錦漏隐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至取具,卻和暖如春脖隶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暇检。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工产阱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人块仆。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓构蹬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悔据。 傳聞我的和親對象是個殘疾皇子庄敛,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 最近一直想維護一個代理IP池,在網(wǎng)上找了三十多個免費提供代理IP的網(wǎng)站科汗,想把這些代理都抓取下來存到本地數(shù)據(jù)庫...
    leeyis閱讀 1,736評論 1 4
  • 這個項目也是初窺python爬蟲的一個項目藻烤,也是我的畢業(yè)設計,當時選題的時候头滔,發(fā)現(xiàn)大多數(shù)人選擇的都是網(wǎng)站類怖亭,實在是...
    夢航韓語閱讀 2,989評論 2 37
  • 引 在簡書中有很多主題頻道,里面有大量優(yōu)秀的文章坤检,我想收集這些文章用于提取對我有用的東西兴猩; 無疑爬蟲是一個好的選擇...
    虎七閱讀 1,407評論 0 3
  • 突然感覺無解了。我思考了好幾年缀蹄,一直沒有找到適合自己的好方法來養(yǎng)成一個好習慣。我就一直這樣拖拉拉、拖拉拉的從小學活...
    大洪閱讀 301評論 0 0
  • 早上的早起漸漸有些習慣缺前,到了5點多蛀醉,就開始醒了。有時候會賴一下床衅码,然后再開始做起床操拯刁,有時候直接做起床操,...
    記錄時光2021閱讀 162評論 0 0