天天看點

從零開始學python(十三)爬蟲工程師自動化和抓包

作者:天天不吃飯阿

前言

回顧之前講述了python文法程式設計 必修入門基礎和網絡程式設計,多線程/多程序/協程等方面的内容,後續講到了資料庫程式設計篇MySQL,Redis,MongoDB篇,和機器學習,全棧開發,資料分析,爬蟲資料采集前面沒看的也不用往前翻,系列文已經整理好了:

從零開始學python(十三)爬蟲工程師自動化和抓包

1.跟我一起從零開始學python(一)程式設計文法必修

2.跟我一起從零開始學python(二)網絡程式設計

3.跟我一起從零開始學python(三)多線程/多程序/協程

4.跟我一起從零開始學python(四)資料庫程式設計:MySQL資料庫

5.跟我一起從零開始學python(五)資料庫程式設計:Redis資料庫

6.跟我一起從零開始學python(六)資料庫程式設計:MongoDB資料庫

7.跟我一起從零開始學python(七)機器學習

8.跟我一起從零開始學python(八)全棧開發

9.跟我一起從零開始學python(九)資料分析

10.跟我一起從零開始學python(十)Hadoop從零開始入門

11.跟我一起從零開始學python(十一)簡述spark

12.跟我一起從零開始學python(十二)如何成為一名優秀的爬蟲工程師

本系列文根據以下學習路線展開講述,由于内容較多:

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

從零開始學python(十三)爬蟲工程師自動化和抓包
從零開始學python(十三)爬蟲工程師自動化和抓包

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

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

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

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

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

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

自動化和抓包專題

一丶selenium采集

之前通過selenium實作過搶演唱會門票,感興趣的可以看看 ?通過selenium自動化實作演唱會搶門票

Selenium是一種流行的自動化Web測試工具,它可以模拟人類使用者在浏覽器中的行為,适合用于建構自動化爬蟲。本專題将介紹如何使用Selenium進行自動化爬取,并講解如何通過抓包擷取網頁資料。

1.Selenium介紹

Selenium是一種開源的自動化測試工具,它可以模拟人類使用者在浏覽器中的行為,例如點選連結、填寫表單、送出資料等等。Selenium支援多種程式設計語言的接口,包括Python、Java、JavaScript等等。對于爬蟲工程師來說,使用Selenium可以友善地建構自動化爬蟲,模拟人類使用者在浏覽器中的操作,進而擷取資料。

2.Selenium的安裝

Selenium可以通過pip安裝,使用以下指令:

pip install selenium           

同時,還需要下載下傳浏覽器對應的驅動程式,例如Chrome浏覽器需要下載下傳ChromeDriver。ChromeDriver的下載下傳連結如下:

https://sites.google.com/a/chromium.org/chromedriver/downloads

下載下傳完成後,需要将ChromeDriver放置到系統的PATH環境變量中,這樣才能在代碼裡使用ChromeDriver啟動Chrome浏覽器。

3.Selenium的基本使用

使用Selenium進行自動化爬取,需要進行以下步驟:

引入selenium庫:使用Python編寫代碼時,需要先引入selenium庫。

from selenium import webdriver           

初始化浏覽器:

Selenium支援多種浏覽器,包括Chrome、Firefox等等。需要通過Selenium提供的API初始化浏覽器,并指定浏覽器驅動程式的位置。

driver = webdriver.Chrome('D:/chromedriver.exe')           

打開網頁:

使用Selenium的get方法打開一個網頁。

driver.get('http://www.baidu.com')           

操作頁面元素:

通過定位頁面元素,使用Selenium模拟使用者在浏覽器中的操作。例如點選連結、填寫表單、送出資料等等。

driver.find_element_by_id('kw').send_keys('Python')   # 輸入關鍵字
driver.find_element_by_id('su').click()              # 點選搜尋按鈕           

擷取資料:

使用Selenium的API擷取頁面的資料,例如擷取頁面的HTML源代碼、截圖等等。

html = driver.page_source    # 擷取頁面的HTML源代碼
driver.save_screenshot('baidu.png')   # 截圖并儲存           

關閉浏覽器:

當完成所有操作後,需要關閉浏覽器。

driver.quit()           

4.Selenium的進階用法

除了基本用法,Selenium還提供了多種進階用法,例如使用代理、使用無頭浏覽器等等。

使用代理:

在進行自動化爬取時,有時會需要使用代理,這時可以通過Selenium設定代理。

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://127.0.0.1:8080')    # 設定代理
driver = webdriver.Chrome('D:/chromedriver.exe', chrome_options=chrome_options)           

使用無頭浏覽器:

有些網站會檢測是否是真實的浏覽器通路,這時可以使用無頭浏覽器,模拟真實的浏覽器行為。

chrome_options = Options()
chrome_options.add_argument('--headless')    # 使用無頭浏覽器
driver = webdriver.Chrome('D:/chromedriver.exe', chrome_options=chrome_options)           

使用等待:

當進行自動化爬取時,需要等待網頁加載完成,才能進行後續操作。可以使用Selenium提供的等待子產品,幫助我們等待網頁加載完成。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get('http://www.baidu.com')
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'kw'))
)    # 等待id為kw的元素加載完成
element.send_keys('Python')
driver.quit()           

5.抓包擷取資料

除了使用Selenium進行自動化爬取,還可以使用抓包的方式擷取網頁資料。抓包可以幫助我們分析網頁的請求和響應,擷取到所需的資料。

常用的抓包工具有Fiddler、Charles等等。以Fiddler為例,介紹如何使用Fiddler進行抓包。

下載下傳Fiddler:

Fiddler可以在官網上進行下載下傳,下載下傳連結如下: https://www.telerik.com/download/fiddler/fiddler4

下載下傳完成後,安裝Fiddler,啟動Fiddler。

設定代理:

在進行抓包時,需要将浏覽器的代理設定為Fiddler的代理。在Fiddler的界面中,找到Tools -> Options -> Connections,勾選"Allow remote computers to connect",并記下Fiddler的IP位址和端口号。

在浏覽器中打開代理設定界面,将代理伺服器的IP位址和端口号設定為Fiddler的位址和端口号。例如在Chrome浏覽器中,代理設定界面可以通過以下位址打開:

chrome://settings/system           

勾選"Use a proxy server",并将"Address"和"Port"分别設定為Fiddler的位址和端口号。

抓包擷取資料:

打開浏覽器,通路需要爬取的網頁。在Fiddler的界面中,可以看到浏覽器和網站之間的通信資料,其中包含了請求和響應資料。可以通過分析這些資料,找到所需的資料,并提取出來。 通過抓包的方式擷取到的資料,通常是JSON格式或者XML格式。可以使用Python的内置庫或者第三方庫來處理這些資料,進而擷取到所需的内容。

總結

在進行自動化爬取時,使用Selenium可以友善地模拟人類使用者的操作,進而擷取資料。同時,通過抓包的方式,可以分析網頁的請求和響應,進而擷取到所需的資料。需要注意的是,進行自動化爬取和抓包時,需要遵守相關的法律法規,不得進行違法違規的操作。

二丶pyppeteer采集

Pyppeteer是一個基于Chrome DevTools Protocol的Python庫,可以與無頭Chrome(Headless Chrome)進行互動,進而實作自動化的浏覽器操作和網頁抓取。本文将詳細介紹如何使用Pyppeteer進行爬蟲和自動化任務。

Pyppeteer的安裝可以通過pip進行:

pip install pyppeteer           

安裝完成後,可以建立一個Python腳本,導入pyppeteer庫并建立一個異步的浏覽器對象:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    # 程式的主要邏輯寫在這裡

    await browser.close()

asyncio.get_event_loop().run_until_complete(main())           

有了浏覽器對象後,就可以開始執行各種浏覽器操作了。下面是一些常見操作的示例:

打開指定的網址:

await page.goto('https://www.example.com')           

擷取頁面的HTML内容:

html = await page.evaluate('document.documentElement.outerHTML')           

在表單中填寫内容并送出:

await page.type('#username', 'my_username')
await page.type('#password', 'my_password')
await page.click('#submit')           

等待頁面加載完畢:

await page.waitForNavigation()           

截屏儲存頁面快照:

await page.screenshot({'path': 'screenshot.png'})           

在進行網頁抓取時,有時候會需要模拟使用者的互動,比如點選按鈕、滾動頁面、擷取特定元素的文本内容等等。Pyppeteer也提供了豐富的API來實作這些功能。例如,要點選頁面上的一個按鈕:

await page.click('#my_button')           

要擷取特定元素的文本内容:

element = await page.querySelector('#my_element')
text_content = await element.evaluate('(element) => element.textContent')           

Pyppeteer也支援處理檔案上傳、處理JavaScript彈窗、執行自定義JavaScript代碼等進階功能。具體使用方法可以參考Pyppeteer的官方文檔。

同時,由于Pyppeteer是基于Chrome DevTools Protocol開發的,是以可以通過抓包工具分析浏覽器的網絡請求,進而拿到網頁的請求和響應資訊。一個常用的抓包工具是Fiddler,可以用來監聽浏覽器和網站之間的通信,并檢視請求和響應的詳細内容。

Pyppeteer提供了與Fiddler等抓包工具配合使用的功能。可以通過調用pyppeteer.connection.Connection類的from_browser_wse方法,傳入Fiddler的WebSocket代理位址,實作Pyppeteer與Fiddler的通信。

import pyppeteer.connection

pyppeteer.connection.Connection.from_browser_wse(f'ws://127.0.0.1:8866/devtools/browser/{browser.browserWSEndpoint.lstrip("ws://")}')           

這樣,通過Fiddler就可以檢視Pyppeteer與浏覽器之間的通信,并捕獲請求和響應資料。

總結一下,Pyppeteer是一個友善的Python庫,可以實作自動化的浏覽器操作和網頁抓取。它提供了豐富的API,可以模拟使用者的互動行為,處理檔案上傳、JavaScript彈窗等進階功能,并通過抓包工具分析網絡請求和響應資料,友善擷取網頁内容和進行其他進一步的處理。

pyppeteer請求實戰案例

當使用Pyppeteer進行異步請求時,可以利用Python的異步程式設計特性(如asyncio和await)來實作高效的自動化任務和抓包功能。在本次實戰中,我們将詳細解釋如何使用Pyppeteer進行異步請求,并提供一個示例項目供參考。

安裝Pyppeteer: 首先,確定你已安裝Python和pip。然後在指令行中運作以下指令來安裝Pyppeteer:

pip install pyppeteer           

導入所需的子產品和庫: 建立一個新的Python腳本,并導入所需的子產品和庫:

import asyncio
from pyppeteer import launch           

定義異步函數: 在腳本中建立一個異步函數,用于異步請求的操作:

async def fetch_data(url):
    browser = await launch()
    page = await browser.newPage()
    await page.goto(url)
    content = await page.content()
    await browser.close()
    return content           

在這個示例中,我們定義了一個名為fetch_data的異步函數,它接收一個URL參數,并使用Pyppeteer來打開和渲染該URL頁面。然後,我們使用await關鍵字等待頁面的加載和渲染完成,并使用page.content()方法擷取頁面的内容。最後,我們關閉浏覽器并傳回頁面的内容。

調用異步函數: 建立一個主函數,并在其中調用異步函數:

async def main():
    url = 'https://example.com'
    content = await fetch_data(url)
    print(content)

asyncio.get_event_loop().run_until_complete(main())           

在這個示例中,我們定義了一個名為main的異步函數,在其中設定要請求的URL,并通過await關鍵字調用fetch_data函數來擷取頁面内容。最後,我們使用print語句将内容列印在控制台上。

運作腳本:

在指令行中運作腳本,你将看到擷取到的頁面内容被列印在控制台上。

這是一個簡單的使用Pyppeteer進行異步請求的項目實戰詳解。通過靈活運用Pyppeteer的異步特性,你可以實作更複雜和高效的自動化任務和抓包功能。你可以根據具體需求,進一步擴充和優化這個示例,以滿足不同的項目需求。注意,Pyppeteer還提供了其他功能和API,如模拟使用者互動、處理頁面元素、執行JavaScript代碼等等。在實際項目中,你可以根據需要使用這些功能來完成更多的任務

三丶Charles抓包

Charles是一款流行的網絡抓包工具,廣泛應用于PC端爬蟲工程師的自動化和抓包任務中。它可以截獲網絡請求和響應資料,幫助開發者分析和調試網絡通信。下面是Charles抓包的詳細解釋和使用方法:

下載下傳和安裝Charles:

首先,你需要在官方網站上下載下傳并安裝Charles。官方網站位址為:https://www.charlesproxy.com/

配置網絡代理:

安裝完成後,打開Charles并配置網絡代理。在Charles的菜單欄中選擇"Proxy",然後點選"Proxy Settings"。在彈出的視窗中,選擇"HTTP Proxy"選項,将端口設定為8888(預設端口),并確定"Enable macOS proxy"或"Enable Windows proxy"選項被選中。儲存設定并關閉視窗。

SSL代理配置(可選):

如果你需要抓取HTTPS請求的資料,你還需要在Charles中配置SSL代理。在Charles的菜單欄中選擇"Help",然後點選"SSL Proxying",并選擇"Install Charles Root Certificate"。根據作業系統的不同,你可能需要輸入管理者密碼來完成證書安裝。完成後,Charles就可以解析和顯示HTTPS請求的資料。

啟動代理:

在配置完成後,點選Charles的"Proxy"菜單并将"Proxy"選項打開,表示Charles的代理功能已啟動。

手機端代理設定(可選):

如果你需要抓取手機端的請求資料,你還需要在手機設定中将代理設定為Charles的IP位址和端口。IP位址通常為運作Charles的計算機的IP位址,端口為8888(預設端口)。在手機上打開設定,進入Wi-Fi或移動網絡選項,找到目前所連接配接的網絡,點選進入進階設定,然後将代理設定為Charles的IP位址和端口。

開始抓包:

在Charles中,你将看到請求和響應資料的清單。要開始抓包,你可以在Charles視窗的左上方的"Record"按鈕上點選。點選後,Charles将開始記錄網絡請求和響應資料。

分析抓包結果:

當網絡請求和響應發生時,Charles會顯示在其視窗中。你可以通過點選每個請求來檢視其詳細資訊,包括請求頭、響應頭、請求體、響應體等。

過濾和定位請求: 如果你的抓包結果非常龐大,你可以使用Charles的過濾功能來找到特定的請求。你可以按照URL、域名、請求方法等進行過濾,以便更友善地定位到你感興趣的請求。

修改請求和響應:

Charles還允許你修改請求和響應資料,以便進行調試和測試。你可以通過右鍵點選特定請求,并選擇"Edit"來修改其請求和響應資料。

儲存和導出抓包結果:

Charles允許你儲存整個會話的抓包結果,并可以導出為Har檔案或其他格式進行進一步的分析和處理。

通過上述步驟,你可以開始使用Charles進行抓包并分析網絡請求和響應資料。它為PC端爬蟲工程師提供了豐富的工具和功能,幫助他們進行自動化任務和網絡調試。請注意,合法合規的使用Charles以及尊重網站的使用條款和隐私政策非常重要。

Charles替換CSS和JS檔案

在PC端爬蟲工程中,Charles是一款非常強大的抓包工具,能夠助力開發人員進行網絡請求的抓取、修改以及響應的重放等操作。在抓包過程中,有時我們需要替換CSS和JS檔案,以便在分析和測試中進行一些定制化的操作。下面是詳細的步驟:

步驟一:安裝和配置Charles

  • 下載下傳并安裝Charles。你可以從官方網站(https://www.charlesproxy.com/)下載下傳适合你作業系統的版本,并按照安裝向導進行安裝。
  • 配置浏覽器代理。啟動Charles後,在浏覽器中配置代理,将代理設定為Charles所在的IP位址和端口(預設端口為8888)。這樣可以確定所有的浏覽器請求都通過Charles進行中間人代理。

步驟二:設定替換規則

  • 打開Charles主界面後,點選“Tools”菜單,選擇“Map Local…”。
  • 在“Map Local”對話框中,點選“Add”按鈕添加一個新的映射規則。
  • 在映射規則中,填寫要映射的遠端URL和本地檔案的路徑。遠端URL是指要替換的CSS或JS檔案的網絡路徑,本地檔案路徑是指你準備替換的本地檔案路徑。點選“Browse”按鈕來選擇本地檔案。

步驟三:應用更改并驗證

  • 確定你已經完成了所有的替換規則并儲存了它們。
  • 在浏覽器中通路包含被替換檔案的網頁。Charles會中間人代理該請求并傳回替換後的檔案。
  • 在Charles的主界面中,可以點選“Sequence”頁籤檢視正在進行的請求。找到相應的請求,可以通過右鍵單擊和選擇“Save Response…”來儲存響應檔案。
  • 檢查網頁以确認CSS或JS檔案已被成功替換。你可以通過檢視源代碼、開發者工具或網頁效果的變化來驗證替換的結果。

需要注意的是,Charles隻會在請求被重定向到代理的情況下才會生效,是以你可能需要在浏覽器中配置代理以確定請求能夠經過Charles。

使用Charles進行CSS和JS檔案的替換可以幫助你在開發和測試過程中進行一些定制化的操作,比如替換特定的CSS樣式或JS代碼,進而實作一些特定的測試需求。

四丶mitmproxy

mitmproxy腳本編寫-資料截取-代理響應

當涉及到PC端爬蟲工程師的自動化和抓包專題時,mitmproxy是一個常用的工具,它可以作為中間人攻擊(Man-in-the-Middle)的代理伺服器,用于截取和修改用戶端和伺服器之間的通信資料。在此基礎上,您可以使用mitmproxy的腳本編寫功能來實作資料截取和代理響應的自動化處理。

下面是一些基本步驟來編寫mitmproxy腳本以實作資料截取和代理響應的自動化:

安裝mitmproxy:您可以從mitmproxy官方網站

(https://mitmproxy.org/)下載下傳并安裝mitmproxy,根據您的作業系統選擇合适的版本。

建立腳本檔案:使用文本編輯器建立一個Python腳本檔案,例如mitmproxy_script.py。

導入必要的子產品:您的腳本需要導入mitmproxy、http和netlib等子產品,可以使用類似以下的代碼進行導入:

from mitmproxy import ctx, http
from mitmproxy.net import encoding           

編寫腳本邏輯:在腳本檔案中,您可以定義各種回調函數來處理請求和響應。下面是幾個常用的回調函數:

  • request(flow: http.HTTPFlow):處理每個請求流(Flow),您可以在此函數中通路和修改請求的資訊。
  • response(flow: http.HTTPFlow):處理每個響應流(Flow),您可以在此函數中通路和修改響應的資訊。

實作資料截取和代理響應邏輯:在相應的回調函數中,您可以編寫代碼來實作資料截取和代理響應的邏輯。以下是一些示例代碼片段:

def request(flow: http.HTTPFlow):
    # 檢查請求是否符合條件
    if 'example.com' in flow.request.host:
        # 擷取請求資料
        request_data = flow.request.content
        # 進行相應處理
        ...

def response(flow: http.HTTPFlow):
    # 檢查響應是否符合條件
    if 'example.com' in flow.request.host:
        # 擷取響應資料
        response_data = flow.response.content
        # 進行相應處理
        ...           

在上述代碼片段中,您可以使用flow.request和flow.response對象來擷取請求和響應的相關資訊,例如URL、請求頭、請求體、響應狀态碼、響應頭和響應體等。

運作mitmproxy腳本:使用指令行工具進入到腳本檔案所在的目錄,并運作以下指令來啟動mitmproxy并加載您的腳本:

mitmproxy -s mitmproxy_script.py           

此指令将啟動mitmproxy,并将您的腳本作為參數傳遞給它。mitmproxy将開始監聽網絡流量,并在請求和響應時調用相應的回調函數。

通過以上步驟,您可以編寫mitmproxy腳本來實作資料截取和代理響應的自動化。您可以根據具體的需求和場景進一步定制和優化腳本邏輯。

從零開始學python(十三)爬蟲工程師自動化和抓包

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

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

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

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

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

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