身為暢銷書作家,我邀請您在亞馬遜上探索我的書。不要忘記在 Medium 上關注我並表示您的支持。謝謝你!您的支持意味著全世界!
網頁抓取已成為數位時代資料擷取與分析的重要工具。隨著線上資訊量的不斷增長,對高效且可擴展的抓取技術的需求變得至關重要。 Python 擁有豐富的函式庫和框架生態系統,為非同步網頁抓取提供了強大的解決方案。在本文中,我將探討六種利用非同步編程來提高網頁抓取操作的速度和效率的高階技術。
非同步程式設計允許並發執行多個任務,這使其成為我們經常需要同時從多個來源獲取資料的網路抓取的理想選擇。透過利用非同步技術,我們可以大幅減少從網路收集大量資料所需的時間。
讓我們從 aiohttp 開始,它是一個用於發出非同步 HTTP 請求的強大函式庫。 aiohttp 提供了一種並發發送多個請求的有效方法,這對於大規模的網頁抓取操作至關重要。以下是如何使用 aiohttp 同時取得多個網頁的範例:
import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): urls = ['https://example.com', 'https://example.org', 'https://example.net'] async with aiohttp.ClientSession() as session: tasks = [fetch(session, url) for url in urls] responses = await asyncio.gather(*tasks) for response in responses: print(len(response)) asyncio.run(main())
在此範例中,我們建立一個非同步函數 fetch,它將會話和 URL 作為參數。 main 函數使用列表理解建立任務列表,然後使用 asyncio.gather 同時執行所有任務。這種方法讓我們可以並行取得多個網頁,從而顯著減少操作所需的總時間。
接下來,讓我們探索如何將 BeautifulSoup 與我們的非同步抓取設定整合。 BeautifulSoup 是一個受歡迎的用於解析 HTML 和 XML 文件的函式庫。雖然 BeautifulSoup 本身不是非同步的,但我們可以將它與 aiohttp 結合使用來解析我們非同步取得的 HTML 內容:
import aiohttp import asyncio from bs4 import BeautifulSoup async def fetch_and_parse(session, url): async with session.get(url) as response: html = await response.text() soup = BeautifulSoup(html, 'html.parser') return soup.title.string if soup.title else "No title found" async def main(): urls = ['https://example.com', 'https://example.org', 'https://example.net'] async with aiohttp.ClientSession() as session: tasks = [fetch_and_parse(session, url) for url in urls] titles = await asyncio.gather(*tasks) for url, title in zip(urls, titles): print(f"{url}: {title}") asyncio.run(main())
在這個範例中,我們修改了 fetch 函數以包含使用 BeautifulSoup 進行解析。 fetch_and_parse 函數現在會傳回每個網頁的標題,演示了我們如何從 HTML 內容中非同步提取特定資訊。
在處理大量抓取的資料時,通常需要將資訊儲存到檔案中。 aiofiles 是一個為檔案 I/O 操作提供非同步介面的函式庫。以下是我們如何使用 aiofiles 非同步保存抓取的資料:
import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): urls = ['https://example.com', 'https://example.org', 'https://example.net'] async with aiohttp.ClientSession() as session: tasks = [fetch(session, url) for url in urls] responses = await asyncio.gather(*tasks) for response in responses: print(len(response)) asyncio.run(main())
此腳本取得 HTML 內容、提取標題並將其儲存到文件中,所有操作都是非同步進行的。在處理需要保存到磁碟的大型資料集時,這種方法特別有用。
對於更複雜的網頁抓取任務,Scrapy 框架提供了強大且可擴展的解決方案。 Scrapy 以非同步編程為核心構建,使其成為大規模網路爬行和抓取專案的絕佳選擇。這是 Scrapy 蜘蛛的一個簡單範例:
import aiohttp import asyncio from bs4 import BeautifulSoup async def fetch_and_parse(session, url): async with session.get(url) as response: html = await response.text() soup = BeautifulSoup(html, 'html.parser') return soup.title.string if soup.title else "No title found" async def main(): urls = ['https://example.com', 'https://example.org', 'https://example.net'] async with aiohttp.ClientSession() as session: tasks = [fetch_and_parse(session, url) for url in urls] titles = await asyncio.gather(*tasks) for url, title in zip(urls, titles): print(f"{url}: {title}") asyncio.run(main())
要執行此蜘蛛,您通常會使用 Scrapy 命令列工具。 Scrapy 在內部處理 Web 要求的非同步特性,讓您可以專注於定義解析邏輯。
大規模執行網頁抓取時,實施速率限制以避免目標伺服器不堪重負並尊重其 robots.txt 檔案至關重要。這是我們如何在非同步抓取器中實現速率限制的範例:
import aiohttp import asyncio import aiofiles from bs4 import BeautifulSoup async def fetch_and_save(session, url, filename): async with session.get(url) as response: html = await response.text() soup = BeautifulSoup(html, 'html.parser') title = soup.title.string if soup.title else "No title found" async with aiofiles.open(filename, 'w') as f: await f.write(f"{url}: {title}\n") return title async def main(): urls = ['https://example.com', 'https://example.org', 'https://example.net'] async with aiohttp.ClientSession() as session: tasks = [fetch_and_save(session, url, f"title_{i}.txt") for i, url in enumerate(urls)] titles = await asyncio.gather(*tasks) for url, title in zip(urls, titles): print(f"Saved: {url} - {title}") asyncio.run(main())
在此範例中,我們使用 aiolimiter 函式庫建立一個每秒允許一個請求的速率限制器。這可以確保我們的抓取工具不會太快發送請求,這可能會導致被目標網站封鎖。
錯誤處理是強大的網頁抓取的另一個關鍵方面。在處理多個非同步請求時,重要的是要妥善處理異常,以防止單一失敗的請求停止整個抓取過程。以下是我們如何實現錯誤處理和重試的範例:
import scrapy class TitleSpider(scrapy.Spider): name = 'title_spider' start_urls = ['https://example.com', 'https://example.org', 'https://example.net'] def parse(self, response): yield { 'url': response.url, 'title': response.css('title::text').get() }
此腳本實現了具有指數退避的重試機制,有助於處理臨時網路問題或伺服器錯誤。它還為每個請求設定超時,以防止回應緩慢。
對於非常大規模的抓取操作,您可能需要將工作負載分配到多台機器上。雖然分散式抓取的具體細節超出了本文的範圍,但您可以使用 Celery 和 Redis 或 RabbitMQ 等工具在工作電腦叢集中分發抓取任務。
當我們結束 Python 非同步網路抓取技術的探索時,強調道德抓取實踐的重要性非常重要。請務必檢查並尊重您正在抓取的網站的 robots.txt 文件,並在進行大規模抓取操作時考慮聯繫網站所有者以獲得許可。
非同步網頁抓取比傳統同步方法提供了顯著的效能改進,特別是在處理大量網頁或 API 時。透過利用我們討論過的技術——使用aiohttp 進行並發請求、集成BeautifulSoup 進行解析、利用aiofiles 進行非阻塞文件操作、使用Scrapy 進行複雜的抓取任務、實施速率限制以及穩健地處理錯誤——您可以構建強大且可靠的解決方案。高效率的網頁抓取解決方案。
隨著網路的不斷發展和發展,可用於網路抓取的技術和工具也會不斷發展。隨時了解最新的庫和最佳實踐將確保您的網頁抓取專案保持高效、可擴展並尊重您與之互動的網站。
101 Books是一家由人工智慧驅動的出版公司,由作家Aarav Joshi共同創立。透過利用先進的人工智慧技術,我們將出版成本保持在極低的水平——一些書籍的價格低至 4 美元——讓每個人都能獲得高品質的知識。
查看我們的書Golang Clean Code,亞馬遜上有售。
請繼續關注更新和令人興奮的消息。購買書籍時,搜尋 Aarav Joshi 以尋找更多我們的書籍。使用提供的連結即可享受特別折扣!
一定要看看我們的創作:
投資者中心 | 投資者中央西班牙語 | 投資者中德意志 | 智能生活 | 時代與迴響 | 令人費解的謎團 | 印度教 | 菁英發展 | JS學校
科技無尾熊洞察 | 時代與迴響世界 | 投資人中央媒體 | 令人費解的謎團 | | 令人費解的謎團 | >科學與時代媒介 |
現代印度教以上是Python 中先進的非同步網頁抓取技術可提高速度和效率的詳細內容。更多資訊請關注PHP中文網其他相關文章!