python網絡爬蟲的方法有幾種_Python網絡爬蟲過程中5種網頁去重方法簡要介紹

一般的,我們想抓取一個網站所有的URL,首先通過起始URL,之后通過網絡爬蟲提取出該網頁中所有的URL鏈接,之后再對提取出來的每個URL進行爬取,提取出各個網頁中的新一輪URL,以此類推。整體的感覺就是自上而下進行抓取網頁中的鏈接,理論上來看,可以抓取整站所有的鏈接。但是問題來了,一個網站中網頁的鏈接是有環路的。

舉個栗子,在網站首頁中我們可以看到首頁這個鏈接,之后我們在子網頁中也有可能會看到有個鏈接是指向首頁的,可能子子網頁還會有對應的鏈接指向首頁。按照我們之前的邏輯,抓取每個網頁中的所有鏈接,之后對所有的鏈接繼續抓取。就拿首頁來說,我們首先抓取的就是它,爾后子網頁中又有個鏈接指向首頁,子子網頁還有鏈接指向首頁,如此進行抓取,豈不是會導致網頁重復抓取,其他的網頁根本就沒有機會去抓取了,簡直不敢想象~~要解決這個問題并不難,此時就需要用到網絡爬蟲中了一個重要的知識點,就是網頁去重。

首先介紹一個簡單的思路,也是經常用的一個通用思路。我們將已經爬取過的網頁放到一個列表中去,以首頁為例,當首頁被抓取之后,將首頁放到列表中,之后我們抓取子網頁的時候,如果再次碰到了首頁,而首頁已經被抓取過了,此時就可以跳過首頁,繼續往下抓取其他的網頁,而避開了將首頁重復抓取的情況,這樣下來,爬取整站就不會出現一個環路。以這個思路為出發點,將訪問過的URL保存到數據庫中,當獲取下一個URL的時候,就去數據庫中去查詢這個URL是否已經被訪問過了。雖然數據庫有緩存,但是當每個URL都去數據庫中查詢的話,會導致效率下降的很快,所以這種策略用的并不多,但不失為最簡單的一種方式。

第二種方式是將訪問過的URL保存到set中去,通過這樣方式獲取URL的速度很快,基本上不用做查詢。但是這種方法有一個缺點,將URL保存到set中,實際上是保存到內存中,當URL數據量很大的時候(如1億條),會導致內存的壓力越來越大。對于小型的爬蟲來說,這個方法十分可取,但是對于大型的網絡爬蟲,這種方法就難以企及了。

第三種方式是將字符進行md5編碼,md5編碼可以將字符縮減到固定的長度。一般來說,md5編碼的長度約為128bit,約等于16byte。在未縮減之前,假設一個URL占用的內存大小為50個字節,一個字節等于2byte,相當于100byte。由此可見,進行md5編碼之后,節約了大量的內存空間。通過md5的方式可以將任意長度的URL壓縮到同樣長度的md5字符串,而且不會出現重復的情況,達到去重的效果。通過這種方式很大程度上節約了內存,scrapy框架采取的方式同md5方式有些類似,所以說scrapy在正常情況下,即使URL的數量級達到了上億級別,其占用的內存比起set方式也要少得多。

第四種方式是使用bitmap方法將字符進一步壓縮。這種方式的意思是在計算機中申請8個bit,即8個位,每個位由0或者1表示,這是計算機中最小的單元。8個位組成1個byte,一個位代表一個URL的話,為什么一個位可以確定一個URL呢?因為我們可以將一個URL進行一個哈希函數,然后將其映射到位上面去。舉個栗子,假設我們有8個URL,分別對應8個位,然后通過位上面的0和1的狀態,便可以表明這個URL是否存在,通過這種方法便可以進一步的壓縮內存。

但是bitmap方法有一個非常大的缺點,就是它的沖突會非常高,因為同用一個哈希函數,極有可能將兩個不同的URL或者多個不同的URL映射到一個位置上來。實際上這種哈希的方法,它也是set方式的一種實現原理,它將URL進行一種函數計算,然后映射到bit的位置中去,所以這種方式對內存的壓縮是非常大的。簡單的來計算一下,還是以一億條URL來進行計算,相當于一億個bit,通過計算得到其相當于12500000byte,除以1024之后約為12207KB,大概是12MB的空間。在實際過程中內存的占用可能會比12MB大一些,但是即便是如此,相比于前面三種方法,這種方式以及大大的減少了內存占用的空間了。但是與此同時,該方法產生沖突的可能性是非常大的,所以這種方法也不是太適用的。那么有沒有方法將bitmap這種對內存濃重壓縮的方法做進一步優化,讓沖突的可能性降下來呢?答案是有的,就是第五種方式。

第五種方式是bloomfilter,該方法對bitmap進行改進,它可以通過多個哈希函數減少沖突的可能性。通過這種方式,一方面它既可以達到bitmap方法減少內存的作用,另一方面它又同時起到減少沖突的作用。關于bloomfilter原理及其實現,后期肯定會給大家呈上,今天先讓大家有個簡單的認識。Bloomfilter適用于大型的網絡爬蟲,尤其是數量級超級大的時候,采用bloomfilter方法可以起到事半功倍的效果,其也經常和分布式爬蟲共同配合,以達到爬取的目的。

關于網絡爬蟲過程中去重策略的五種方式的介紹就先到這里了,不懂的就當了解一下了,科普一下下,問題不大,希望對小伙伴們的學習有所幫助。

有個小伙伴提到上面的5種方法只是適用于在單進程的條件下,如果是多進程下,需要設置管道來進行信息交換,同時也可以直接設置管道來代替set這種集合,感謝這位不愿露面的大佬~~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445949.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFmpeg源代碼簡單分析-編碼-avformat_alloc_output_context2()

參考鏈接 FFmpeg源代碼簡單分析:avformat_alloc_output_context2()_雷霄驊的博客-CSDN博客_avformat_alloc_context avformat_alloc_output_context2() 在基于FFmpeg的視音頻編碼器程序中,該函數通常是第一個調用的函數(除了組件注冊函數av…

《深入理解JVM.2nd》筆記(一):走進Java

概述 Java技術體系 Java程序設計語言各種硬件平臺上的Java虛擬機Class文件格式Java API類庫來自商業機構和開源社區的第三方Java類庫 Java發展史 Java虛擬機發展史 展望Java技術的未來 模塊化 混合語言 多核并行 進一步豐富語法 64位虛擬機 實戰:自己編譯…

js監聽只讀文本框_js 動態控制 input 框 的只讀屬性

input 框的只讀屬性: readonly在頁面中直接添加為只讀時,可在input中直接添加 readonly"readonly",但是如果想通過點擊按鈕來改變的話,需要通過js(或jquery)來實現。最近一次使用這個,終于發現了以前寫這…

FFmpeg源代碼簡單分析-編碼-avformat_write_header()

參考鏈接 FFmpeg源代碼簡單分析:avformat_write_header()_雷霄驊的博客-CSDN博客_avformat_write_header avformat_write_header() FFmpeg寫文件用到的3個函數:avformat_write_header(),av_write_frame()以及av_write_trailer()其中av_writ…

《深入理解JVM.2nd》筆記(二):Java內存區域與內存溢出異常

文章目錄概述運行時數據區域程序計數器Java虛擬機棧本地方法棧Java堆方法區運行時常量池直接內存HotSpot虛擬機對象探秘對象的創建第一步第二步第三步第四步最后一腳對象的內存布局對象頭Header第一部分第二部分實例數據Instance對齊填充Padding對象的訪問定位句柄直接指針對象…

vue底部選擇器_Vue組件-極簡的地址選擇器

一、前言本文用Vue完成一個極簡的地點選擇器,我們接下來帶大家實現這個。當然其中也有一些值得學習與注意的地方。話不多說,我們先上demo圖。因為每個人的需要不一樣,我這邊就不在實現更多的功能,所以留有更大的空間供大家增刪改。…

FFmpeg源代碼簡單分析-編碼-avcodec_encode_video()已被send_frame 和 receive_packet替代

參考鏈接 FFmpeg源代碼簡單分析:avcodec_encode_video()_雷霄驊的博客-CSDN博客_avcodec_encode_video2 avcodec_encode_video() 該函數用于編碼一幀視頻數據。函數已被棄用參考鏈接:FFmpeg 新舊版本編碼 API 的區別_zouzhiheng的博客-CSDN博客 send_f…

《深入理解JVM.2nd》筆記(三):垃圾收集器與垃圾回收策略

文章目錄概述對象已死嗎引用計數算法可達性分析算法再談引用finalize():生存還是死亡回收方法區垃圾收集算法標記-清除算法復制算法標記-整理算法分代收集算法HotSpot的算法實現枚舉根結點安全點安全區域垃圾收集器SerialParNewParallel ScavengeSerial OldParallel…

python計算股票趨勢_通過機器學習的線性回歸算法預測股票走勢(用Python實現)...

1 波士頓房價數據分析安裝好Python的Sklearn庫后,在安裝包下的路徑中就能看到描述波士頓房價的csv文件,具體路徑是“python安裝路徑\Lib\site-packages\sklearn\datasets\data”,在這個目錄中還包含了Sklearn庫會用到的其他數據文件&#xff…

FFmpeg源代碼簡單分析-編碼-av_write_frame()

參考鏈接 FFmpeg源代碼簡單分析:av_write_frame()_雷霄驊的博客-CSDN博客_av_write_frame av_write_frame() av_write_frame()用于輸出一幀視音頻數據,它的聲明位于libavformat\avformat.h,如下所示。 /*** Write a packet to an output me…

《深入理解JVM.2nd》筆記(四):虛擬機性能監控與故障處理工具

文章目錄概述JDK的命令行工具jps:虛擬機進程狀況工具jstat:虛擬機統計信息監視工具jinfo:Java配置信息工具jmap:Java內存映像工具jhat:虛擬機堆轉儲快照分析工具jstack:Java堆棧跟蹤工具HSDIS:J…

postgresql 主從配置_Postgresql主從配置

一、簡介PostgreSql在9.0之后引入了主從的流復制機制,所謂流復制,就是從服務器通過tcp流從主服務器中同步相應的數據。這樣當主服務器數據丟失時從服務器中仍有備份。與基于文件日志傳送相比,流復制允許保持從服務器更新。 從服務器連接主服務…

FFmpeg源代碼簡單分析-編碼-av_write_trailer()

參考鏈接: FFmpeg源代碼簡單分析:av_write_trailer()_雷霄驊的博客-CSDN博客_av_malloc av_write_trailer() av_write_trailer()用于輸出文件尾,它的聲明位于libavformat\avformat.h,如下所示 /*** Write the stream trailer to…

科沃斯掃地機器人風扇模塊_掃地機器人不能開機,不能關機,風扇不轉

家庭的重要性自不必再細說,而小編今天要說的則是家庭環境的重要性。一般家庭最少居住三口人,兩個大人加一個孩子,每天回到家,看到家里整潔舒適的環境,心情該是多么地愜意。要是我們每天下班回到家中,看到滿…

MySQL關鍵字EXPLAIN的用法及其案例

文章目錄概述EXPLAIN輸出的列的解釋實例說明select_type的說明UNIONDEPENDENT UNION與DEPENDENT SUBQUERYSUBQUERYDERIVEDtype的說明system,consteq_refrefref_or_nullindex_mergeunique_subqueryindex_subqueryrangeindexALLextra的說明DistinctNot existsRange ch…

FFmpeg源代碼簡單分析-其他-日志輸出系統(av_log()等)

參考鏈接 FFmpeg源代碼簡單分析:日志輸出系統(av_log()等)_雷霄驊的博客-CSDN博客_ffmpeg源碼分析 日志輸出系統(av_log()等) 本文分析一下FFmpeg的日志(Log)輸出系統的源代碼。日志輸出部分的…

FFmpeg源代碼簡單分析-其他-AVClass和AVoption

參考鏈接 FFmpeg源代碼簡單分析:結構體成員管理系統-AVClass_雷霄驊的博客-CSDN博客FFmpeg源代碼簡單分析:結構體成員管理系統-AVOption_雷霄驊的博客-CSDN博客 概述 AVOption用于在FFmpeg中描述結構體中的成員變量。它最主要的作用可以概括為兩個字&a…

oracle手工收集awr報告_oracle手工生成AWR報告方法記錄-阿里云開發者社區

AWR(Automatic Workload Repository)報告是我們進行日常數據庫性能評定、問題SQL發現的重要手段。熟練掌握AWR報告,是做好開發、運維DBA工作的重要基本功。AWR報告的原理是基于Oracle數據庫的定時鏡像功能。默認情況下,Oracle數據庫后臺進程會以一定間隔…

IntelliJ IDEA 默認快捷鍵大全

文章目錄Remember these ShortcutsGeneralDebuggingSearch / ReplaceEditingRefactoringNavigationCompile and RunUsage SearchVCS / Local HistoryLive Templates參考資料Remember these Shortcuts 常用功能快捷鍵備注●Smart code completionCtrl Shift Space-●Search e…

python爬蟲的數據如何解決亂碼_寫爬蟲時如何解決網頁亂碼問題

實戰講解,文章較長,對爬蟲比較熟悉的瀏覽翻看章節 2.3 獲取新聞文本內容。寫爬蟲時經常對網址發起請求,結果返回的html數據除了標簽能看懂,其他的全部是亂碼。大家如果對爬蟲感興趣,請耐心閱讀本文,我們就以…