Python 異步爬蟲(aiohttp)高效抓取新聞數據

一、異步爬蟲的優勢

在傳統的同步爬蟲中,爬蟲在發送請求后會阻塞等待服務器響應,直到收到響應后才會繼續執行后續操作。這種模式在面對大量請求時,會導致大量的時間浪費在等待響應上,爬取效率較低。而異步爬蟲則等待可以在服務器響應的同時,繼續執行其他任務,大大提高了爬取效率。

<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">aiohttp</font> 是一個支持異步請求的 Python 庫,它基于 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">asyncio</font> 框架,可以實現高效的異步網絡請求。使用 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">aiohttp</font> 構建異步爬蟲,可以在短時間內發起大量請求,同時處理多個響應,從而實現高效的數據抓取。

二、環境準備

在開始編寫異步爬蟲之前,需要確保已經安裝了 Python 以及 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">aiohttp</font> 庫。如果尚未安裝 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">aiohttp</font>

此外,為了更好地處理 HTML 內容,我們還需要安裝 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">beautifulsoup4</font> 庫,用于解析 HTML 文檔:

三、構建異步爬蟲

1. 初始化異步爬蟲

首先,我們需要創建一個異步函數來初始化爬蟲。在這個函數中,我們將設置異步會話(<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">aiohttp.ClientSession</font>),用于發送網絡請求。

import aiohttp
import asyncio
from bs4 import BeautifulSoupasync def fetch(session, url):"""異步發送 GET 請求:param session: aiohttp.ClientSession 對象:param url: 請求的 URL:return: 響應的 HTML 內容"""async with session.get(url) as response:return await response.text()

2. 解析新聞數據

在獲取到新聞頁面的 HTML 內容后,我們需要使用 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">BeautifulSoup</font> 對其進行解析,提取出新聞的標題、鏈接等關鍵信息。

def parse_news):
(html    """解析 HTML 內容,提取新聞信息:param html: 新聞頁面的 HTML 內容:return: 新聞信息列表"""soup = BeautifulSoup(html, 'html.parser')news_list = []# 假設新聞標題在 <h2> 標簽中,新聞鏈接在 <a> 標簽的 href 屬性中for item in soup.find_all('h2'):title = item.get_text()link = item.find('a')['href']news_list.append({'title': title, 'link': link})return news_list

3. 異步任務調度

為了實現高效的異步爬取,我們需要將多個請求任務調度到事件循環中。通過創建多個異步任務,并將它們添加到事件循環中,可以同時發起多個請求。

async def main():url = 'https://example.com/news'  # 新聞網站的 URLasync with aiohttp.ClientSession() as session:html = await fetch(session, url)news_list = parse_news(html)for news in news_list:print(news)if __name__ == '__main__':asyncio.run(main())

4. 多任務并發

在實際應用中,我們通常需要爬取多個新聞頁面。為了提高效率,可以使用 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">asyncio.gather</font> 方法并發執行多個異步任務。

async def fetch_news(session, url):html = await fetch(session, url)return parse_news(html)async def main():urls = ['https://example.com/news/page1','https://example.com/news/page2','https://example.com/news/page3',# 更多新聞頁面的 URL]async with aiohttp.ClientSession() as session:tasks = [fetch_news(session, url) for url in urls]all_news = await asyncio.gather(*tasks)for news_list in all_news:for news in news_list:print(news)if __name__ == '__main__':asyncio.run(main())

四、優化與注意事項

1. 錯誤處理

在爬取過程中,可能會遇到各種錯誤,如網絡請求超時、服務器返回錯誤狀態碼等。為了保證爬蟲的穩定性,需要對這些錯誤進行處理。

async def fetch(session, url):try:async with session.get(url, timeout=10) as response:  # 設置請求超時時間response.raise_for_status()  # 檢查響應狀態碼return await response.text()except asyncio.TimeoutError:print(f"請求超時:{url}")except aiohttp.ClientResponseError as e:print(f"請求錯誤:{url}, 狀態碼:{e.status}")except Exception as e:print(f"未知錯誤:{url}, 錯誤信息:{e}")

2. 遵守網站規則

在爬取新聞數據時,需要遵守目標網站的 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">robots.txt</font> 文件規定,避免對網站造成過大壓力。同時,合理設置請求間隔,避免被網站封禁。

3. 數據存儲

爬取到的新聞數據可以存儲到本地文件、數據庫或云存儲中,以便后續進行分析和處理。

五、總結

本文介紹了如何使用 Python 的 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">aiohttp</font> 庫構建異步爬蟲,高效抓取新聞數據。通過異步請求和并發任務調度,可以顯著提高爬取效率。在實際應用中,還需要注意錯誤處理、遵守網站規則以及數據存儲等問題。希望本文能夠幫助讀者更好地理解和應用 Python 異步爬蟲技術。

六、完整代碼

import aiohttp
import asyncio
from bs4 import BeautifulSoup# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
proxyUrl = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"async def fetch(session, url):try:async with session.get(url, timeout=10, proxy=proxyUrl) as response:response.raise_for_status()return await response.text()except asyncio.TimeoutError:print(f"請求超時:{url}")except aiohttp.ClientResponseError as e:print(f"請求錯誤:{url}, 狀態碼:{e.status}")except Exception as e:print(f"未知錯誤:{url}, 錯誤信息:{e}")def parse_news(html):soup = BeautifulSoup(html, 'html.parser')news_list = []for item in soup.find_all('h2'):title = item.get_text()link = item.find('a')['href'] if item.find('a') else Noneif title and link:news_list.append({'title': title, 'link': link})return news_listasync def fetch_news(session, url):html = await fetch(session, url)if html:return parse_news(html)return []async def main():urls = ['https://example.com/news/page1','https://example.com/news/page2','https://example.com/news/page3',# 更多新聞頁面的 URL]# 配置代理認證proxy_auth = aiohttp.BasicAuth(proxyUser, proxyPass)conn = aiohttp.TCPConnector(limit=10)  # 限制連接數async with aiohttp.ClientSession(connector=conn) as session:tasks = [fetch_news(session, url) for url in urls]all_news = await asyncio.gather(*tasks)for news_list in all_news:for news in news_list:print(news)if __name__ == '__main__':asyncio.run(main())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913543.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jenkins Pipeline(二)

1.Pipeline 變量 在 Jenkins 管道&#xff08;Pipeline&#xff09;中&#xff0c;變量是一種非常有用的功能&#xff0c;它們可以幫助你在構建過程中存儲和傳遞數據。Jenkins 管道支持多種方式來定義和使用變量&#xff0c;包括環境變量、腳本變量以及全局變量。 1.2 腳本變…

springsecurity02

提前打開Redis1&#xff09;通過內置的用戶名和密碼登錄spring-boot-starter-security.jar2&#xff09;使用自定義用戶名和密碼登錄UserDetailService自定義類實現UserDetailService接口&#xff0c;重寫loadUserByUsername方法class UserDetailServiceImpl implements UserDe…

Apache組件遭大規模攻擊:Tomcat與Camel高危RCE漏洞引發數千次利用嘗試

漏洞態勢分析帕洛阿爾托網絡公司Unit 42團隊最新研究報告顯示&#xff0c;針對Apache Tomcat和Apache Camel關鍵漏洞的網絡攻擊正在全球激增。2025年3月披露的這三個遠程代碼執行&#xff08;RCE, Remote Code Execution&#xff09;漏洞——CVE-2025-24813&#xff08;Tomcat&…

Odoo 中國特色高級工作流審批模塊研發

本文旨在為基于Odoo 18平臺開發一款符合中國用戶習慣的、功能強大的通用工作流審批模塊提供一份全面的技術實現與產品設計方案。該模塊的核心特性包括&#xff1a;為最終用戶設計的圖形化流程設計器、對任意Odoo模型的普適性、復雜的審批節點邏輯&#xff08;如會簽、條件分支、…

unplugin-vue-components 最佳實踐手冊

&#x1f3a8; unplugin-vue-components 最佳實踐手冊 整理不易&#xff0c;收藏、點贊、關注支持下&#xff01;本文詳細介紹了 unplugin-vue-components 插件的作用、配置方法、常用場景及與 unplugin-auto-import 配合使用的實戰技巧&#xff0c;特別適合 Vue 3 Vite 項目。…

? Java 學習日志 01

Java 運行機制&#xff1a; 原文件>編譯器>字節碼&#xff08;class后綴&#xff09;>JVM虛擬機>操作系統既有編譯的過程也有解釋的過程。JVM&#xff1a;Java Virture Machine/執行字節碼的虛擬機&#xff0c;是實現跨平臺——Java核心機制的核心。 JRE&…

基于Flutter的web登錄設計

基于Flutter的web登錄設計 1. 概述 本文檔詳細介紹了基于Flutter Web的智能家居系統登錄模塊的設計與實現。登錄模塊作為系統的入口&#xff0c;不僅提供了用戶身份驗證功能&#xff0c;還包括注冊新用戶的能力&#xff0c;確保系統安全性的同時提供良好的用戶體驗。 本文檔…

Maven繼承:多模塊項目高效管理秘笈

Maven繼承是Maven項目管理中的核心機制&#xff0c;允許子模塊共享并統一管理父模塊的配置信息&#xff08;尤其是依賴關系&#xff09;&#xff0c;其核心原理與Java中的類繼承類似。以下是關鍵要點解析&#xff1a;一、核心概念與作用消除配置冗余 多個子模塊共享相同依賴&am…

關于系統無法找到 arm-linux-gcc 命令,這表明你的環境中尚未安裝 ARM 交叉編譯工具鏈。以下是詳細的解決方案:(DIY機器人工房)

1. 錯誤原因分析 錯誤信息&#xff1a;無法將“arm-linux-gcc”項識別為 cmdlet/函數/程序 這說明 Windows 或 Cygwin 環境中沒有安裝 ARM 交叉編譯工具&#xff0c;或者工具路徑未添加到系統 PATH 中。當前環境&#xff1a; 你之前使用的是 Cygwin 環境下的 x86_64 架構 GCC&…

redis一篇入門

一、Redis 安裝 Linux 系統安裝通過包管理器安裝 (以 Ubuntu 為例): sudo apt update sudo apt install redis-server從源碼編譯安裝: wget https://download.redis.io/redis-stable.tar.gz tar -xzvf redis-stable.tar.gz cd redis-stable make sudo make installWindows 安裝…

【JAVAFX】webview導入本地html并傳入參數

java側String num"234234";URL url1 getClass().getResource("/html/imGroupVar.html");webview.getEngine().load(url1.toExternalForm() "?cc" num);本地html <!DOCTYPE html> <html lang"en"> <head><met…

Playfun即將開啟大型Web3線上活動,打造沉浸式GameFi體驗生態

作為致力于構建健康游戲生態與優質用戶體驗的領先游戲平臺&#xff0c;Playfun始終以“讓游戲更有價值”為理念&#xff0c;持續探索Web3與GameFi融合的新可能。憑借其開放、公平與共創的核心價值觀&#xff0c;Playfun正逐步成為連接玩家、開發者與數字資產生態的重要橋梁。為…

WSL2配置freesurfer

Windows 11 安裝 WSL2 Ubuntu 22.04 并遷移到 E 盤 前言 本文詳細記錄了在 Windows 11 上通過 Microsoft Store 安裝 WSL2 Ubuntu 22.04&#xff0c;并將其從默認的 C 盤遷移到 E 盤的完整過程。適合想要節省 C 盤空間或需要將 WSL2 安裝到其他磁盤的用戶。 環境信息 操作系…

論客郵箱導出發信信息腳本

#!/bin/bash# 檢查是否提供了CSV文件名if [ $# -ne 1 ]; thenecho "用法: $0 <csv文件>"exit 1ficsv_file"$1"# 暫存用戶和midoutput_csv"user_mid.csv"# 抄送人優化extract_value() {[[ "$1" *,* ]] || return # 無逗號直接返…

Windows 本地安裝部署 Apache Druid

在 Windows 本地安裝部署 Apache Druid 可以按照以下步驟進行。由于 Druid 是基于 Java 的應用&#xff0c;需要先準備好 Java 環境&#xff0c;然后下載配置 Druid。 一、環境準備 1. 安裝 Java 確保已安裝 Java 8 或以上版本&#xff08;推薦 Java 11&#xff09;&#xf…

PY32F002A單片機 低成本控制器解決方案,提供多種封裝

PY32F002A 是一款32 位 ARM Cortex-M0 內核的高性價比單片機。PY32F002A單片機提供了多種封裝類型&#xff0c;最大有18個IO&#xff0c;芯片采用32位ARM內核&#xff0c;M0架構&#xff0c;最高工作頻率24MHz。flash 存儲器20KByte,SRAM 3K。最大支持9路12位ADC&#xff0c;5個…

區塊鏈技術在物聯網(IoT)中的核心應用場景

以下是區塊鏈技術在物聯網&#xff08;IoT&#xff09;中的核心應用場景及具體實例&#xff0c;涵蓋技術原理、實施架構和實際價值&#xff1a;一、區塊鏈解決物聯網的四大核心問題痛點區塊鏈方案技術實現設備身份偽造唯一數字身份鏈上注冊非對稱加密生成設備DID&#xff08;去…

PostgreSQL DELETE 語句詳解

PostgreSQL DELETE 語句詳解 在數據庫管理中,刪除數據是日常操作中不可或缺的一環。PostgreSQL 是一款功能強大的開源關系型數據庫管理系統,其 DELETE 語句在數據刪除方面表現出色。本文將詳細解析 PostgreSQL 的 DELETE 語句,包括其語法、使用場景和注意事項。 1. DELETE…

傳統報警難題頻現,安全運行隱患重重

在企業生產運營與安全管理過程中&#xff0c;報警系統作為保障安全運行的重要防線&#xff0c;其作用不言而喻。然而&#xff0c;傳統報警系統在實際應用中卻難題頻現&#xff0c;不僅無法及時、準確地預警潛在風險&#xff0c;還為企業的安全運行埋下了重重隱患。青島國瑞信息…

WPF學習筆記(23)Window、Page與Frame、ViewBox

Window、Page與Frame一、Window1.模態窗口與非模態窗口2.Window類3.示例二、Page1.概述2.Page類三、Frame1.概述2.Frame類3.示例四、ViewBox1. 概述2. 詳解3. 示例總結一、Window 1.模態窗口與非模態窗口 2.Window類 屬性說 明Title獲取或設置窗口的標題。lcon設獲取或設置窗…