天天看點

從零開始學python(十五)大廠必用feapder架構

作者:天天不吃飯阿

前言

從零開始學python(十五)大廠必用feapder架構

今天講述很多大廠都在用的feapder架構,前面更新了十四個從零開始學python的系列文章,分别是:

1.程式設計文法必修篇

2.網絡程式設計篇

3.多線程/多程序/協程篇

4.MySQL資料庫篇

5.Redis資料庫篇

6.MongoDB資料庫篇

7.機器學習篇

8.全棧開發篇

9.Numpy/pandas/matplotlib篇

10.Hadoop篇

11.Spark篇

12.爬蟲工程師篇

13.爬蟲工程師自動化和抓包篇

14.scrapy架構篇

本系列文根據以下學習路線展開講述:

從零開始學python到進階進階路線圖首頁

從零開始學python(十五)大廠必用feapder架構

一丶feapder任務排程機制

Feapder是一個基于Python的開源網絡爬蟲架構,具有任務排程、請求管理、資料解析等功能。其中,任務排程機制是Feapder架構的核心組成部分之一,用于管理和排程爬蟲任務的執行。

任務排程機制的核心概念是任務隊列(Task Queue),它用于存儲待執行的任務,并按照指定的優先級和排程政策來決定任務的執行順序。Feapder架構使用Redis作為任務隊列的存儲後端,并通過排程器(Scheduler)來管理任務隊列的操作。

下面是Feapder架構任務排程機制的詳細解釋:

1.任務隊列(Task Queue):

Feapder使用Redis作為任務隊列的存儲後端。任務隊列中存儲了待執行的任務,每個任務包含了要爬取的網址、爬蟲名稱、優先級等資訊。當爬蟲啟動時,它會從任務隊列中擷取待執行的任務,并開始執行。

2.排程器(Scheduler):

排程器是任務排程機制的核心元件,用于管理任務隊列。它負責從任務隊列中擷取待執行的任務,并根據任務的優先級和排程政策來确定任務的執行順序。排程器還負責将已執行的任務傳回給任務隊列,以便可以對其進行後續處理。

Feapder架構中的排程器實作了多個排程政策,包括先進先出(FIFO)、優先級(Priority)和随機(Random)等。開發者可以根據實際需求選擇适合的排程政策。

3.爬蟲任務(Spider Task):

爬蟲任務是任務排程機制的核心對象,表示待執行的爬蟲任務。每個爬蟲任務包含了要爬取的網址、待執行的爬蟲名稱、任務優先級等資訊。爬蟲任務由排程器從任務隊列中擷取,并通過排程器分發給相應的爬蟲執行。當爬蟲完成任務後,會将任務傳回給排程器,進而完成任務的生命周期。

4.爬蟲執行過程:

當Feapder架構啟動時,排程器會從任務隊列中擷取待執行的任務。然後,根據排程政策和任務優先級,将任務分發給相應的爬蟲進行執行。爬蟲執行任務後,會傳回任務的執行結果給排程器。排程器根據任務的狀态進行下一步的排程決策,繼續擷取下一個待執行的任務,并分發給爬蟲繼續執行。這樣,任務的執行和排程就形成了一個循環,直到任務隊列中沒有待執行的任務為止。

通過任務排程機制,Feapder架構可以高效地管理和排程大量的爬蟲任務,并實作靈活的任務優先級和排程政策。

二丶Feapder中間件實作異常處理

在Feapder架構中,中間件(Middleware)是一種攔截和處理請求以及響應的機制,用于在請求發送和響應解析過程中進行額外的處理。中間件可以用于實作異常處理、請求過濾、請求修改、日志記錄等功能。

下面是Feapder架構中間件實作異常處理的詳細解釋:

1.異常進行中間件(Exception Middleware): 異常進行中間件是一種特殊類型的中間件,用于捕獲和處理爬蟲請求過程中可能出現的異常情況。當請求過程中發生異常時,異常進行中間件會捕獲異常并進行相應的處理,如記錄日志、重試請求等。

2.異常進行中間件的實作:

在Feapder架構中,可以自定義異常進行中間件,實作自己的異常處理邏輯。可以通過繼承BaseMiddleware并重寫相應的方法來實作異常進行中間件。

  • process_request(request, spider) 方法用于處理請求發送之前的邏輯。在該方法中,可以對請求進行一些預處理,或者進行異常處理的初始化操作。
  • process_response(request, response, spider) 方法用于處理請求響應的邏輯。在該方法中,可以對響應進行一些處理,或者捕獲和處理請求過程中可能出現的異常情況。
  • process_exception(request, exception, spider) 方法用于處理請求過程中發生的異常情況。在該方法中,可以針對特定的異常類型進行相應的處理,如記錄日志、重試請求等。

3.配置異常進行中間件:

在Feapder架構的配置檔案中,可以指定使用哪些中間件以及它們的順序。對于異常進行中間件,可以将其添加到中間件清單中,并指定其順序。Feapder架構在執行請求過程時,會按照中間件清單的順序依次調用相應的中間件方法。

通過中間件機制,Feapder架構提供了靈活的異常處理能力。開發者可以自定義異常進行中間件,并根據自己的需求進行定制化的異常處理邏輯。

三丶架構對接selenium實作自動化

feapder是一個基于Python的爬蟲架構,它提供了一些友善的工具和接口,可以幫助開發者快速建構爬蟲。其中,feapder架構對接selenium實作自動化是其重要的功能之一。

Selenium是一個自動化測試工具,可以模拟使用者在浏覽器中的操作,比如點選、輸入、滾動等。在爬蟲中,我們可以利用Selenium來模拟使用者的操作,進而實作一些需要登入或者需要執行JavaScript代碼的爬蟲任務。

下面是feapder架構對接selenium實作自動化的詳細步驟:

1.安裝Selenium和ChromeDriver

在使用Selenium之前,需要先安裝Selenium和ChromeDriver。Selenium可以通過pip安裝,ChromeDriver需要根據自己的Chrome浏覽器版本下載下傳對應的驅動程式。

2.建立SeleniumDownloader

在feapder中,我們可以通過建立SeleniumDownloader來實作對接Selenium。SeleniumDownloader是一個下載下傳器,它可以在下載下傳網頁時使用Selenium來模拟使用者的操作。

from feapder.downloader import SeleniumDownloader

downloader = SeleniumDownloader(
    chrome_executable_path="path/to/chromedriver",
    headless=False,  # 是否使用無頭浏覽器
    load_images=False,  # 是否加載圖檔
    window_size=(1920, 1080),  # 浏覽器視窗大小
    timeout=30,  # 逾時時間
)           

3.建立Spider

在feapder中,我們可以通過建立Spider來實作爬蟲任務。在Spider中,我們可以使用SeleniumDownloader來下載下傳網頁,并且可以在下載下傳前或下載下傳後執行一些自定義的操作。

from feapder import Spider

class MySpider(Spider):
    def start_requests(self):
        yield self.request(url="https://www.baidu.com", callback=self.parse)

    def parse(self, request, response):
        # 使用SeleniumDownloader下載下傳網頁
        response = self.download(request, downloader_cls=SeleniumDownloader)

        # 在下載下傳前或下載下傳後執行一些自定義的操作
        driver = response.meta["driver"]
        driver.execute_script("alert('Hello, world!')")

        # 解析網頁
        ...

if __name__ == "__main__":
    MySpider.start()           

在上面的代碼中,我們使用SeleniumDownloader下載下傳了百度首頁,并在下載下傳後執行了一個JavaScript腳本,彈出了一個提示框。

4.配置Selenium

在使用Selenium時,我們需要配置一些選項,比如浏覽器視窗大小、逾時時間等。在feapder中,我們可以通過在Spider中定義selenium_options屬性來配置Selenium。

from selenium.webdriver.chrome.options import Options

class MySpider(Spider):
    selenium_options = Options()
    selenium_options.add_argument("--disable-gpu")
    selenium_options.add_argument("--disable-dev-shm-usage")
    selenium_options.add_argument("--disable-extensions")
    selenium_options.add_argument("--disable-infobars")
    selenium_options.add_argument("--disable-notifications")
    selenium_options.add_argument("--disable-popup-blocking")
    selenium_options.add_argument("--disable-setuid-sandbox")
    selenium_options.add_argument("--disable-web-security")
    selenium_options.add_argument("--ignore-certificate-errors")
    selenium_options.add_argument("--no-sandbox")
    selenium_options.add_argument("--start-maximized")
    selenium_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")

    def start_requests(self):
        ...           

在上面的代碼中,我們定義了一些常用的Selenium選項,比如禁用GPU加速、禁用擴充、禁用通知等。

5.使用代理

在爬蟲中,我們經常需要使用代理來隐藏自己的IP位址。在feapder中,我們可以通過在Spider中定義proxy_pool屬性來使用代理。

class MySpider(Spider):
    proxy_pool = ["http://127.0.0.1:8888", "http://127.0.0.1:8889"]

    def start_requests(self):
        ...           

在上面的代碼中,我們定義了兩個代理位址,feapder會自動從中選擇一個代理來通路網頁。

6.使用Cookie

在爬蟲中,我們經常需要使用Cookie來模拟登入狀态。在feapder中,我們可以通過在Spider中定義cookie_pool屬性來使用Cookie。

class MySpider(Spider):
    cookie_pool = [
        {"name": "name1", "value": "value1", "domain": "domain1.com"},
        {"name": "name2", "value": "value2", "domain": "domain2.com"},
    ]

    def start_requests(self):
        ...           

在上面的代碼中,我們定義了兩個Cookie,feapder會自動将它們添加到請求頭中。

7.使用自定義的SeleniumDownloader

在feapder中,我們可以通過繼承SeleniumDownloader來實作自定義的下載下傳器。在自定義的下載下傳器中,我們可以重寫一些方法,比如before_download、after_download等,來實作一些自定義的操作。

from feapder.downloader import SeleniumDownloader

class MyDownloader(SeleniumDownloader):
    def before_download(self, request):
        # 在下載下傳前執行一些自定義的操作
        ...

    def after_download(self, request, response):
        # 在下載下傳後執行一些自定義的操作
        ...

class MySpider(Spider):
    downloader_cls = MyDownloader

    def start_requests(self):
        ...           

在上面的代碼中,我們定義了一個自定義的下載下傳器MyDownloader,并在Spider中使用它來下載下傳網頁。

8.總結

通過以上步驟,我們可以在feapder架構中對接Selenium,實作自動化爬蟲任務。在使用Selenium時,我們需要注意一些問題,比如浏覽器視窗大小、逾時時間、代理、Cookie等。同時,我們也可以通過自定義的SeleniumDownloader來實作一些自定義的操作。

四丶feapder分布式采集

Feapder是一個基于Python的分布式爬蟲架構,它支援多種資料存儲方式,包括MySQL、MongoDB、Redis等。Feapder架構的分布式采集功能可以讓多個爬蟲節點同時工作,提高爬取效率。

下面是Feapder架構分布式采集的詳細介紹:

1.安裝Feapder架構

首先需要安裝Feapder架構,可以使用pip指令進行安裝:

pip install feapder           

2.建立爬蟲項目

使用Feapder架構建立一個爬蟲項目非常簡單,隻需要繼承Feapder類并實作相應的方法即可。下面是一個簡單的爬蟲示例:

from feapder import Spider

class MySpider(Spider):
    def start_requests(self):
        yield self.request("http://www.example.com")

    def parse(self, request, response):
        print(response.text)           

在這個示例中,我們建立了一個名為MySpider的爬蟲類,它繼承自Feapder類。在start_requests方法中,我們發送了一個請求并将其傳回。在parse方法中,我們列印了響應的文本内容。

3.配置分布式采集

要啟用分布式采集功能,需要在配置檔案中設定相應的參數。下面是一個示例配置檔案:

# 配置檔案
name: my_spider
log_level: INFO
redis:
  host: 127.0.0.1
  port: 6379
  db: 0
  password: ""
  queue_name: my_spider
  max_tasks: 100
  concurrency: 10           

在這個配置檔案中,我們設定了Redis作為任務隊列的存儲方式,并指定了隊列名稱、最大任務數和并發數等參數。

4.啟動爬蟲節點

要啟動爬蟲節點,需要使用Feapder指令行工具。首先需要安裝Feapder指令行工具:

pip install feapder-cli           

然後使用feapder指令啟動爬蟲節點:

feapder run my_spider           

在這個指令中,我們指定了要運作的爬蟲名稱為my_spider。

5.送出任務

要送出任務,可以使用Feapder架構提供的TaskQueue類。下面是一個示例:

from feapder import TaskQueue

queue = TaskQueue()
queue.put("http://www.example.com")           

在這個示例中,我們建立了一個TaskQueue對象,并向其中送出了一個任務。

6.運作爬蟲

當任務送出完成後,可以使用Feapder架構提供的run方法來運作爬蟲:

from feapder import run_spider

run_spider(MySpider)           

在這個示例中,我們使用run_spider方法來運作MySpider爬蟲。

7.檢視結果

當爬蟲運作完成後,可以檢視爬取的結果。Feapder架構支援多種資料存儲方式,包括MySQL、MongoDB、Redis等。可以根據需要選擇相應的存儲方式。

以上就是Feapder架構分布式采集的詳細介紹。使用Feapder架構可以輕松實作分布式爬蟲,提高爬取效率。

從零開始學python(十五)大廠必用feapder架構

适用于零基礎學習和進階人群的python資源:

① 騰訊認證python完整項目實戰教程筆記PDF

② 十幾個大廠python面試專題PDF

③ python全套視訊教程(零基礎-進階進階JS逆向)

④ 百個項目實戰+源碼+筆記

⑤ 程式設計文法-機器學習-全棧開發-資料分析-爬蟲-APP逆向等全套項目+文檔