搜尋
首頁後端開發Python教學Python 中先進的非同步網頁抓取技術可提高速度和效率

dvanced Asynchronous Web Scraping Techniques in Python for Speed and Efficiency

身為暢銷書作家,我邀請您在亞馬遜上探索我的書。不要忘記在 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 本書

101 Books是一家由人工智慧驅動的出版公司,由作家Aarav Joshi共同創立。透過利用先進的人工智慧技術,我們將出版成本保持在極低的水平——一些書籍的價格低至 4 美元——讓每個人都能獲得高品質的知識。

查看我們的書Golang Clean Code,亞馬​​遜上有售。

請繼續關注更新和令人興奮的消息。購買書籍時,搜尋 Aarav Joshi 以尋找更多我們的書籍。使用提供的連結即可享受特別折扣

我們的創作

一定要看看我們的創作:

投資者中心 | 投資者中央西班牙語 | 投資者中德意志 | 智能生活 | 時代與迴響 | 令人費解的謎團 | 印度教 | 菁英發展 | JS學校


我們在媒體上

科技無尾熊洞察 | 時代與迴響世界 | 投資人中央媒體 | 令人費解的謎團 | | 令人費解的謎團 | >科學與時代媒介 |

現代印度教

以上是Python 中先進的非同步網頁抓取技術可提高速度和效率的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python腳本可能無法在UNIX上執行的一些常見原因是什麼?Python腳本可能無法在UNIX上執行的一些常見原因是什麼?Apr 28, 2025 am 12:18 AM

Python腳本在Unix系統上無法運行的原因包括:1)權限不足,使用chmod xyour_script.py賦予執行權限;2)Shebang行錯誤或缺失,應使用#!/usr/bin/envpython;3)環境變量設置不當,可打印os.environ調試;4)使用錯誤的Python版本,可在Shebang行或命令行指定版本;5)依賴問題,使用虛擬環境隔離依賴;6)語法錯誤,使用python-mpy_compileyour_script.py檢測。

舉一個場景的示例,其中使用Python數組比使用列表更合適。舉一個場景的示例,其中使用Python數組比使用列表更合適。Apr 28, 2025 am 12:15 AM

使用Python數組比列表更適合處理大量數值數據。 1)數組更節省內存,2)數組對數值運算更快,3)數組強制類型一致性,4)數組與C語言數組兼容,但在靈活性和便捷性上不如列表。

在Python中使用列表與數組的性能含義是什麼?在Python中使用列表與數組的性能含義是什麼?Apr 28, 2025 am 12:10 AM

列表列表更好的forflexibility andmixDatatatypes,何時出色的Sumerical Computitation sand larged數據集。 1)不可使用的列表xbilese xibility xibility xibility xibility xibility xibility xibility xibility xibility xibility xibles and comply offrequent elementChanges.2)

Numpy如何處理大型數組的內存管理?Numpy如何處理大型數組的內存管理?Apr 28, 2025 am 12:07 AM

numpymanagesmemoryforlargearraysefefticefticefipedlyuseviews,副本和內存模擬文件.1)viewsAllowSinglicingWithOutCopying,直接modifytheoriginalArray.2)copiesCanbecopy canbecreatedwitheDedwithTheceDwithThecevithThece()methodervingdata.3)metservingdata.3)memore memore-mappingfileShessandAstaStaStstbassbassbassbassbassbassbassbassbassbassbb

哪個需要導入模塊:列表或數組?哪個需要導入模塊:列表或數組?Apr 28, 2025 am 12:06 AM

Listsinpythondonotrequireimportingamodule,helilearraysfomthearraymoduledoneedanimport.1)列表列表,列表,多功能和canholdMixedDatatatepes.2)arraysaremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremeremeremeremericdatabuteffeftlessdatabutlessdatabutlessfiblesible suriplyElsilesteletselementEltecteSemeTemeSemeSemeSemeTypysemeTypysemeTysemeTypysemeTypepe。

可以在Python數組中存儲哪些數據類型?可以在Python數組中存儲哪些數據類型?Apr 27, 2025 am 12:11 AM

pythonlistscanStoryDatatepe,ArrayModulearRaysStoreOneType,and numpyArraySareSareAraysareSareAraysareSareComputations.1)列出sareversArversAtileButlessMemory-Felide.2)arraymoduleareareMogeMogeNareSaremogeNormogeNoreSoustAta.3)

如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?Apr 27, 2025 am 12:10 AM

WhenyouattempttostoreavalueofthewrongdatatypeinaPythonarray,you'llencounteraTypeError.Thisisduetothearraymodule'sstricttypeenforcement,whichrequiresallelementstobeofthesametypeasspecifiedbythetypecode.Forperformancereasons,arraysaremoreefficientthanl

Python標準庫的哪一部分是:列表或數組?Python標準庫的哪一部分是:列表或數組?Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器