一個韭菜用python採集(Python採集)

本文目錄一覽:

python數據採集是什麼

數據採集(DAQ),又稱數據獲取,是指從感測器和其它待測設備等模擬和數字被測單元中自動採集非電量或者電量信號,送到上位機中進行分析,處理。數據採集系統是結合基於計算機或者其他專用測試平台的測量軟硬體產品來實現靈活的、用戶自定義的測量系統。採集一般是採樣方式,即隔一定時間(稱採樣周期)對同一點數據重複採集。採集的數據大多是瞬時值,也可是某段時間內的一個特徵值。

網路爬蟲是用於數據採集的一門技術,可以幫助我們自動地進行信息的獲取與篩選。從技術手段來說,網路爬蟲有多種實現方案,如PHP、Java、Python …。那麼用python 也會有很多不同的技術方案(Urllib、requests、scrapy、selenium…),每種技術各有各的特點,只需掌握一種技術,其它便迎刃而解。同理,某一種技術解決不了的難題,用其它技術或方依然無法解決。網路爬蟲的難點並不在於網路爬蟲本身,而在於網頁的分析與爬蟲的反爬攻克問題。

python學習網,免費的在線學習python平台,歡迎關注!

如何利用python對網頁的數據進行實時採集並輸出

這讓我想到了一個應用場景,在實時網路徵信系統中,通過即時網路爬蟲從多個信用數據源獲取數據。並且將數據即時注入到信用評估系統中,形成一個集成化的數據流。

可以通過下面的代碼生成一個提取器將標準的HTML DOM對象輸出為結構化內容。

python分散式爬蟲是什麼意思

一、分散式爬蟲架構

在了解分散式爬蟲架構之前,首先回顧一下Scrapy的架構,如下圖所示。

Scrapy單機爬蟲中有一個本地爬取隊列Queue,這個隊列是利用deque模塊實現的。如果新的Request生成就會放到隊列裡面,隨後Request被Scheduler調度。之後,Request交給Downloader執行爬取,簡單的調度架構如下圖所示。

如果兩個Scheduler同時從隊列裡面取Request,每個Scheduler都有其對應的Downloader,那麼在帶寬足夠、正常爬取且不考慮隊列存取壓力的情況下,爬取效率會有什麼變化?沒錯,爬取效率會翻倍。

這樣,Scheduler可以擴展多個,Downloader也可以擴展多個。而爬取隊列Queue必須始終為一個,也就是所謂的共享爬取隊列。這樣才能保證Scheduer從隊列里調度某個Request之後,其他Scheduler不會重複調度此Request,就可以做到多個Schduler同步爬取。這就是分散式爬蟲的基本雛形,簡單調度架構如下圖所示。

我們需要做的就是在多台主機上同時運行爬蟲任務協同爬取,而協同爬取的前提就是共享爬取隊列。這樣各台主機就不需要各自維護爬取隊列,而是從共享爬取隊列存取Request。但是各台主機還是有各自的Scheduler和Downloader,所以調度和下載功能分別完成。如果不考慮隊列存取性能消耗,爬取效率還是會成倍提高。

二、維護爬取隊列

那麼這個隊列用什麼來維護?首先需要考慮的就是性能問題。我們自然想到的是基於內存存儲的Redis,它支持多種數據結構,例如列表(List)、集合(Set)、有序集合(Sorted Set)等,存取的操作也非常簡單。

Redis支持的這幾種數據結構存儲各有優點。

列表有lpush()、lpop()、rpush()、rpop()方法,我們可以用它來實現先進先出式爬取隊列,也可以實現先進後出棧式爬取隊列。

集合的元素是無序的且不重複的,這樣我們可以非常方便地實現隨機排序且不重複的爬取隊列。

有序集合帶有分數表示,而Scrapy的Request也有優先順序的控制,我們可以用它來實現帶優先順序調度的隊列。

我們需要根據具體爬蟲的需求來靈活選擇不同的隊列。

三、如何去重

Scrapy有自動去重,它的去重使用了Python中的集合。這個集合記錄了Scrapy中每個Request的指紋,這個指紋實際上就是Request的散列值。我們可以看看Scrapy的源代碼,如下所示:

import hashlib

def request_fingerprint(request, include_headers=None):

if include_headers:

include_headers = tuple(to_bytes(h.lower())

for h in sorted(include_headers))

cache = _fingerprint_cache.setdefault(request, {})

if include_headers not in cache:

fp = hashlib.sha1()

fp.update(to_bytes(request.method))

fp.update(to_bytes(canonicalize_url(request.url)))

fp.update(request.body or b”)

if include_headers:

for hdr in include_headers:

if hdr in request.headers:

fp.update(hdr)

for v in request.headers.getlist(hdr):

fp.update(v)

cache[include_headers] = fp.hexdigest()

return cache[include_headers]

request_fingerprint()就是計算Request指紋的方法,其方法內部使用的是hashlib的sha1()方法。計算的欄位包括Request的Method、URL、Body、Headers這幾部分內容,這裡只要有一點不同,那麼計算的結果就不同。計算得到的結果是加密後的字元串,也就是指紋。每個Request都有獨有的指紋,指紋就是一個字元串,判定字元串是否重複比判定Request對象是否重複容易得多,所以指紋可以作為判定Request是否重複的依據。

那麼我們如何判定重複呢?Scrapy是這樣實現的,如下所示:

def __init__(self):

self.fingerprints = set()

def request_seen(self, request):

fp = self.request_fingerprint(request)

if fp in self.fingerprints:

return True

self.fingerprints.add(fp)

在去重的類RFPDupeFilter中,有一個request_seen()方法,這個方法有一個參數request,它的作用就是檢測該Request對象是否重複。這個方法調用request_fingerprint()獲取該Request的指紋,檢測這個指紋是否存在於fingerprints變數中,而fingerprints是一個集合,集合的元素都是不重複的。如果指紋存在,那麼就返回True,說明該Request是重複的,否則這個指紋加入到集合中。如果下次還有相同的Request傳遞過來,指紋也是相同的,那麼這時指紋就已經存在於集合中,Request對象就會直接判定為重複。這樣去重的目的就實現了。

Scrapy的去重過程就是,利用集合元素的不重複特性來實現Request的去重。

對於分散式爬蟲來說,我們肯定不能再用每個爬蟲各自的集合來去重了。因為這樣還是每個主機單獨維護自己的集合,不能做到共享。多台主機如果生成了相同的Request,只能各自去重,各個主機之間就無法做到去重了。

那麼要實現去重,這個指紋集合也需要是共享的,Redis正好有集合的存儲數據結構,我們可以利用Redis的集合作為指紋集合,那麼這樣去重集合也是利用Redis共享的。每台主機新生成Request之後,把該Request的指紋與集合比對,如果指紋已經存在,說明該Request是重複的,否則將Request的指紋加入到這個集合中即可。利用同樣的原理不同的存儲結構我們也實現了分散式Reqeust的去重。

四、防止中斷

在Scrapy中,爬蟲運行時的Request隊列放在內存中。爬蟲運行中斷後,這個隊列的空間就被釋放,此隊列就被銷毀了。所以一旦爬蟲運行中斷,爬蟲再次運行就相當於全新的爬取過程。

要做到中斷後繼續爬取,我們可以將隊列中的Request保存起來,下次爬取直接讀取保存數據即可獲取上次爬取的隊列。我們在Scrapy中指定一個爬取隊列的存儲路徑即可,這個路徑使用JOB_DIR變數來標識,我們可以用如下命令來實現:

scrapy crawl spider -s JOB_DIR=crawls/spider

更加詳細的使用方法可以參見官方文檔,鏈接為:。

在Scrapy中,我們實際是把爬取隊列保存到本地,第二次爬取直接讀取並恢復隊列即可。那麼在分散式架構中我們還用擔心這個問題嗎?不需要。因為爬取隊列本身就是用資料庫保存的,如果爬蟲中斷了,資料庫中的Request依然是存在的,下次啟動就會接著上次中斷的地方繼續爬取。

所以,當Redis的隊列為空時,爬蟲會重新爬取;當Redis的隊列不為空時,爬蟲便會接著上次中斷之處繼續爬取。

五、架構實現

我們接下來就需要在程序中實現這個架構了。首先實現一個共享的爬取隊列,還要實現去重的功能。另外,重寫一個Scheduer的實現,使之可以從共享的爬取隊列存取Request。

幸運的是,已經有人實現了這些邏輯和架構,並發布成叫Scrapy-Redis的Python包。接下來,我們看看Scrapy-Redis的源碼實現,以及它的詳細工作原理

如何用最簡單的Python爬蟲採集整個網站

採集網站數據並不難,但是需要爬蟲有足夠的深度。我們創建一個爬蟲,遞歸地遍歷每個網站,只收集那些網站頁面上的數據。一般的比較費時間的網站採集方法從頂級頁面開始(一般是網站主頁),然後搜索頁面上的所有鏈接,形成列表,再去採集到的這些鏈接頁面,繼續採集每個頁面的鏈接形成新的列表,重複執行。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/243645.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:57
下一篇 2024-12-12 12:57

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python編程二級證書考試相關現已可以上網購買

    計算機二級Python考試是一項重要的國家級認證考試,也是Python編程的入門考試。與其他考試一樣,Python編程二級證書的考生需要進入正式考試,而為了備考,這篇文章將詳細介紹…

    編程 2025-04-29

發表回復

登錄後才能評論