增量式爬蟲

2021-09-29 05:34:56 字數 3788 閱讀 9543

增量式爬蟲

引言:當我們在瀏覽相關網頁的時候會發現,某些**定時會在原有網頁資料的基礎上更新一批資料,例如某電影**會實時更新一批最近熱門的電影。****會根據作者創作的進度實時更新最新的章節資料等等。那麼,類似的情景,當我們在爬蟲的過程中遇到時,我們是不是需要定時更新程式以便能爬取到**中最近更新的資料呢?

一.增量式爬蟲

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

去重方法

二.專案案例

爬蟲檔案:

# -*- 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.***.com'] start_urls = [''] rules = ( rule(linkextractor(allow=r'/frim/index7-\d+\.html'), callback='parse_item', follow=true), ) #建立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 = ''+li.xpath('./a/@href').extract_first() #將詳情頁的url存入redis的set中 ex = self.conn.sadd('urls',detail_url) if ex == 1: print('該url沒有被爬取過,可以進行資料的爬取') yield scrapy.request(url=detail_url,callback=self.parst_detail) else: print('資料還沒有更新,暫無新資料可爬取!') #解析詳情頁中的電影名稱和型別,進行持久化儲存

defparst_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:

from redis import redis class

incrementpropipeline

(object): conn = none

defopen_spider

(self,spider): self.conn = redis(host='127.0.0.1',port=6379) def

process_item

(self, item, spider): dic = print(dic) self.conn.lpush('moviedata',dic) return item

- 需求:爬取糗事百科中的段子和作者資料。

爬蟲檔案:

# -*- 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.***.com'] start_urls = [''] rules = ( rule(linkextractor(allow=r'/text/page/\d+/'), callback='parse_item', follow=true), rule(linkextractor(allow=r'/text/$'), callback='parse_item', follow=true), ) #建立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() #將解析到的資料值生成乙個唯一的標識進行redis儲存 source = item['author']+item['content'] source_id = hashlib.sha256(source.encode()).hexdigest() #將解析內容的唯一表示儲存到redis的data_id中 ex = self.conn.sadd('data_id',source_id) if ex == 1: print('該條資料沒有爬取過,可以爬取......') yield item else: print('該條資料已經爬取過了,不需要再次爬取了!!!')

管道檔案:        

# -*- coding: utf-8 -*-

# define your item pipelines here

## don't forget to add your pipeline to the item_pipelines setting

# see:

from redis import redis class

incrementbydatapropipeline

(object): conn = none

defopen_spider

(self, spider): self.conn = redis(host='127.0.0.1', port=6379) def

process_item

(self, item, spider): dic = # print(dic) self.conn.lpush('qiubaidata', dic) return item

增量式爬蟲

目的 增量式爬蟲 在上一次爬取的基礎上繼續爬取資料,通過增量式爬蟲,我們可以繼續爬取因故未完全爬完的資料,或 更新的資料.去重那麼如何判斷我們是否爬過某條資料是關鍵,顯然,每次爬取判斷該資料是否存在是不可取的 所以這裡我們利用了redis資料庫集合自動去重的功能.向redis 庫中的集合裡放 ps ...

Python爬蟲 增量式爬蟲 通用爬蟲 聚焦爬蟲

通用爬蟲 聚焦爬蟲 增量式爬蟲 通用爬蟲 和 聚焦爬蟲 之前的部落格有講解過了,本篇主要講解增量式爬蟲 適用於持續跟蹤 的資料爬取。例如三個月前,爬取了所有資料。更新了100條資料,此時爬取跟新的100條資料即可。指定起始url,基於crawlspider獲取頁碼url 基於rule請求獲取的頁碼u...

scrapy結合redis進行增量式爬蟲

增量式爬蟲 顧名思義就是以前爬取過的不在爬取,未爬取過的進行爬取。需求 爬取中的動作電影的標題和簡介 分析 指定url,建立工程,cd進入工程,建立爬蟲檔案,鏈結提取器提取頁碼鏈結,規則解析器進行規則制定,資料解析,持久化儲存,其實都是一樣的,重點在於怎麼只爬取更新的電影。核心 檢測電影詳情頁的ur...