前言
回顧之前講述了python文法程式設計 必修入門基礎和網絡程式設計,多線程/多程序/協程等方面的内容,後續講到了資料庫程式設計篇MySQL,Redis,MongoDB篇,和機器學習,全棧開發,資料分析,爬蟲資料采集前面沒看的也不用往前翻,系列文已經整理好了:
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完整項目實戰教程筆記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完整項目實戰教程筆記PDF
② 十幾個大廠python面試專題PDF
③ python全套視訊教程(零基礎-進階進階JS逆向)
④ 百個項目實戰+源碼+筆記
⑤ 程式設計文法-機器學習-全棧開發-資料分析-爬蟲-APP逆向等全套項目+文檔