多線程爬蟲優化:快速爬取并寫入CSV

在數據驅動的時代,爬蟲技術已成為獲取網絡數據的重要手段。然而,隨著數據量的不斷增加,單線程爬蟲的效率逐漸難以滿足需求。多線程爬蟲通過并行處理,能夠顯著提升爬取速度,同時將數據快速寫入CSV文件,為后續的數據分析和應用提供支持。本文將詳細介紹多線程爬蟲的優化策略,并通過一個完整的實戰案例展示如何實現高效的數據爬取和存儲。

一、多線程爬蟲的優勢

多線程爬蟲通過同時運行多個線程,可以充分利用計算機的多核處理器資源,顯著提升爬取效率。以下是多線程爬蟲的主要優勢:

  1. 提高爬取速度:多線程爬蟲可以同時請求多個網頁,大大縮短了爬取時間。
  2. 優化資源利用:在等待網絡響應時,其他線程可以繼續工作,避免了單線程爬蟲的等待時間浪費。
  3. 增強容錯能力:即使某個線程因網絡問題或目標網站的限制而失敗,其他線程仍可以繼續運行,確保爬取任務的穩定性。

二、技術棧介紹

在本項目中,我們將使用以下技術棧:

  • Python:一種廣泛使用的高級編程語言,具有豐富的庫和框架,適合進行爬蟲開發。
  • Requests:一個Python庫,用于發送HTTP請求,方便我們從網頁獲取數據。
  • BeautifulSoup:一個用于解析HTML和XML文檔的Python庫,可以幫助我們提取網頁中的數據。
  • Pandas:一個強大的數據分析庫,支持數據清洗、轉換和存儲。
  • Threading:Python內置的多線程庫,用于實現多線程爬蟲。
  • CSV:一種簡單的文本文件格式,用于存儲表格數據,便于后續的數據分析。

三、實戰案例:多線程爬蟲實現

1. 確定目標網站

假設我們要爬取一個電商平臺的商品信息,包括商品名稱、價格、銷量和評價。目標網站的URL為 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">https://example.com/products</font>,商品信息分布在多個頁面中。

2. 分析網頁結構

在開始編寫爬蟲之前,我們需要先分析目標網頁的結構。通過瀏覽器的開發者工具,我們可以查看網頁的HTML代碼,找到商品信息所在的標簽和類名。

3. 編寫多線程爬蟲代碼

以下是多線程爬蟲的實現代碼:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import threading
from queue import Queue
import time# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 構造代理
proxies = {"http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}","https": f"https://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
}# 全局變量
url_queue = Queue()  # 存儲待爬取的URL
data_queue = Queue()  # 存儲爬取到的數據
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}# 爬取單個頁面
def crawl_page(url):try:response = requests.get(url, headers=headers, proxies=proxies, timeout=10)response.raise_for_status()  # 檢查請求是否成功soup = BeautifulSoup(response.text, "html.parser")products = soup.find_all("div", class_="product-item")for product in products:name = product.find("h2", class_="product-name").text.strip()price = product.find("span", class_="product-price").text.strip()sales = product.find("span", class_="product-sales").text.strip()reviews = product.find("span", class_="product-reviews").text.strip()data_queue.put({"商品名稱": name,"價格": price,"銷量": sales,"評價": reviews})except requests.exceptions.RequestException as e:print(f"請求失敗:{url}, 錯誤:{e}")print("請檢查網頁鏈接的合法性,或者稍后重試。")# 爬蟲線程
def worker():while not url_queue.empty():url = url_queue.get()crawl_page(url)url_queue.task_done()# 主函數
def main():# 假設目標網站有多個頁面base_url = "https://example.com/products?page="for page in range(1, 11):  # 爬取前10頁url_queue.put(base_url + str(page))# 創建多個線程threads = []for _ in range(5):  # 啟動5個線程t = threading.Thread(target=worker)t.start()threads.append(t)# 等待所有線程完成for t in threads:t.join()# 將數據存儲為CSV文件data_list = []while not data_queue.empty():data_list.append(data_queue.get())df = pd.DataFrame(data_list)df.to_csv("products.csv", index=False, encoding="utf-8-sig")print("數據已成功保存到CSV文件中。")if __name__ == "__main__":start_time = time.time()main()end_time = time.time()print(f"總耗時:{end_time - start_time:.2f}秒")

四、代碼解析

1. 線程安全隊列

在多線程環境中,我們需要確保數據的線程安全性。<font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">queue.Queue</font> 是一個線程安全的隊列,用于存儲待爬取的URL和爬取到的數據。

2. 爬蟲線程

我們定義了一個 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">worker</font> 函數,每個線程都會調用該函數。線程會從 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">url_queue</font> 中獲取URL,爬取數據后將結果存入 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">data_queue</font>

3. 數據存儲

在所有線程完成后,我們將 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">data_queue</font> 中的數據轉換為Pandas的DataFrame,并保存為CSV文件。

五、性能優化

1. 線程數量

線程數量的選擇需要根據目標網站的響應速度和服務器性能進行調整。過多的線程可能會導致目標網站拒絕服務,而過少的線程則無法充分利用多核處理器的優勢。在本案例中,我們選擇了5個線程。

2. 防止被封禁

為了避免因頻繁請求而被目標網站封禁IP,可以在代碼中加入適當的延時。例如,在每次請求之間添加 <font style="color:rgba(0, 0, 0, 0.9);background-color:rgba(0, 0, 0, 0.03);">time.sleep(1)</font>

3. 錯誤處理

在爬取過程中,可能會遇到網絡請求失敗、目標網站結構變化等問題。通過捕獲異常并記錄錯誤信息,可以確保爬蟲的穩定性。

六、數據分析

完成數據爬取和存儲后,我們可以使用Pandas進行數據分析。以下是簡單的數據分析代碼:

import pandas as pd# 加載CSV文件
df = pd.read_csv("products.csv")# 查看數據的前幾行
print(df.head())# 數據清洗
df.drop_duplicates(inplace=True)  # 刪除重復數據
df.dropna(inplace=True)  # 刪除缺失值# 數據分析
print("平均價格:", df["價格"].mean())
print("最高銷量商品:", df.loc[df["銷量"].idxmax()]["商品名稱"])
print("評價分布:", df["評價"].value_counts())# 數據可視化
import matplotlib.pyplot as pltdf["價格"].plot(kind="hist", bins=20, title="價格分布")
plt.xlabel("價格")
plt.ylabel("商品數量")
plt.show()

七、總結

通過多線程爬蟲技術,我們能夠顯著提升數據爬取的效率,并將數據快速存儲為CSV文件。在實際應用中,合理選擇線程數量、優化錯誤處理和防止被封禁是確保爬蟲穩定運行的關鍵。此外,通過Pandas進行數據分析和可視化,可以進一步挖掘數據的價值,為商業決策提供支持。

八、拓展應用

1. 動態數據爬取

對于需要登錄或動態加載的網頁,可以使用Selenium等工具模擬瀏覽器操作。

2. 分布式爬蟲

在面對大規模數據爬取任務時,可以使用分布式爬蟲框架(如Scrapy)來進一步提升效率。

3. 數據庫存儲

對于大規模數據,可以將數據存儲到數據庫(如MySQL、MongoDB)中,以便進行更復雜的數據查詢和分析。

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

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

相關文章

Deepseek+墨刀,1min快速生成流程圖!

想要了解快速了解產品邏輯&#xff0c;可以用ds墨刀快速生成流程圖~ deepseek鏈接&#xff1a;https://www.deepseek.com/ 墨刀在線&#xff1a;https://modao.cc/brand 如何操作呢&#xff1f; 1.打開deepseek&#xff0c;輸入以下咒語&#xff0c;讓AI用Mermaid語法繪制流…

LangChain4j流式調用、消息注解與會話記憶

我們先用AiService工具類把調用ai大語言模型的代碼寫出來。因為AiService工具類中整合有記憶、Rag知識庫、tools工具等&#xff0c;我們直接配置調用即可。 我用的是qwen-plus模型。 引入依賴&#xff1a; <dependency><groupId>dev.langchain4j</groupId>…

NtfsWriteLog函數分析之OpenAttributeTableDump

第一部分&#xff1a; NtfsWriteLog( IrpContext, Vcb->MftScb, //注意&#xff1a;Vcb->MftScb NULL, OpenAttributeTableDump, …

DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS

系列文章目錄 DCM4CHEE ARCHIVE LIGHT 源代碼解析(1)-前言DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS文章目錄 系列文章目錄概述一、背景資料1、RESTful服務2、傳輸存儲規范3、服務連接策略4、響應消息狀態二、業務分析1、對象關系2、項目結構3、業務流程三、代碼解析1、w…

Java中間件簡介:構建現代軟件的“隱形橋梁”

Java中間件簡介&#xff1a;構建現代軟件的“隱形橋梁” 在軟件開發的世界里&#xff0c;中間件&#xff08;Middleware&#xff09;是一個既熟悉又神秘的存在。它不像數據庫那樣直接存儲數據&#xff0c;也不像前端那樣與用戶交互&#xff0c;但它卻是現代軟件架構中不可或缺…

Scale AI 的王曉磊帶著對整個 AI 行業動態的深入了解加入 Meta

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

冒煙測試概念速解

最近很多人對冒煙測試這個概念發出疑問。那么我就來簡單解釋一下什么是冒煙測試&#xff0c;以及冒煙測試的由來。 1.冒煙測試的由來 硬件測試的起源&#xff1a;從 “冒煙” 到基礎功能驗證 在電子工程領域&#xff0c;早期工程師在調試新硬件&#xff08;如電路板、芯片&am…

嵌入式學習筆記——day36-多路IO復用

一、基本概念 &#xff08;服務器多客戶端模型&#xff09; 定義&#xff1a; 單線程或單進程同時監測若干個文件描述符是否可以執行IO操作的能力 作用&#xff1a; 應用程序通常需要處理來自多條事件流中的事件&#xff0c;比如我現在用的電腦&#xff0c;需要同時處理鍵盤鼠…

微服務數據一致性技術解析:從單體到微服務的數據困局

關鍵詞: 微服務數據一致性, 企業應用, 技術架構, 最佳實踐 本文基于多位資深架構師在大型互聯網公司的實戰經驗總結&#xff0c;希望能為正在進行微服務改造的團隊提供有價值的參考。如果您在實踐中遇到問題&#xff0c;歡迎交流討論&#xff01; 目錄 一、引言&#xff1a;從…

華為云Flexus+DeepSeek征文 | 基于華為云ModelArts Studio搭建Chatbox AI聊天助手

華為云FlexusDeepSeek征文 | 基于華為云ModelArts Studio搭建Chatbox AI聊天助手 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、Chatbox介紹Chatbox簡介主要特點 三、安裝Chatbox應用下載Chatbox軟件安裝Chatbox工具 四、開通Deep…

基于cpolar的GPT-SoVITS遠程訪問實踐過程

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 在人工智能技術持續革新之際&#xff0c;語音合成領域涌現出突破性進展。由開發者團隊"花兒不哭"研發的GPT-SoVI…

Redis數據結構之HyperLogLog

本文作者沒有設置VIP可見&#xff0c;并首發在我的博客&#xff1a;https://blog.liuzijian.com/post/redis-data-structure-hyperloglog.html 目錄 1.概述2.常用命令2.1 添加元素2.2 返回基數估算值2.3 合并hyperloglog 3.總結 1.概述 基數統計是一種去重復統計功能的基數估計…

django調用 paramiko powershell 獲取cpu 核數

在 Django 應用中使用 paramiko 庫通過 SSH 連接到遠程服務器并執行命令&#xff08;例如獲取 CPU 核數&#xff09;是一個常見的需求。下面是一個如何實現這一過程的步驟指南&#xff1a; 步驟 1: 安裝必要的庫 首先&#xff0c;確保你的 Django 項目中安裝了 paramiko 庫。如…

08-Python文件處理

08-Python文件處理 一、打開關閉文件 可以用 file 對象做大部分的文件操作。 file()在python3中已經被廢除&#xff0c;使用open()打開文件 open 函數 先用open()打開一個文件&#xff0c;創建一個file 對象&#xff0c;再用相關方法才可以調用它進行讀寫。 語法 file ob…

增強現實—Multimodal text style transfer for outdoor vision-and-language navigation

&#x1f31f;&#x1f31f; 歡迎來到我的技術小筑&#xff0c;一個專為技術探索者打造的交流空間。在這里&#xff0c;我們不僅分享代碼的智慧&#xff0c;還探討技術的深度與廣度。無論您是資深開發者還是技術新手&#xff0c;這里都有一片屬于您的天空。讓我們在知識的海洋中…

黑馬程序員新版Linux學習筆記——第二部分 基礎命令

一、Linux目錄結構 二、命令基礎 三、ls 列目錄內容 3.1 命令 3.2 參數 3.3 總結 四、cd 切換工作目錄 4.1命令 五、pwd 查看當前工作目錄 5.1命令 六、相對路徑、絕對路徑、特殊路徑符 七、mkdir 創建目錄命令 7.1命令 八、touch、cat、more 文件操作命令 8.1 touch 8.2c…

日常運維問題匯總-25

76.銷售訂單交貨單狀態更新 實務中偶有發生交貨已完成&#xff0c;無需開票或開票已經完成&#xff0c;交貨單狀態為&#xff1a;處理中&#xff0c;且仍然出現在VF04中&#xff0c;如下圖所示&#xff1a; 解決方法&#xff1a; T-CODE:VL_COMPLETE,可對錯誤的DN狀態進行更新…

【2025 年】軟件體系結構考試試卷-期末考試

2025 年軟件體系結構考試試卷 考試學期&#xff1a;2025 考試形式&#xff1a;閉卷 考試時間&#xff1a;120 分鐘 年級&#xff1a;______ 專業&#xff1a;軟件工程 班級&#xff1a;______ 一、單選題&#xff08;每小題 1.5 分&#xff0c;共 24 分&#xff09; 關于策略…

4.查看、刪除數據庫

1.顯示所有數據庫 SHOW DATABASE 2.顯示數據庫創建語句 SHOW CREAT DATABASE db_name 例如想查看某個數據庫是怎樣創建的&#xff0c;用的什么字符集啥的。 3.數據庫刪除語句【慎用】 DROP DATABASE [IF EXISTS] db_name 刪除某個數據庫之前一定要確定是否進行了備份。

設計模式 - 原型模式

原型模式&#xff08;Prototype&#xff09;&#xff0c;在制造業種通常是指大批量生產開始之前研發出的概念模型&#xff0c;并基于各種參數指標對其進行檢驗&#xff0c;效果達到了質量要求&#xff0c;即可參照這個原型進行批量生產。即&#xff0c;原型模式可以用對象創建對…