国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

爬蟲工作量由小到大的思維轉(zhuǎn)變---<第十三章 Scrapy之pipelines分離的思考>

這篇具有很好參考價(jià)值的文章主要介紹了爬蟲工作量由小到大的思維轉(zhuǎn)變---<第十三章 Scrapy之pipelines分離的思考>。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:

收到留言: "我的爬取的數(shù)據(jù)處理有點(diǎn)大,scrapy抓網(wǎng)頁挺快,處理數(shù)據(jù)慢了!"

-----針對這位粉絲留言,我只想說:'你那培訓(xùn)班老師可能給你漏了課程! 大概你們上課講的案例屬于demo,他教了你一些基本操作,但他沒有對相關(guān)業(yè)務(wù)對你講透! 你研究一下pipelines,或者看我現(xiàn)在給你講的.

正文

首先,你要清楚,當(dāng)在Scrapy框架中,pipelines是順序執(zhí)行的,對item的處理通常是同步進(jìn)行。

這時(shí)候,你要分析2件事:

1.我的數(shù)據(jù)要不要清洗

2.我的數(shù)據(jù)準(zhǔn)備怎么存儲

分開講:

1.我的數(shù)據(jù)要不要清洗:

如果需要清洗,item的數(shù)據(jù)里比較多,我建議你轉(zhuǎn)一下pd.dataframe;這樣,會比正常運(yùn)算要快得多;然后,給你3條建議:

  1. 避免在循環(huán)內(nèi)使用 df.apply():--->? ? apply() 是行或列級別的操作函數(shù),效率相對較低。如果可以,嘗試用更高效的Pandas內(nèi)建函數(shù)代替,比如使用邏輯運(yùn)算與 numpy 的向量化操作。
  2. 對于字符串處理,如果數(shù)據(jù)量很大,應(yīng)當(dāng)盡量使用向量化方法,例如 .str 方法或其他Pandas字符串操作代替 lambda 函數(shù)。
  3. 當(dāng)創(chuàng)建新的列時(shí),用條件表達(dá)式替代 .apply(lambda) 可以獲得更好的性能,條件表達(dá)式在Pandas中是向量化的。
如果pandas處理之后,不滿足:
分離繁重操作:
如果有些操作很繁重,可以將它們移動(dòng)到Scrapy的middleware或者擴(kuò)展來進(jìn)行,這樣可能有助于提高item pipeline的處理速度。這時(shí)候,你就可以通過外部自己寫一個(gè)多線程/多進(jìn)程來處理你的數(shù)據(jù)工作!
當(dāng)然,處理item的數(shù)據(jù)清理工作,我建議你用:
ItemAdapter
什么是ItemAdapter?

-它是一個(gè)包裝類,允許我們以一致的方式處理不同種類的數(shù)據(jù)結(jié)構(gòu),例如dict、scrapy.Item以及自定義的數(shù)據(jù)類。無論內(nèi)部的數(shù)據(jù)存儲格式如何,ItemAdapter都能讓我們同等的獲取和設(shè)置Item中的字段值。


ItemAdapter的使用場景

ItemAdapter特別適用于編寫更通用的Pipeline代碼。無論傳入的Item是Scrapy的Item實(shí)例還是普通的dict,甚至是自定義的類實(shí)例,你都可以使用相同的方法來處理它們。這樣的設(shè)計(jì)大大提升了代碼的復(fù)用性和可維護(hù)性。

案例:
import scrapy
from itemadapter import ItemAdapter
import pandas as pd
import numpy

class JihaiPipeline:
    def open_spider(self, spider):
        # 初始化工作,例如連接數(shù)據(jù)庫
        pass

    def close_spider(self, spider):
        # 清理工作,例如關(guān)閉數(shù)據(jù)庫連接
        pass

    def process_item(self, item, spider):
        # 使用ItemAdapter包裝item
        adapter = ItemAdapter(item)
        
        # 進(jìn)行數(shù)據(jù)處理...
        # 例如,假設(shè)我們需要給所有Item添加一個(gè)新字段
        adapter['new_field'] = '丟一個(gè)新的字段進(jìn)去'
        
        # 處理完后,返回item
        return item

在上面的代碼中,我們沒有直接操作原始的item對象,而是將其通過ItemAdapter(item)包裝起來。然后就可以像操作字典一樣,通過adapter['new_field']來設(shè)置新字段。在管道中修改完數(shù)據(jù)后,可以直接將Item傳遞到下一個(gè)管道。

ItemAdapter中的向量化操作

對于爬蟲項(xiàng)目,可能需要對數(shù)據(jù)進(jìn)行更復(fù)雜的清洗和轉(zhuǎn)換操作。在Pandas的幫助下,我們可以執(zhí)行向量化的數(shù)據(jù)處理工作,這是一種高效處理數(shù)據(jù)的方式。通過Pandas,利用DataFrame進(jìn)行復(fù)雜的數(shù)據(jù)清洗和分析變得相當(dāng)簡便

案例:
class JihaiPipeline:
    # ...之前的方法...

    def process_item(self, item, spider):
        adapter = ItemAdapter(item)

        # 假設(shè)我們的item有一個(gè)成績的列表需要處理
        grades = adapter.get('grades', [])

        # 使用Pandas創(chuàng)建DataFrame
        df = pd.DataFrame(grades)
        # 執(zhí)行一些復(fù)雜的計(jì)算操作,例如計(jì)算平均分
        adapter['average_grade'] = df['score'].mean()

        # 返回處理后的item
        return item

在這個(gè)例子中,我們先獲取了成績列表,然后使用這個(gè)列表創(chuàng)建了一個(gè)Pandas DataFrame。之后我們就可以利用DataFrame提供的方法進(jìn)行各種操作,比如這里計(jì)算了一個(gè)平均分成績,然后將其添加到了item中。

小總結(jié):

ItemAdapter提供了一個(gè)透明的方式來處理項(xiàng),幫助你更簡單地編寫與項(xiàng)結(jié)構(gòu)無關(guān)的代碼。與Pandas結(jié)合使用,它也使得在Scrapy中進(jìn)行復(fù)雜數(shù)據(jù)處理成為可能。記住,一致性、可讀性和可維護(hù)性是編寫高質(zhì)量爬蟲代碼時(shí)的關(guān)鍵點(diǎn)。


2.我的數(shù)據(jù)準(zhǔn)備怎么存儲?

?

如果你的數(shù)據(jù)比較單一,你直接存(就跟你老師教你的那樣!) 如果你的數(shù)據(jù)已經(jīng)到達(dá)了你的瓶頸,你最好做個(gè)分離;然后看我之前的文章,例如:存入sql--->你首先要想到的就是異步!

在Scrapy中,最佳實(shí)踐通常是將數(shù)據(jù)處理(清洗、轉(zhuǎn)換等)與數(shù)據(jù)存儲(寫入數(shù)據(jù)庫等)分離。這為你的數(shù)據(jù)處理流水線提供了更好的組織結(jié)構(gòu)和可擴(kuò)展性。每個(gè)Pipeline應(yīng)該只負(fù)責(zé)一個(gè)操作或一組相關(guān)操作。這樣做的好處是:

1. 職責(zé)分離:這使得每個(gè)pipeline的職責(zé)更清晰。如果以后需要更改存儲邏輯,只需要更改保存到SQL的pipeline,而不需要觸及數(shù)據(jù)處理的pipeline。
2. 模塊化:如果在將來需要將數(shù)據(jù)存儲到不同的后端(例如不同的數(shù)據(jù)庫,或者文件系統(tǒng)等),你可以簡單地添加一個(gè)新的pipeline來處理這種情況,而不是更改現(xiàn)有代碼。
3. 可維護(hù)性:代碼維護(hù)更簡單,因?yàn)閿?shù)據(jù)清洗和存儲是分開的,錯(cuò)誤更容易追蹤,代碼更容易調(diào)試。
4. 可測試性:獨(dú)立的pipeline更容易進(jìn)行單元測試。

既然已經(jīng)完成了數(shù)據(jù)處理,并且將結(jié)果整理成了待存儲的格式,接下來的邏輯步驟是將這些數(shù)據(jù)保存到SQL數(shù)據(jù)庫。創(chuàng)建一個(gè)新的Pipeline類專門用于與SQL數(shù)據(jù)庫的交互,這樣,你的 `XXXPipeline` 負(fù)責(zé)處理數(shù)據(jù),并將處理后的數(shù)據(jù)傳遞給稍后在settings.py文件中定義優(yōu)先級更低的SQL存儲pipeline。

下面是創(chuàng)建一個(gè)專門用于存儲數(shù)據(jù)到SQL數(shù)據(jù)庫的pipeline的簡單例子(要異步,往前看我文章有介紹):

# sql_pipeline.py

import scrapy
from scrapy import Item
from itemadapter import ItemAdapter

class SQLStorePipeline:
    def open_spider(self, spider):
        # 這里設(shè)置數(shù)據(jù)庫連接
        self.connection = create_connection_to_database()

    def close_spider(self, spider):
        # 關(guān)閉數(shù)據(jù)庫連接
        self.connection.close()

    def process_item(self, item, spider):
        # 提取ItemAdapter
        adapter = ItemAdapter(item)
        # 保存到數(shù)據(jù)庫的邏輯
        save_to_database(self.connection, adapter.as_dict())
        return item  # 注意,返回item是為了允許多個(gè)pipeline

def create_connection_to_database():
    # 創(chuàng)建數(shù)據(jù)庫鏈接邏輯
    pass

def save_to_database(connection, item_data):
    # 將item數(shù)據(jù)保存到數(shù)據(jù)庫的邏輯
    pass

在`settings.py`文件中,您需要確保新的`SQLStorePipeline`在`XXXPipeline`之后執(zhí)行。這可以通過為它們分配不同的`ITEM_PIPELINES`值來實(shí)現(xiàn):

# settings.py

ITEM_PIPELINES = {
    'myproject.pipelines.XXXPipeline': 300,  #處理數(shù)據(jù)清理的
    'myproject.pipelines.SQLStorePipeline': 800,   #存儲的
}

這樣,每個(gè)item首先通過`JihaiPipeline`進(jìn)行處理,然后再通過`SQLStorePipeline`進(jìn)行存儲。

通過這種方式,您既保持了pipeline的職責(zé)分割,又為后續(xù)的維護(hù)和可能的擴(kuò)展性打下了良好的基礎(chǔ)。如果有多個(gè)數(shù)據(jù)存儲或處理需求,遵循這種模式是非常有好處的。

總結(jié):

你就記住,如果你的item數(shù)據(jù)量比較大,一定要分離! 分完了,很多都能處理了! 另外,你記得itemAdapter的用法~ 他應(yīng)該算是一個(gè)引子,透過他~你寫著寫著就會冒出很多怪招出來~ 然后,再不行,你就進(jìn)行分布式! 反正你的業(yè)務(wù)已經(jīng)模塊化了,拿一個(gè)機(jī)器專門清理,拿一個(gè)機(jī)器專門存儲~或者,丟到中間件,甩到外部去做多線程處理!這樣,在爬蟲過程中,對數(shù)據(jù)的清理和存儲的工作量,就能被劃分掉,不就輕了么...? ?

請你看到這文章,給我點(diǎn)個(gè)贊!!

(讓我知道你來了)文章來源地址http://www.zghlxwxcb.cn/news/detail-767396.html

到了這里,關(guān)于爬蟲工作量由小到大的思維轉(zhuǎn)變---<第十三章 Scrapy之pipelines分離的思考>的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 案例:缺陷個(gè)數(shù)與返工工作量強(qiáng)相關(guān)

    案例:缺陷個(gè)數(shù)與返工工作量強(qiáng)相關(guān)

    某公司積累了21個(gè)項(xiàng)目缺陷個(gè)數(shù)與返工工作量的數(shù)據(jù),如下表所示: 項(xiàng)目序號 缺陷修復(fù)工時(shí) 缺陷數(shù) 1 9433 1445 2 2990 405 3 634 74 4 647 138 5 4960 710 6 1370 246 7 740 66 8 1223 218 9 2766 528 10 8302 1378 11 626 78 12 611 151 13 811 105 14 2090 320 15 1440 235 16 5160 784 17 7100 1030 18 7560 1239 19 1737 321 20 6830 987 21

    2024年02月15日
    瀏覽(30)
  • eth入門之工作量證明 (POW)

    文檔:工作量證明 (PoW) | ethereum.org 以太坊目前使用的共識協(xié)議被稱為工作量證明 (PoW)。 這允許以太坊網(wǎng)絡(luò)的節(jié)點(diǎn)就以太坊區(qū)塊鏈上記錄的所有信息的狀態(tài)達(dá)成共識,并防止經(jīng)濟(jì)攻擊。 接下來一年,工作量證明將被逐步淘汰,這有利于權(quán)益證明 (PoS) 的發(fā)展。 向權(quán)益證明 (Po

    2024年02月06日
    瀏覽(25)
  • 【實(shí)訓(xùn)項(xiàng)目】教師工作量管理系統(tǒng)

    【實(shí)訓(xùn)項(xiàng)目】教師工作量管理系統(tǒng)

    目錄 一、需求與分析 1. 項(xiàng)目概述 1.1 教師信息處理 1.2 教師工作量數(shù)據(jù)處理: 1.3 教師綜合信息輸出 2. 需求分析 3. 模塊設(shè)計(jì) 3.1 功能模塊 3.2 所有功能模塊的流程圖 二、設(shè)計(jì)與實(shí)現(xiàn)? 1.?程序?qū)崿F(xiàn)? 1.1 登錄系統(tǒng) 1.2?教師工作量管理系統(tǒng)? 2. 程序設(shè)計(jì) 附:系列文章 計(jì)算每個(gè)老師

    2024年02月11日
    瀏覽(49)
  • 簡易區(qū)塊鏈的搭建(2)——工作量證明

    1. big.Int 的一些常見方法和屬性: SetInt64(x int64) :將一個(gè) int64 類型的整數(shù)賦值給 big.Int 。 SetString(s string, base int) :將一個(gè)字符串表示的整數(shù)按照指定的進(jìn)制轉(zhuǎn)換為 big.Int 。 Add(x, y *big.Int) *big.Int :將兩個(gè) big.Int 相加,并返回結(jié)果。 Sub(x, y *big.Int) *big.Int :將一個(gè) big.Int 減去另

    2024年04月25日
    瀏覽(32)
  • 工作量證明在驗(yàn)證碼中的實(shí)際應(yīng)用

    工作量證明在驗(yàn)證碼中的實(shí)際應(yīng)用

    工作量證明(Proof-of-Work,以下簡稱“PoW”)在維基百科的介紹中指一般要求用戶進(jìn)行一些耗時(shí)適當(dāng)?shù)膹?fù)雜運(yùn)算,并且答案能被服務(wù)方快速驗(yàn)算,以此耗用的時(shí)間、設(shè)備與能源做為擔(dān)保成本,以確保服務(wù)與資源是被真正的需求所使用。 在實(shí)際生活中可以例舉為:學(xué)生進(jìn)行考試

    2024年01月15日
    瀏覽(33)
  • 基于springboot+vue開發(fā)的教師工作量管理系

    springboot31 隨著信息技術(shù)在管理上越來越深入而廣泛的應(yīng)用,管理信息系統(tǒng)的實(shí)施在技術(shù)上已逐步成熟。本文介紹了教師工作量管理系統(tǒng)的開發(fā)全過程。通過分析教師工作量管理系統(tǒng)管理的不足,創(chuàng)建了一個(gè)計(jì)算機(jī)管理教師工作量管理系統(tǒng)的方案。文章介紹了教師工作量管理系

    2024年02月05日
    瀏覽(21)
  • PHP從零實(shí)現(xiàn)區(qū)塊鏈(網(wǎng)頁版二)工作量證明

    PHP從零實(shí)現(xiàn)區(qū)塊鏈(網(wǎng)頁版二)工作量證明

    源碼地址:PHP從零實(shí)現(xiàn)區(qū)塊鏈(二)工作量證明 - 簡書 注:本例只是從網(wǎng)頁版實(shí)現(xiàn)一下原理,源碼非本人所寫,只是將原帖的源碼更改了一下,變成網(wǎng)頁版 因?yàn)檫\(yùn)行環(huán)境問題,本例暫時(shí)從windows轉(zhuǎn)到ubuntu下,因?yàn)楹竺胬邮褂昧薵mp庫的gmp_pow和gmp_cmp函數(shù),而php在windows下暫時(shí)沒

    2024年02月03日
    瀏覽(22)
  • 動(dòng)手學(xué)區(qū)塊鏈學(xué)習(xí)筆記(二):區(qū)塊鏈以及工作量證明算法

    動(dòng)手學(xué)區(qū)塊鏈學(xué)習(xí)筆記(二):區(qū)塊鏈以及工作量證明算法

    緊接上文,在介紹完區(qū)塊鏈中的加密解密以及公鑰私鑰等算法后,本篇開始正式進(jìn)入?yún)^(qū)塊鏈概念與一個(gè)簡單區(qū)塊鏈系統(tǒng)的實(shí)現(xiàn)過程介紹。 什么是區(qū)塊鏈? 區(qū)塊鏈,就是一個(gè)又一個(gè)區(qū)塊組成的鏈條。每一個(gè)區(qū)塊中保存了一定的信息,它們按照各自產(chǎn)生的時(shí)間順序連接成鏈條。

    2024年01月17日
    瀏覽(30)
  • 區(qū)塊鏈基礎(chǔ)知識7-比特幣挖礦原理/工作量證明

    區(qū)塊鏈基礎(chǔ)知識7-比特幣挖礦原理/工作量證明

    在前面《區(qū)塊鏈基礎(chǔ)知識6-區(qū)塊鏈記賬原理》我們了解到記賬是把交易記錄、交易時(shí)間、賬本序號、上一個(gè)Hash值等信息計(jì)算Hash打包的過程。 我們知道所有的計(jì)算和存貯是需要消耗計(jì)算機(jī)資源的,既然要付出成本,那節(jié)點(diǎn)為什么還要參與記賬呢?在中本聰(比特幣之父)的設(shè)

    2024年04月28日
    瀏覽(17)
  • 如何判斷你論文的創(chuàng)新度和工作量,能否達(dá)到期刊要求?

    1、SCI二區(qū)+ 頂刊:近幾年的頂刊頂會里頂?shù)?SCI二區(qū):近幾年的頂刊頂會里差的 2個(gè)以上,多多益善,因?yàn)橐C明你實(shí)驗(yàn)(模型)的泛化性 不是說你做了創(chuàng)新,你還得證明你的創(chuàng)新是領(lǐng)域內(nèi)有效的一種 2、水刊 1個(gè)夠了,2個(gè)就夠了 近幾年的中等(2區(qū)作用)的,最好有近幾年的

    2024年02月11日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包