優化 Python 爬蟲性能:異步爬取新浪財經大數據

一、同步爬蟲的瓶頸

傳統的同步爬蟲(如requests+BeautifulSoup)在請求網頁時,必須等待服務器返回響應后才能繼續下一個請求。這種阻塞式I/O操作在面對大量數據時存在以下問題:

  1. 速度慢:每個請求必須串行執行,無法充分利用網絡帶寬。
  2. 易被封禁:高頻請求可能觸發IP限制或驗證碼。
  3. 資源浪費:CPU在等待I/O時處于空閑狀態。

解決方案:異步爬蟲(Asynchronous Crawling)
Python的asyncio+aiohttp庫可以實現非阻塞I/O,允許同時發起多個請求,大幅提升爬取效率。

二、異步爬蟲技術選型

技術方案適用場景優勢
aiohttpHTTP請求異步HTTP客戶端,支持高并發
asyncio事件循環Python原生異步I/O框架
aiofiles異步文件存儲避免文件寫入阻塞主線程
uvloop加速事件循環替換asyncio
默認循環,性能提升2-4倍

三、實戰:異步爬取新浪財經股票數據

目標

  • 爬取新浪財經A股股票實時行情(代碼、名稱、價格、漲跌幅等)。
  • 使用aiohttp實現高并發請求。
  • 存儲至CSV文件,避免數據丟失。

步驟1:分析數據接口

新浪財經的股票數據通常通過API返回,我們可以通過瀏覽器開發者工具(F12)抓包分析:

  • 示例接口:https://finance.sina.com.cn/realstock/company/sh600000/nc.shtml
  • 數據格式:部分數據直接渲染在HTML中,部分通過Ajax加載(如分時數據)。

步驟2:安裝依賴庫

步驟3:編寫異步爬蟲代碼

import asyncio
import aiohttp
import aiofiles
from bs4 import BeautifulSoup
import csv
import time# 替換為新浪財經股票列表API(示例)
STOCK_LIST_API = "https://finance.sina.com.cn/stock/sl/stock_list.html"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}async def fetch(session, url):"""異步獲取網頁內容"""async with session.get(url, headers=HEADERS) as response:return await response.text()async def parse_stock_data(html):"""解析股票數據(示例:僅提取名稱和價格)"""soup = BeautifulSoup(html, "html.parser")stock_name = soup.select_one(".stock-name").text.strip() if soup.select_one(".stock-name") else "N/A"stock_price = soup.select_one(".price").text.strip() if soup.select_one(".price") else "N/A"return {"name": stock_name, "price": stock_price}async def save_to_csv(data, filename="stocks.csv"):"""異步寫入CSV"""async with aiofiles.open(filename, mode="a", encoding="utf-8", newline="") as f:writer = csv.writer(f)await writer.writerow([data["name"], data["price"]])async def crawl_stock(stock_code, session):"""爬取單只股票數據"""url = f"https://finance.sina.com.cn/realstock/company/{stock_code}/nc.shtml"try:html = await fetch(session, url)data = await parse_stock_data(html)await save_to_csv(data)print(f"爬取成功:{stock_code} - {data['name']}")except Exception as e:print(f"爬取失敗:{stock_code} - {str(e)}")async def main():"""主協程:并發爬取多個股票"""stock_codes = ["sh600000", "sh601318", "sz000001"]  # 示例股票代碼(可擴展)# 使用uvloop加速(僅限Unix系統)try:import uvloopasyncio.set_event_loop_policy(uvloop.EventLoopPolicy())except ImportError:pass# 創建aiohttp會話async with aiohttp.ClientSession() as session:tasks = [crawl_stock(code, session) for code in stock_codes]await asyncio.gather(*tasks)if __name__ == "__main__":start_time = time.time()asyncio.run(main())print(f"爬取完成,耗時:{time.time() - start_time:.2f}秒")

四、性能優化策略

1. 控制并發量

新浪財經可能限制高頻請求

2. 使用代理IP

避免IP被封:

3. 隨機User-Agent

減少被識別為爬蟲的概率:

4. 數據存儲優化

  • 異步數據庫寫入:如aiomysqlasyncpg
  • 批量寫入:減少I/O次數。
import asyncio
import aiohttp
from bs4 import BeautifulSoup
import pandas as pd
from fake_useragent import UserAgent
import aiomysql# 使用 Semaphore 限制并發數
semaphore = asyncio.Semaphore(10)  # 最大并發 10# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 構造代理 URL
PROXY = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"# 隨機 User-Agent
ua = UserAgent()# 數據庫配置
DB_CONFIG = {'host': 'localhost','port': 3306,'   user': 'your_username','password': 'your_password','db': 'your_database','charset': 'utf8mb4'
}# 數據存儲優化:異步數據庫寫入
async def save_to_db(data):conn = await aiomysql.connect(**DB_CONFIG)async with conn.cursor() as cur:await cur.executemany("INSERT INTO finance_data (column1, column2, column3) VALUES (%s, %s, %s)", data)await conn.commit()conn.close()# 爬取單個股票數據
async def crawl_stock(stock_code, session):async with semaphore:url = f"https://finance.sina.com.cn/stock/{stock_code}.html"HEADERS = {"User-Agent": ua.random}async with session.get(url, headers=HEADERS, proxy=PROXY) as response:html = await response.text()data = parse(html)return data# 解析網頁內容
def parse(html):soup = BeautifulSoup(html, 'html.parser')# 假設數據在特定的表格中table = soup.find('table', {'class': 'example'})data = []for row in table.find_all('tr'):cols = row.find_all('td')cols = [ele.text.strip() for ele in cols]data.append([ele for ele in cols if ele])return data# 主函數
async def main(stock_codes):async with aiohttp.ClientSession() as session:tasks = [crawl_stock(stock_code, session) for stock_code in stock_codes]all_data = await asyncio.gather(*tasks)# 扁平化數據flat_data = [item for sublist in all_data for item in sublist]# 異步批量寫入數據庫await save_to_db(flat_data)# 示例股票代碼列表
stock_codes = ['000001','000002',# 更多股票代碼
]# 運行爬蟲
asyncio.run(main(stock_codes))

五、對比同步與異步爬蟲性能

指標同步爬蟲(requests)異步爬蟲(aiohttp)
100次請求耗時~20秒~3秒
CPU占用低(大量時間在等待)高(并發處理)
反爬風險高(易觸發封禁)較低(可控并發)

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

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

相關文章

Visual Studio Code (VSCode) Python 開發環境配置完整指南

一、安裝準備 1. 安裝 VSCode 官網下載: Visual Studio Code - Code Editing. Redefined安裝時建議勾選: "添加到PATH" (方便終端調用)"注冊為受支持的文件類型編輯器"2. 安裝 Python 官網下載: Download Python | Python.org安裝時勾選: "Add Pytho…

智能數據標簽引擎:企業級分類分級與動態管控實踐

在數字化轉型浪潮中,企業數據量呈爆發式增長,數據的多樣性和復雜性也不斷提升。如何對海量數據進行高效分類分級,并實施動態管控,成為企業釋放數據價值、保障數據安全的關鍵挑戰。智能數據標簽引擎應運而生,它通過引入…

Redis(1)——RDB持久化

在追求極致性能的 Redis 世界里,數據安全是永恒的主題。作為內存數據庫,Redis 重啟或宕機意味著數據丟失的風險。RDB (Redis Database) 持久化,又稱快照持久化,是 Redis 提供的最經典、最高效的數據落地方案之一。它通過生成某個時…

深度剖析無感刷新Token:領碼SPARK平臺賦能微服務認證的智能實踐

摘要 在現代微服務架構與數字化轉型大潮中,用戶身份認證的連續性與安全性尤為關鍵。無感刷新Token技術通過智能的雙Token機制,確保用戶訪問憑證在不打擾用戶的前提下自動續期,避免因Token過期導致的頻繁登錄中斷。本文結合領碼SPARK融合平臺的…

聲網對話式 AI:開啟我的編程進階之旅

轉行學習編程時,復雜的代碼邏輯常讓我無從下手,直到遇見聲網對話式AI。它像一位耐心的導師,不僅用通俗易懂的語言幫我理解Python循環嵌套等難點,還提供實際代碼示例。當我開發學生成績管理系統時,它甚至直接生成框架代…

精準護理,點亮進行性核上性麻痹患者生活希望

進行性核上性麻痹(PSP)是一種罕見的神經系統變性疾病,主要表現為姿勢平衡障礙、眼球運動障礙、吞咽困難等癥狀。科學的健康護理能有效延緩病情進展,提升患者生活質量,可從以下方面著手。 ?在飲食護理上,因…

記錄一次 Oracle 表空間不足問題的解決過程

記錄一次 Oracle 表空間不足問題的解決過程 6月14日,某醫院信息科用戶反映無法提交門診病例,門診處方也無法開立。其他功能是正常的。考慮可能是與門診病例有關的表空間用完了。 Oracle表空間的數據文件默認是可以自動增長的,但是單個文件的…

2024 年 11 月公鏈行業研報:比特幣創歷史新高引領市場全面上漲

比特幣屢創歷史新高,主導市場全面上漲,同時 Layer 1 表現強勁,而 Layer 2 格局持續演變。 2024 年 11 月公鏈研報 作者:Stella L (stellafootprint.network) 數據來源:Footprint Analytics 公鏈研究頁面 2024 年 11…

MAX4622ESE+T雙5Ω模擬開關在低失真音頻路由中的實測:0.5Ω匹配度如何改善THD性能

一、產品概述:精密信號切換的硬件基石 MAX4622ESET是一款雙通道SPDT(單刀雙擲)模擬開關,采用5Ω超低導通電阻設計(典型值3Ω),專為高精度信號路由場景優化。其核心價值在于通過單片CMOS架構實現…

高并發秒殺系統(Redis分布式鎖優化與庫存防超賣實戰)

本文通過日活百萬級的電商秒殺案例,深度剖析分庫分表路由算法在高并發場景下的落地實踐。結合Redis分布式鎖的優化方案解決庫存超賣問題,包含完整架構設計、代碼實現及壓測數據對比。全文包含12個核心代碼片段和8類技術圖表,來自線上生產環境…

從loader和plugin開始了解webpack

目錄 一、webpack中loader和plugin的區別1. Loader(每個 Loader 是一個函數或對象)2.plugin(每個 Plugin 是一個實例)3.自定義loader和plugin 二、Babel的功能三、Plugin中的compiler和compilation對象1. compiler對象2. compilat…

36-Oracle Statistics Gathering(統計信息收集)

小伙伴們,有沒有因為統計信息不準,導致了業務卡頓,各種狀況頻出,這幾天在實踐和實操的過程中,時不時就需要進行統計信息的收集。同時統計信息收集的動作也是OCM必考內容。 數據庫中的數據是地圖,統計信息是…

Linux驅動程序(PWM接口)與超聲波測距

一、利用阿里云服務器實現樹莓派外網訪問(SSH 反向代理) 1. 樹莓派端配置 步驟 1:安裝 SSH 服務(若未安裝) sudo apt-get install openssh-server 步驟 2:創建反向代理連接 -p 22:指定阿里…

Web攻防-XSS跨站文件類型功能邏輯SVGPDFSWFHTMLXMLPMessageLocalStorage

知識點: 1、Web攻防-XSS跨站-文件類型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能邏輯-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件類型觸發XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

強大模型通過自我和解進步——Unsupervised Elicitation of Language Models——論文閱讀筆記

本周關注的工作是:Unsupervised Elicitation of Language Models 這篇文章通篇體現了這樣一件事——香蕉皮大需要香蕉大! 一句話總結 首先注意:這個工作不是面向對齊的,而是寫【如何準備】對齊任務的Reward Model需要的數據集的…

Qt—(Qt初識,槽,信號,事件)

一 Qt初識 暫時不寫了 我的理解是類似于c#,是一個組件庫,不局限是一個組件框架。 二 Qt Core Qt Core 是 Qt 框架的基礎模塊,提供非 GUI 的核心功能: 核心類:QObject(信號槽機制)、QEvent&…

深度學習——基于卷積神經網絡實現食物圖像分類【2】(數據增強)

文章目錄 引言一、項目概述二、環境準備三、數據預處理3.1 數據增強與標準化3.2 數據集準備 四、自定義數據集類五、構建CNN模型六、訓練與評估6.1 訓練函數6.2 評估函數6.3 訓練流程 七、關鍵技術與優化八、常見問題與解決九、完整代碼十、總結 引言 本文將詳細介紹如何使用P…

詳細說說分布式Session的幾種實現方式

1. 基于客戶端存儲(Cookie-Based) 原理:將會話數據直接存儲在客戶端 Cookie 中 實現: // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama訪問模型,為什么會出現模型胡亂輸出,然后過一會兒再訪問,就又變成正常的

例子:大模型推理遇到內存不足 1. 場景還原 你在Mac上用Ollama運行如下代碼(以Python為例,假設Ollama有API接口): import requestsprompt "請寫一首關于夏天的詩。" response requests.post("http:…

簡說 Linux 用戶組

Linux 用戶組 的核心概念、用途和管理方法,盡量簡明易懂。 🌟 什么是 Linux 用戶組? 在 Linux 系統中: 👉 用戶組(group) 是一組用戶的集合,用來方便地管理權限。 👉 用…