初學者如何用 Python 寫第一個爬蟲?

初學者如何用 Python 寫第一個爬蟲?

一、爬蟲的基本概念

(一)爬蟲的定義

爬蟲,英文名為 Web Crawler,也被叫做網絡蜘蛛、網絡機器人。想象一下,有一個勤勞的小蜘蛛,在互聯網這個巨大的蜘蛛網中穿梭。它能夠模擬人類用戶瀏覽網頁的行為,自動地在網頁間跳轉,其主要目的就是從網頁里精準地提取出我們想要的特定內容。比如說,你想知道某電商平臺上某款手機的所有評論,或者某個新聞網站上關于特定主題的所有文章,爬蟲就可以幫你快速獲取這些信息。

(二)爬蟲的主要工作流程

發送請求:依據 HTTP 協議,就像是你去商店買東西要遵循商店的規則一樣,爬蟲按照這個規則向目標網頁發起請求。它會帶著一些必要的信息,比如告訴網頁它想要獲取什么內容,然后得到網頁的 HTML 源代碼,這就像是拿到了商店給你的商品清單。例如,當你在瀏覽器地址欄輸入一個網址并回車,瀏覽器就會按照 HTTP 協議向對應的服務器發送請求,獲取網頁內容,爬蟲也是類似的原理。

解析數據:獲取到的 HTML 內容就像是一團雜亂的線球,里面包含了很多我們不需要的信息。解析數據這一步就是要把這團線球理順,精準地提取出我們真正需要的數據。比如從 HTML 代碼中找到網頁的標題、正文內容、圖片鏈接等等。可以把這一步想象成從一堆雜物中挑出你需要的寶貝。

存儲數據:將提取出的數據妥善保存起來,就像你把買到的寶貝放在合適的地方,方便后續進一步處理與分析。可以保存到文件中,比如常見的 txt 文本文件,也可以保存到數據庫里,方便進行數據的管理、查詢等操作。

(三)常用 Python 工具

requests:它是一個用于高效發送 HTTP 請求的庫。使用它就像給網頁發送一封 “郵件”,輕松獲取網頁內容。比如,你想獲取百度首頁的內容,使用 requests 庫幾行代碼就能搞定。它支持多種請求方式,如 GET、POST 等,滿足不同場景下的需求。

BeautifulSoup:這個庫專注于解析 HTML 或 XML 數據,能把復雜的 HTML 結構轉化為 Python 對象,讓我們可以很方便地提取特定內容。它就像是一個專業的 “整理師”,把 HTML 代碼整理得井井有條,我們可以輕松地找到自己想要的標簽和內容。例如,要找到網頁中的所有鏈接,使用 BeautifulSoup 就能快速實現。

re(正則表達式):正則表達式就像是一個強大的 “搜索工具”,可以精準匹配并提取復雜文本中的特定模式。比如,當你要從一段文本中找出所有符合郵箱格式的字符串,或者提取出所有的電話號碼,正則表達式就能發揮巨大作用。它有一套自己獨特的語法規則,掌握了這些規則,就能在文本處理中如魚得水。

pandas:在數據清洗與分析方面表現出色,是處理數據的得力助手。它可以對爬取到的數據進行清洗、轉換、分析等操作。例如,將爬取到的雜亂無章的數據整理成整齊的表格形式,方便進行數據分析和可視化展示。

二、環境搭建

(一)安裝 Python

確保你的計算機已安裝 Python,建議使用 3.7 及以上版本。如果還沒有安裝,別擔心,這很簡單。你可以前往 Python 官方網站(https://www.python.org/),在網站上找到下載按鈕,根據你計算機的系統(Windows、Mac 或 Linux)選擇對應的安裝包進行下載。下載完成后,按照安裝向導的提示一步步進行安裝即可。安裝過程中,記得勾選添加 Python 到系統路徑選項,這樣在后續使用命令行時就能更方便地調用 Python 了。

(二)安裝必要庫

安裝好 Python 后,接下來要安裝我們編寫爬蟲所需的庫。打開命令行或終端(在 Windows 系統中可以通過搜索 “命令提示符” 找到,Mac 系統中可以在 “應用程序 - 實用工具” 中找到 “終端”)。在命令行中運行以下命令來安裝所需的 Python 庫:

pip install requests beautifulsoup4

這里的pip是 Python 的包管理工具,就像一個軟件管家,通過它可以方便地安裝、升級和卸載 Python 庫。requests庫用于發送 HTTP 請求,beautifulsoup4庫用于解析 HTML 數據。安裝過程中,命令行會顯示安裝進度,耐心等待安裝完成即可。

三、編寫第一個簡單爬蟲

現在,我們就來動手實現一個簡單的爬蟲,目標是抓取某個網頁的標題與正文內容。比如說,我們以一個簡單的示例網頁https://example.com為例(實際使用時你可以替換為你感興趣的網頁,但要注意網頁的使用條款和法律規定,確保合法合規地進行數據爬取)。

(一)完整代碼示例

import requestsfrom bs4 import BeautifulSoupdef simple_crawler(url):try:# 發送HTTP請求response = requests.get(url)# 檢查請求狀態response.raise_for_status()# 解析HTML數據soup = BeautifulSoup(response.text, 'html.parser')# 提取網頁標題title = soup.find('title').text# 提取網頁正文段落paragraphs = soup.find_all('p')print(f"網頁標題: {title}")print("網頁內容:")# 遍歷并打印段落內容for p in paragraphs:print(p.text)except requests.exceptions.RequestException as e:print(f"請求失敗: {e}")url = "https://example.com"simple_crawler(url)

(二)代碼逐步解析

發送 HTTP 請求

response = requests.get(url)

這一行代碼使用requests.get()方法向目標網址發起 GET 請求。這里的url就是我們要爬取的網頁地址。requests.get()方法會返回一個response對象,這個對象包含了網頁的全部內容,其中就有我們需要的 HTML 源代碼。就好比你向一個地方發送了一個請求,對方給你寄回了一個包裹,這個包裹里裝著網頁的信息。

  1. 檢查請求狀態
response.raise_for_status()

這行代碼借助raise_for_status()方法來檢查請求是否成功。HTTP 協議中有很多狀態碼,比如 200 表示請求成功,404 表示網頁未找到,500 表示服務器內部錯誤等。如果返回的 HTTP 狀態碼代表錯誤,raise_for_status()方法就會觸發異常,這樣我們就能知道請求過程中出現了問題。這就像是你收到包裹后,先檢查一下包裹是否完好無損,如果有問題就及時發現。

  1. 解析 HTML 數據
soup = BeautifulSoup(response.text, 'html.parser')

這一步使用BeautifulSoup庫來解析 HTML 內容。response.text就是前面獲取到的網頁 HTML 源代碼,'html.parser'指定使用 Python 內置的 HTML 解析器。BeautifulSoup會把 HTML 內容轉化為一個便于操作的 Python 對象,就像把雜亂的物品整理分類,方便我們后續查找和提取需要的信息。

  1. 提取網頁內容
title = soup.find('title').textparagraphs = soup.find_all('p')

find('title')方法用于精準定位 HTML 代碼中的<title>標簽,并通過.text獲取標簽內的文本內容,也就是網頁的標題。find_all('p')方法則是提取所有的段落標簽<p>,并以列表的形式呈現。這就像是在整理好的物品中,專門挑出標題和所有段落的物品。

  1. 打印結果
for p in paragraphs:print(p.text)

這部分代碼通過一個循環遍歷提取到的段落內容,并逐一打印每個段落的文本。這樣我們就能在控制臺看到網頁的標題和正文內容了。就像你把挑出的段落物品一個一個拿出來展示。

四、優化爬蟲功能

(一)添加請求頭

有些網站很 “聰明”,會識別并阻止爬蟲程序的訪問。這時候,我們可以通過添加請求頭來模擬瀏覽器的訪問行為,讓網站以為是真實用戶在訪問。比如:

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"}response = requests.get(url, headers=headers)

這里的headers就是我們設置的請求頭,User - Agent字段模擬了一個 Chrome 瀏覽器的信息。當我們發送請求時,帶上這個請求頭,網站就更有可能允許我們訪問。

(二)控制爬取頻率

為了避免對目標網站造成過大負載,我們可以在每次請求后合理設置延時。比如:

import timedef delay_request(url):response = requests.get(url)time.sleep(2)return response

在這個函數中,使用time.sleep(2)讓程序暫停 2 秒后再繼續執行下一次請求。這樣可以減輕目標網站的壓力,也能避免因為頻繁請求而被網站封禁。

(三)保存數據

將爬取到的數據妥善保存至文件或數據庫中。

保存至文件

with open("output.txt", "w", encoding="utf - 8") as f:f.write(f"標題: {title}n")for p in paragraphs:f.write(p.text + "n")

這段代碼使用with open()語句打開一個名為output.txt的文件,以寫入模式("w"),并指定編碼為utf - 8。然后將網頁標題和段落內容逐行寫入文件中。

  1. 保存至 CSV 文件
import csvwith open("output.csv", "w", newline="", encoding="utf - 8") as csvfile:writer = csv.writer(csvfile)writer.writerow(("段落內容"))for p in paragraphs:writer.writerow((p.text))

這里使用csv模塊將數據保存為 CSV 文件。先創建一個csv.writer對象,然后寫入表頭"段落內容",再將每個段落內容逐行寫入文件。

五、應對復雜網頁

(一)動態加載網頁

對于由 JavaScript 渲染的網頁,requests庫無法獲取完整內容,因為它不會執行 JavaScript 代碼。這時候我們可以選用seleniumplaywright。以selenium為例:

from selenium import webdriverurl = "https://example.com"driver = webdriver.Chrome()driver.get(url)html = driver.page_source

首先導入webdriver模塊,然后創建一個Chrome瀏覽器驅動對象(需要提前下載對應版本的 ChromeDriver 并配置好路徑)。通過driver.get(url)方法打開網頁,driver.page_source可以獲取到經過 JavaScript 渲染后的完整網頁源代碼,這樣就能進一步解析和提取我們需要的數據了。

(二)處理 AJAX 請求

有些網頁會通過 AJAX 請求來動態加載數據。要處理這種情況,我們需要分析網頁的網絡請求,找到 AJAX 請求的 URL 和參數。比如,在 Chrome 瀏覽器中,打開網頁后按 F12 鍵,進入開發者工具,切換到 “Network” 選項卡,刷新網頁,就能看到網頁發起的所有請求。找到 AJAX 請求對應的 URL,然后使用requests庫模擬發送這個請求,獲取數據。例如:

ajax_url = "https://example.com/ajax - data"params = {"param1": "value1", "param2": "value2"}response = requests.get(ajax_url, params=params)data = response.json()

這里ajax_url是 AJAX 請求的 URL,params是請求參數,通過requests.get()方法發送請求,假設返回的數據是 JSON 格式,使用.json()方法將其解析為 Python 的字典或列表形式,方便進一步處理。

結語

恭喜你,勇敢的編程探險家!你已經成功邁出了用 Python 編寫爬蟲的第一步,這是一段充滿無限可能的奇妙旅程的開始。也許在這個過程中,你遇到了一些挑戰,比如代碼報錯、數據提取不準確,但請相信,每一次解決問題都是一次成長。

學會 Python 之后,你的世界將變得更加廣闊。在數據領域,你可以輕松地從互聯網上收集大量數據,進行數據分析和挖掘,發現隱藏在數據背后的規律和價值,無論是用于學術研究、商業決策還是個人興趣項目都非常有用。在自動化辦公方面,Python 爬蟲可以幫你自動獲取工作中需要的信息,如市場數據、行業報告等,大大提高工作效率。甚至在網絡安全領域,你可以利用爬蟲技術進行漏洞掃描和安全評估。所以,不要停下腳步,繼續探索 Python 的世界,不斷學習和實踐,你會發現自己的潛力遠超想象,能夠創造出令人驚嘆的作品。加油,未來的編程大師就是你!

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

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

相關文章

IDE/IoT/搭建物聯網(LiteOS)集成開發環境,基于 VSCode + IoT Link 插件

文章目錄 概述IDE安裝安裝舊版本VSCode安裝插件安裝問題和解決手動安裝SDK包手動下載依賴工具 IoTLink配置IoTLink Home用戶設置-工具鏈-編譯器用戶設置-工具鏈-構建器用戶設置-工具鏈-燒錄器用戶設置-SDK管理工程設置-SDK配置工程設置-編譯器工程設置-調試器 創建工程Demo 源碼…

深度剖析:Dify+Sanic+Vue+ECharts 搭建 Text2SQL 項目 sanic-web 的 Debug 實戰

目錄 項目背景介紹sanic-web Dify\_service handle\_think\_tag報錯NoneType問題描述debug Dify調用不成功&#xff0c;一直轉圈圈問題描述debug 前端markdown格式只顯示前5頁問題描述debug1. 修改代碼2.重新構建1.1.3鏡像3.更新sanic-web/docker/docker-compose.yaml4. 重新部…

理想AI Talk第二季-重點信息總結

一、TL&#xff1b;DR 理想為什么要做自己的基模&#xff1a;座艙家庭等特殊VLM場景&#xff0c;deepseek/openai沒有解決理想的基模參數量&#xff1a;服務端-300B&#xff0c;VLencoder-32B/3.6B&#xff0c;日常工作使用-300B&#xff0c;VLA-4B為什么自動駕駛可以達成&…

TensorRT

TensorRT 下載 TensorRT 7.1.3.4 TAR壓縮包&#xff0c;解壓到安裝目錄&#xff1a; tar xzvf TensorRT-7.1.3.4.Ubuntu-16.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz 添加 TensorRT lib 到環境變量&#xff1a; gedit ~/.bashrc # 添加 export LD_LIBRARY_PATH$LD_LIBRARY_PAT…

【NGINX】 -9 nginx + tomcat實現的多級反向代理

文章目錄 1、tomcat的安裝 (centos版本)1.1 安裝Java依賴環境1.2 安裝tomcat 2、tomcat的虛擬主機的配置2.1 配置多級目錄 3、利用nginx的反向代理實現將轉發指向一個虛擬機3.1 nginx服務器的配置3.2 客戶端配置 4、 反向多級代理代理服務器操作nginx 1 服務器nginx 2 服務器to…

基于requests_html的python爬蟲

前言&#xff1a;今天介紹一個相對性能更高的爬蟲庫requests_html&#xff0c;會不會感覺和requests有點聯系&#xff1f;是的。為什么開始不直接介紹呢&#xff1f;因為我覺得requests是最基本入門的東西&#xff0c;并且在學習過程中也能學到很多東西。我的python老師在介紹這…

【架構篇】架構類型解釋

架構設計的本質&#xff1a;從模糊概念到系統化思維 摘要 “架構”是系統設計的靈魂&#xff0c;但許多人對它的理解仍停留在抽象層面。本文系統解析架構的8大核心維度&#xff0c;結合設計原則、案例與誤區分析&#xff0c;幫助開發者建立從戰略到落地的完整認知框架。 一、架…

用Python繪制夢幻星空

用Python繪制夢幻星空 在這篇教程中&#xff0c;我們將學習如何使用Python創建一個美麗的星空場景。我們將使用Python的圖形庫Pygame和隨機庫來創建閃爍的星星、流星和月亮&#xff0c;打造一個動態的夜空效果。 項目概述 我們將實現以下功能&#xff1a; 創建深藍色的夜…

PyTorch循環神經網絡(Pytotch)

文章目錄 循環神經網絡&#xff08;RNN&#xff09;簡單的循環神經網絡長短期記憶網絡&#xff08;LSTM&#xff09;門控循環單元&#xff08;GRU&#xff09; 循環神經網絡&#xff08;RNN&#xff09; 循環神經網絡&#xff08;RecurrentNeuralNetwork&#xff0c;RNN&#…

用算術右移實現邏輯右移及用邏輯右移實現算術右移

函數srl()用算術右移實現邏輯右移&#xff0c;函數sra()用邏輯右移實現算術右移。 程序代碼 int sra(int x,int k); unsigned int srl(unsigned int x, int k);void main() {int rx1,k,x1;unsigned int rx2,x2;k3;x10x8777;x20x8777;rx1sra(x1, k);rx2srl(x2, k);while(1); }…

pojo層、dao層、service層、controller層的作用

在Java Web開發中&#xff0c;常見的分層架構&#xff08;如Spring Boot項目&#xff09;通常包含POJO層、DAO層、Service層和Controller層&#xff0c;各層職責明確&#xff0c;協同工作。以下是各層的作用及相互關系&#xff1a; 1. POJO層&#xff08;Model/Entity層&#…

【Linux網絡】五種IO模型與阻塞IO

IO 在Linux網絡環境里&#xff0c;IO&#xff08;Input/Output&#xff09;指的是網絡數據在系統與外部網絡&#xff08;像其他設備、服務器或者客戶端&#xff09;之間進行傳輸的過程。 它是網絡編程和系統性能優化的核心內容。 IO &#xff1a;INPUT和OUTPUT&#xff08;站…

入門OpenTelemetry——應用自動埋點

埋點 什么是埋點 埋點&#xff0c;本質就是在你的應用程序里&#xff0c;在重要位置插入采集代碼&#xff0c;比如&#xff1a; 收集請求開始和結束的時間收集數據庫查詢時間收集函數調用鏈路信息收集異常信息 這些埋點數據&#xff08;Trace、Metrics、Logs&#xff09;被…

大數據場景下數據導出的架構演進與EasyExcel實戰方案

一、引言&#xff1a;數據導出的演進驅動力 在數字化時代&#xff0c;數據導出功能已成為企業數據服務的基礎能力。隨著數據規模從GB級向TB級甚至PB級發展&#xff0c;傳統導出方案面臨三大核心挑戰&#xff1a; ?數據規模爆炸?&#xff1a;單次導出數據量從萬級到億級的增長…

拓展運算符與數組解構賦值的區別

拓展運算符與數組解構賦值是ES6中用于處理數組的兩種不同的特性&#xff0c;它們有以下區別&#xff1a; 概念與作用 ? 拓展運算符&#xff1a;主要用于將數組展開成一系列獨立的元素&#xff0c;或者將多個數組合并為一個數組&#xff0c;以及在函數調用時將數組作為可變參…

2025年全國青少年信息素養大賽初賽真題(算法創意實踐挑戰賽C++初中組:文末附答案)

2025年全國青少年信息素養大賽初賽真題(算法創意實踐挑戰賽C++初中組:文末附答案) 一、單項選擇題(每題 5 分) C++ 程序流程控制的基本結構不包括以下哪項? A. 分支結構 B. 數據結構 C. 循環結構 D. 順序結構 以下哪段代碼能將數組 int a[4] = {2, 4, 6, 8}; 的所有元素變…

計算機視覺與深度學習 | Python實現EMD-CNN-LSTM時間序列預測(完整源碼、數據、公式)

EMD-CNN-LSTM 1. 環境準備2. 數據生成(示例數據)3. EMD分解4. 數據預處理5. CNN-LSTM模型定義6. 模型訓練7. 預測與重構8. 性能評估核心公式說明1. 經驗模態分解(EMD)2. CNN-LSTM混合模型參數調優建議擴展方向典型輸出示例以下是使用Python實現EMD-CNN-LSTM時間序列預測的完…

React 19中useContext不需要Provider了。

文章目錄 前言一、React 19中useContext移除了Provider&#xff1f;二、使用步驟總結 前言 在 React 19 中&#xff0c;useContext 的使用方式有所更新。開發者現在可以直接使用 作為提供者&#xff0c;而不再需要使用 <Context.Provider>。這一變化簡化了代碼結構&…

單片機-STM32部分:14、SPI

飛書文檔https://x509p6c8to.feishu.cn/wiki/VYYnwOc9Zi6ibFk36lYcPQdRnlf 什么是SPI SPI 是英語Serial Peripheral interface的縮寫&#xff0c;顧名思義就是串行外圍設備接口。是Motorola(摩托羅拉)首先在其MC68HCXX系列處理器上定義的。 SPI&#xff0c;是一種高速的&…

Vue 3 動態 ref 的使用方式(表格)

一、問題描述 先給大家簡單介紹一下問題背景。我正在開發的項目中&#xff0c;有一個表格組件&#xff0c;其中一列是分鏡描述&#xff0c;需要支持視頻上傳功能。用戶可以為每一行的分鏡描述上傳對應的視頻示例。然而&#xff0c;在實現過程中&#xff0c;出現了一個嚴重的問…