探索一系列用于網(wǎng)頁抓取的強大 Python 庫,包括用于 HTTP 請求、解析 HTML/XML 和自動瀏覽的庫。
網(wǎng)絡抓取已成為當今數(shù)據(jù)驅動世界中不可或缺的工具。Python 是最流行的抓取語言之一,擁有一個由強大的庫和框架組成的龐大生態(tài)系統(tǒng)。在本文中,我們將探索用于網(wǎng)絡抓取的最佳Python 庫,每個庫都提供獨特的特性和功能來簡化從網(wǎng)站提取數(shù)據(jù)的過程。
本文還將介紹最佳庫和最佳實踐,以確保高效和負責任的網(wǎng)絡抓取。從尊重網(wǎng)站政策和處理率限制到解決常見挑戰(zhàn),我們將提供寶貴的見解,幫助您有效地駕馭網(wǎng)絡抓取的世界。
Scrape-It.Cloud
讓我們從 Scrape-It.Cloud 庫開始,它提供了對用于抓取數(shù)據(jù)的API 的訪問。該解決方案有幾個優(yōu)點。例如,我們通過中介來完成此操作,而不是直接從目標網(wǎng)站抓取數(shù)據(jù)。這保證了我們在抓取大量數(shù)據(jù)時不會被阻止,因此我們不需要代理。我們不必解決驗證碼問題,因為 API 會處理這個問題。此外,我們可以抓取靜態(tài)頁面和動態(tài)頁面。
特征
借助 Scrape-It.Cloud 庫,您可以通過簡單的 API 調(diào)用輕松從任何站點提取有價值的數(shù)據(jù)。它解決了代理服務器、無頭瀏覽器和驗證碼解決服務的問題。
通過指定正確的 URL,Scrape-It.Cloud 可以快速返回包含必要數(shù)據(jù)的 JSON。這使您可以專注于提取正確的數(shù)據(jù),而不必擔心數(shù)據(jù)被阻止。
此外,此 API 允許您從使用 React、AngularJS、Ajax、Vue.js 和其他流行庫創(chuàng)建的動態(tài)頁面中提取數(shù)據(jù)。
此外,如果您需要從 Google SERP 收集數(shù)據(jù),您還可以將此 API 密鑰用于serp api python庫。
安裝
要安裝該庫,請運行以下命令:
pip install scrapeit-cloud
要使用該庫,您還需要一個 API 密鑰。您可以通過在網(wǎng)站上注冊來獲取它。此外,您還將獲得一些免費積分來免費提出請求并探索圖書館的功能。
使用示例
對特定庫的所有功能、特性和使用方法的詳細描述值得單獨撰寫一篇文章?,F(xiàn)在,我們將僅向您展示如何獲取任何網(wǎng)頁的 HTML 代碼,無論您是否可以訪問該網(wǎng)頁、是否需要驗證碼解決方案以及頁面內(nèi)容是靜態(tài)還是動態(tài)。
為此,只需指定您的 API 密鑰和頁面 URL。
from scrapeit_cloud import ScrapeitCloudClient import json client = ScrapeitCloudClient(api_key="YOUR-API-KEY") response = client.scrape( params={ "url": "https://example.com/" } )
由于結果采用 JSON 格式,并且頁面的內(nèi)容存儲在 屬性 中["scrapingResult"]["content"],因此我們將使用它來提取所需的數(shù)據(jù)。
data = json.loads(response.text) print(data["scrapingResult"]["content"])
結果,檢索到的頁面的 HTML 代碼將顯示在屏幕上。
Requests 和 BeautifulSoup 組合
最簡單和最流行的庫之一是BeautifulSoup。但是,請記住,它是一個解析庫,不具備自行發(fā)出請求的能力。因此,它通常與簡單的請求庫(如Requests、 http.client 或 cUrl )一起使用。
特征
這個庫是為初學者設計的,非常容易使用。此外,它還擁有詳細記錄的說明和活躍的社區(qū)。
BeautifulSoup庫(或 BS4)是專門為解析而設計的,這賦予了它廣泛的功能。您可以使用 XPath 和 CSS 選擇器來抓取網(wǎng)頁。
由于其簡單性和活躍的社區(qū),在線提供了大量其使用示例。此外,如果您在使用過程中遇到困難,您可以獲得幫助來解決您的問題。
安裝
如前所述,我們需要兩個庫來使用它。為了處理請求,我們將使用 Requests 庫。好消息是它是預安裝的,因此我們不需要單獨安裝它。但是,我們確實需要安裝 BeautifulSoup 庫才能使用它。為此,只需使用以下命令:
pip install beautifulsoup4
安裝完成后,您可以立即開始使用它。
使用示例
假設我們想要檢索<h1>包含標頭的標簽的內(nèi)容。為此,我們首先需要導入必要的庫并發(fā)出請求以獲取頁面的內(nèi)容:
import requests from bs4 import BeautifulSoup data = requests.get('https://example.com')
為了處理頁面,我們將使用 BS4 解析器:
soup = BeautifulSoup(data.text, "html.parser")
現(xiàn)在,我們所要做的就是指定我們想要從頁面中提取的確切數(shù)據(jù):
text = soup.find_all('h1')
最后,我們將獲取到的數(shù)據(jù)顯示在屏幕上:
print(text)
正如我們所看到的,使用該庫非常簡單。然而,它確實有其局限性。例如,它無法抓取動態(tài)數(shù)據(jù),因為它是一個與基本請求庫而不是無頭瀏覽器一起使用的解析庫。
LXML
LXML是另一個流行的數(shù)據(jù)解析庫,它不能單獨用于抓取。由于它還需要一個庫來發(fā)出請求,因此我們將使用我們已經(jīng)知道的熟悉的 Requests 庫。
特征
盡管它與以前的庫相似,但它確實提供了一些附加功能。例如,它比 BS4 更擅長處理 XML 文檔結構。雖然它還支持 HTML 文檔,但如果您有更復雜的 XML 結構,該庫將是更合適的選擇。
安裝
正如前面提到的,盡管需要請求庫,但我們只需要安裝 LXML 庫,因為其他所需的組件已經(jīng)預先安裝。
要安裝 LXML,請在命令提示符中輸入以下命令:
pip install lxml
現(xiàn)在讓我們繼續(xù)看一下使用該庫的示例。
使用示例
首先,就像上次一樣,我們需要使用一個庫來獲取網(wǎng)頁的 HTML 代碼。這部分代碼與前面的示例相同:
import requests from lxml import html data = requests.get('https://example.com')
現(xiàn)在我們需要將結果傳遞給解析器,以便它可以處理文檔的結構:
tree = html.fromstring(data.content)
最后,剩下的就是為所需元素指定 CSS 選擇器或 XPath,并將處理后的數(shù)據(jù)打印在屏幕上。讓我們以 XPath 為例:
data = tree.xpath('//h1') print(data)
結果,我們將得到與上一個示例相同的標題:
['Example Domain']
然而,盡管在簡單的示例中可能不太明顯,但 LXML 庫對于初學者來說比前一個庫更具挑戰(zhàn)性。它還擁有較少記錄的資源和不太活躍的社區(qū)。
因此,在處理難以使用其他方法處理的復雜 XML 結構時,建議使用 LXML。
Scrapy
與前面的示例不同,Scrapy不僅僅是一個庫,而且是一個成熟的網(wǎng)絡抓取框架。它不需要額外的庫,并且是一個獨立的解決方案。然而,對于初學者來說,這似乎相當具有挑戰(zhàn)性。如果這是您的第一個網(wǎng)絡抓取工具,那么值得考慮另一個庫。
特征
盡管有其缺點,但該框架在某些情況下是非常寶貴的解決方案。例如,當您希望項目易于擴展時。或者,如果您需要在同一項目中使用多個具有相同設置的抓取工具,您只需使用一個命令即可一致運行,并將所有收集到的信息有效地組織成正確的格式。
使用 Scrapy 創(chuàng)建的單個抓取工具稱為爬蟲,可以是項目中唯一的一個爬蟲,也可以是多個爬蟲中的一個。該項目有自己的配置文件,適用于項目內(nèi)的所有抓取工具。此外,每個蜘蛛都有自己的設置,這些設置將獨立于整個項目的設置運行。
安裝
您可以像任何其他 Python 庫一樣通過在命令行中輸入安裝命令來安裝此框架。
pip install scrapy
現(xiàn)在讓我們繼續(xù)討論使用該框架的示例。
使用示例
與庫示例不同,創(chuàng)建項目就像蜘蛛文件一樣,是通過特殊命令完成的。必須在命令行中輸入它。
首先,讓我們創(chuàng)建一個新項目,在其中構建我們的抓取工具。使用以下命令:
scrapy startproject test_project
您可以輸入test_project任何其他項目名稱。現(xiàn)在我們可以導航到我們的項目文件夾或在此處創(chuàng)建一個新的蜘蛛。
在我們繼續(xù)創(chuàng)建蜘蛛之前,讓我們看一下項目樹的結構。
這里提到的文件是在創(chuàng)建新項目時自動生成的。這些文件中指定的任何設置都將應用于項目中的所有蜘蛛。您可以在“items.py”文件中定義公共類,在“pipelines.py”文件中指定項目啟動時要執(zhí)行的操作,并在“settings.py”文件中配置常規(guī)項目設置。
現(xiàn)在讓我們回到命令行并導航到我們的項目文件夾:
cd test_project
之后,我們將在所需項目的文件夾中創(chuàng)建一個新的蜘蛛:
scrapy genspider example example.com
接下來,您可以打開蜘蛛文件并手動編輯它。該genspider命令創(chuàng)建一個框架,使您可以更輕松地構建抓取工具。要檢索頁面的標題,請轉到蜘蛛文件并找到以下函數(shù):
def parse(self, response): pass
替換pass為執(zhí)行必要功能的代碼。在我們的例子中,它涉及從標簽中提取數(shù)據(jù)h1:
def parse(self, response): item = DemoItem() item["text"] = response.xpath("//h1").extract() return items
之后,您可以在項目中配置蜘蛛程序的執(zhí)行并獲取所需的數(shù)據(jù)。
Selemium
Selenium是一個非常方便的庫,它不僅允許您提取數(shù)據(jù)和抓取簡單的網(wǎng)頁,還允許使用無頭瀏覽器。這使得它適合抓取動態(tài)網(wǎng)頁。因此,我們可以說 Selenium 是 Python 中最好的網(wǎng)頁抓取庫之一。
特征
Selenium 庫最初是為了軟件測試目的而開發(fā)的,這意味著它允許您有效地模仿真實用戶的行為。此功能降低了網(wǎng)頁抓取期間阻塞的風險。此外,Selenium 允許收集數(shù)據(jù)并在網(wǎng)頁上執(zhí)行必要的操作,例如身份驗證或填寫表單。
該庫使用一個網(wǎng)絡驅動程序來提供對這些功能的訪問。您可以選擇任何受支持的網(wǎng)絡驅動程序,但 Firefox 和 Chrome 網(wǎng)絡驅動程序是最受歡迎的。本文將以 Chrome Web 驅動程序為例。
安裝
讓我們從安裝庫開始:
pip install selenium
另外,如前所述,我們需要一個 Web 驅動程序來模擬真實用戶的行為。我們只需要下載它并將其放在任意文件夾中即可使用。稍后我們將在代碼中指定該文件夾的路徑。
您可以從官方網(wǎng)站下載網(wǎng)絡驅動程序。請記住,使用與您所安裝的瀏覽器版本相對應的網(wǎng)絡驅動程序版本非常重要。
使用示例
要使用 Selenium 庫,請創(chuàng)建一個空的 *.py 文件并導入必要的庫:
from selenium import webdriver from selenium.webdriver.common.by import By
之后,讓我們指定網(wǎng)絡驅動程序的路徑并定義我們將使用它:
DRIVER_PATH = 'C:\chromedriver.exe' driver = webdriver.Chrome(executable_path=DRIVER_PATH)
在這里您還可以指定一些參數(shù),例如操作模式。瀏覽器可以在活動模式下運行,您將在其中看到所有腳本的操作?;蛘?,您可以選擇無頭模式,其中瀏覽器窗口被隱藏并且不向用戶顯示。默認情況下會顯示瀏覽器窗口,因此我們無需更改任何內(nèi)容。
現(xiàn)在我們已經(jīng)完成了設置,讓我們進入登陸頁面:
driver.get("https://example.com/")
此時,網(wǎng)絡驅動程序將啟動,您的腳本將自動轉到所需的網(wǎng)頁?,F(xiàn)在我們只需指定要檢索的數(shù)據(jù)、顯示檢索到的數(shù)據(jù)并關閉 Web 驅動程序:
text = driver.find_elements(By.CSS_SELECTOR, "h1") print(text) driver.close()
重要的是不要忘記在腳本執(zhí)行結束時關閉 Web 驅動程序。否則,它將保持打開狀態(tài)直到腳本完成,這可能會嚴重影響電腦的性能。
Pyppeteer
我們將在文章中討論的最后一個庫是Pyppeteer。它是一個名為 Puppeteer 的流行庫的 Python 版本,常用于 NodeJS。Pyppeteer 擁有充滿活力的社區(qū)和詳細的文檔,但不幸的是,其中大部分都集中在 NodeJS 上。因此,如果您決定使用這個庫,請務必記住這一點。
特征
如前所述,這個庫最初是為 NodeJS 開發(fā)的。它還允許您使用無頭瀏覽器,這使得它對于抓取動態(tài)網(wǎng)頁非常有用。
安裝
要安裝該庫,請轉到命令行并輸入命令:
pip install pyppeteer
通常,該庫與asyncio庫一起使用,可以提高腳本性能和執(zhí)行速度。那么,我們也來安裝它:
pip install asyncio
除此之外,我們不需要任何其他東西。
使用示例
讓我們看一個使用 Pyppeteer 庫的簡單示例。我們將創(chuàng)建一個新的 Python 文件并導入必要的庫來執(zhí)行此操作。
import asyncio from pyppeteer import launch
現(xiàn)在,讓我們執(zhí)行與上一個示例相同的操作:導航到頁面,收集數(shù)據(jù),將其顯示在屏幕上,然后關閉瀏覽器。
async def main(): browser = await launch() page = await browser.newPage() await page.goto('https://example.com') text = await page.querySelectorAll("h1.text") print(await text.getProperty("textContent")) await browser.close() asyncio.get_event_loop().run_until_complete(main())
由于這個庫與 Puppeteer 類似,初學者可能會覺得有些挑戰(zhàn)性。
最佳實踐和注意事項
為了使網(wǎng)絡抓取更加高效,需要遵循一些規(guī)則。遵守這些規(guī)則有助于使您的抓取工具更加有效和道德,并減少您從中收集信息的服務的負載。
避免過多的請求
在網(wǎng)絡抓取過程中,避免過多的請求對于防止被阻止并減少目標網(wǎng)站的負載非常重要。這就是為什么建議在最不繁忙的時間(例如晚上)從網(wǎng)站收集數(shù)據(jù)。這有助于降低資源過載并導致其故障的風險。
處理動態(tài)內(nèi)容
在收集動態(tài)數(shù)據(jù)的過程中,有兩種方法。您可以使用支持無頭瀏覽器的庫自行進行抓取?;蛘撸梢允褂镁W(wǎng)絡抓取 API,該 API 將為您處理收集動態(tài)數(shù)據(jù)的任務。
如果您有良好的編程技能和一個小項目,那么使用庫編寫自己的抓取工具可能會更好。但是,如果您是初學者或需要從多個頁面收集數(shù)據(jù),則網(wǎng)絡抓取 API 會更好。在這種情況下,除了收集動態(tài)數(shù)據(jù)之外,API 還將負責代理和解決驗證碼,例如scrape it cloud serp api。
用戶代理輪換
同樣重要的是要考慮到您的機器人在不使用用戶代理的情況下也會引人注目。每個瀏覽器在訪問網(wǎng)頁時都有自己的用戶代理,您可以在開發(fā)者控制臺的 DevTools 選項卡下查看它。建議為每個請求隨機更改用戶代理值。
代理使用和 IP 輪換
正如我們之前討論過的,抓取時存在被阻止的風險。為了降低這種風險,建議使用隱藏真實 IP 地址的代理。
然而,只有一個代理是不夠的。最好有輪換代理,盡管它們的成本較高。
結論和要點
本文討論了用于網(wǎng)頁抓取的庫和以下規(guī)則??偠灾?,我們創(chuàng)建了一個表格并比較了我們涵蓋的所有庫。
下面的比較表重點介紹了用于網(wǎng)頁抓取的 Python 庫的一些關鍵功能:
圖書館 | 解析能力 | 高級功能 | JS渲染 | 使用方便 |
Scrape-It.Cloud | HTML、XML、JavaScript | 自動抓取和分頁 | 是的 | 簡單的 |
Requests 和 BeautifulSoup 組合 | HTML、XML | 簡單集成 | 不 | 簡單的 |
Requests 和 LXML 組合 | HTML、XML | XPath 和 CSS 選擇器支持 | 不 | 緩和 |
Scrapy | HTML、XML | 多個蜘蛛 | 不 | 緩和 |
Selenium | HTML、XML、JavaScript | 動態(tài)內(nèi)容處理 | 是(使用網(wǎng)絡驅動程序) | 緩和 |
Pyppeteer | HTML、JavaScript | 使用無頭 Chrome 或 Chromium 進行瀏覽器自動化 | 是的 | 緩和 |
總的來說,Python 是一種非常有用的數(shù)據(jù)收集編程語言。憑借其廣泛的工具和用戶友好的性質,它通常用于數(shù)據(jù)挖掘和分析。Python 可以輕松完成與從網(wǎng)站提取信息和處理數(shù)據(jù)相關的任務。
文章來源地址http://www.zghlxwxcb.cn/article/310.html文章來源:http://www.zghlxwxcb.cn/article/310.html
到此這篇關于如何使用Python抓取網(wǎng)頁數(shù)據(jù),最好的網(wǎng)頁抓取Python庫的文章就介紹到這了,更多相關內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!