爬蟲簡單實操2——以貼吧為例爬取“某吧”前10頁的網頁代碼

需求是將貼吧的【某個吧】里面【n頁】的網頁代碼爬取下來,保存至本地

首先我們要思考這個貼吧爬蟲的框架,要有方法可以構造url列表(就可以一次獲取多個url),能請求獲取相應,能把html保存到本地。

import requestsclass TiebaSpider(object): # 初始化核心組件def __init__(self):  ....要有url要有headersdef 構造url列表(self):  passdef 獲取響應(self):  passdef 保存(self):  passdef run(self):     '''主要業務邏輯'''#url列表#發送請求獲取響應#保存if __name__ == '__main__':  TiebaSpider=TiebaSpider()TiebaSpider.run()



一、初始化核心組件

找到貼吧某個吧【lol吧】的url: https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=450
pn是確定頁面的參數,450/50=9,0是第1頁,9是第10頁。怎么獲取【貼吧名字】,實例化對象的時候把參數寫里面去,然后在初始化方法里面,加上tieba_name去獲取傳的名字。

#將變量 tieba_name 綁定到當前類的實例上,使其成為實例變量,作用域貫穿實例的生命周期
self.tieba_name = tieba_name self.start_url = 'https://tieba.baidu.com/f?kw='+tieba_name+'&ie=utf-8&pn={}'self.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"
}



二、構造存放url列表的函數

需要構建一個空列表url_list = [] ,用來保存這10頁的 url ,這些url的參數是需要我們提供的,并且拼接起來,所以要思考怎么獲取【頁數】,每一頁是50條數據,所以第1頁是050,第2頁是150,依次類推用到range()方法,range是從0開始的,然后每一條的頁數信息也拼接上,url就完整了。

format()的基本功能作用:將變量值填充到字符串的{}占位符中。

def get_url_list(self):# 構造URL列表url_list = []for i in range(10): #循環10次,也就是10頁url_list.append(self.start_url.format(i*50))                                                        # print(url_list)  #檢測url寫對沒return url_list  #然后返回url_list

run()函數里面也要調用這個 get_url_list()函數,把返回的url_list的值保存到變量url_list里面

#構造URL列表
url_list = self.get_url_list() #調用所以這個列表會保存到url_list里面



三、構造發送請求獲取響應的函數

想要得到響應,用到的就是requests.get(url)方法,保存到response變量里面,用response.text 或者 response.content.decode()獲取網頁源代碼內容【也就是html】,那我們的url怎么得到并能在這個函數里面使用?就需要在這個構造函數里面加一個參數url。

	def parse_url(self,url):print(url)# 發送請求,得到響應response = requests.get(url,headers=self.headers)response.encoding = 'utf-8'return response.text  #返回的值是網頁代碼

并且在run()里面要先循環存入 url_list 里面真實的 url 到 for循環的 變量url 里面,存的就是通過response.text獲得的html代碼,所以調用方法parse_url()保存到名為html的變量里面

#遍歷 發送請求獲取響應for url in url_list:  #循環列表里元素個數的次數,然后每次把列表里面的元素按順序賦值給urlhtml = self.parse_url(url) #調用此方法傳參url,所以方法里面要接受url,參數要加上url# print(html)page_num = url_list.index(url) + 1  #index()前面的對象要是列表,url只是列表里面的一個元素,是一個str類型

這個時候其實還沒思考怎么傳頁數,后面再回頭寫page_num。現在也可以淺淺分析一下:因為在后面保存的時候,我需要頁面的參數來命名【tieba_name-第i頁.html】,所以這里的列表索引可以作為頁數,比定義一個page_num = 0,然后用for…range 循環保存頁數要高級,代碼量也少些。index下標是從0開始,所以第1頁就是 url_list.index(url) + 1 。注意index()括號里面寫的是列表里面的這個元素對應的下標,所以括號里面是變量url。



四、構造保存html的函數

保存的時候我要知道【貼吧名】,【網頁源代碼】和【頁數】,所以要把這些參數獲取到。而【貼吧名 self.tieba_name】是初始化里面加了self.的實例變量,可以在任何構造函數里面使用或修改,故不需要在函數里傳參(不需要在括號里面寫參數名)。在函數括號里面加上【網頁源代碼】和【頁數】這兩個參數名即可。

補充:實例變量(self.變量名):
通過 self.變量名 定義的變量屬于當前實例,作用域貫穿實例的生命周期。	  
其他方法也可以通過 self.變量名 訪問或修改它。

保存的HTML名字是這個類型:“ tieba_name-第i頁.html ”

def save_html(self,html,page_num):# 保存 tieba_name-第i頁.htmlwith open(self.tieba_name+'-第'+str(page_num)+'頁.html','w',encoding='utf-8') as f:f.write(html)

run() 方法里也要調用 save_html() 方法,因為 save_html() 方法 里面要獲取【網頁源代碼】和【頁數】,所以我們在調用 save_html() 方法 時候要傳入 html , page_num 兩個參數。

#保存
self.save_html(html,page_num) #調用此方法傳參html,所以方法里面要接受html,參數要加上html。然后把page_num傳給save_html()方法



五、爬蟲整體代碼


import requestsclass TiebaSpider(object): #集成object 面向對象def __init__(self,tieba_name):  #init# 初始化核心組件  #https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=450   pn是頁面,一頁50條self.tieba_name = tieba_name  #這樣才可以在別的方法里使用到傳過來的tieba_name,以 self.tieba_name 變量來使用self.start_url = 'https://tieba.baidu.com/f?kw='+tieba_name+'&ie=utf-8&pn={}'self.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"}def get_url_list(self):# 構造URL列表'''url_list = []for i in range(10): #10次10頁url_list.append(self.start_url.format(i*50))                                                               # print(url_list) #檢測url寫對沒return url_list  #然后返回url_list'''# 列表推導式(List Comprehension)是 Python 中一種簡潔高效的構建列表的方式,可以替代顯式的 for 循環和 append 操作。想要看結果也可以把推導式保存至變量,然后print出來return [self.start_url.format(i*50) for i in range(10)]def parse_url(self,url):print(url)# 發送請求,得到響應response = requests.get(url,headers=self.headers)response.encoding = 'utf-8'return response.text  #返回的值是網頁代碼def save_html(self,html,page_num):# 保存 tieba_name-第i頁.html# print(page_num)with open(self.tieba_name+'-第'+str(page_num)+'頁.html','w',encoding='utf-8') as f:f.write(html)def run(self):     #run方法'''主要業務邏輯'''#構造URL列表url_list = self.get_url_list() #調用所以這個列表會保存到url_list里面#遍歷 發送請求獲取響應for url in url_list:  #循環列表里元素個數的次數,然后每次把列表里面的元素按順序賦值給urlhtml = self.parse_url(url) #調用此方法傳參url,所以方法里面要接受url,參數要加上url# print(html)page_num = url_list.index(url) + 1  #index()前面的對象要是列表,url只是列表里面的一個元素,是一個str類型#保存self.save_html(html,page_num) #調用此方法傳參html,所以方法里面要接受html,參數要加上html。然后把page_num傳給save_html()方法# exit()  #循環第一次就退出if __name__ == '__main__':  #mainTiebaSpider = TiebaSpider('lol')  #實例化這個類  lol貼吧名TiebaSpider.run()

最終點擊html實現的效果,動手嘗試一下吧!
在這里插入圖片描述

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

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

相關文章

webpack5 css-loader 配置項中的modules

在 Webpack 的 css-loader 中,modules 選項是一個核心配置,它直接關系到 CSS 的模塊化處理方式。下面從概念、原理、使用場景和實踐技巧四個方面詳細解析: 概念解析:CSS Modules 是什么? CSS Modules 是一種讓 CSS 類…

springboot+Vue駕校管理系統

概述 基于springbootVue開發的駕校管理系統。該系統采用主流技術棧開發,功能完善,既包含用戶端便捷的操作界面,又具備強大的后臺管理功能。 主要內容 一、用戶端功能模塊 ??核心功能導航??: 首頁展示駕校推薦信息及最新動態…

#華為鯤鵬#華為計算#鯤鵬開發者計劃2025#

#華為鯤鵬#華為計算#鯤鵬開發者計劃2025# <新版開發者計劃>的內容鏈接&#xff1a;鯤鵬開發者計劃2025-鯤鵬社區 通過學習畢昇編譯器整體介紹&#xff0c;以及安裝使用流程、新增特性、調優工具的使用及相關指導文件獲取&#xff0c;對畢異編譯器有了更深的認識。 我剛…

小程序學習筆記:聲明式導航的多種玩法

在小程序開發中&#xff0c;頁面導航是實現用戶流暢交互體驗的關鍵環節。今天&#xff0c;咱們就一起來深入學習小程序里通過聲明式導航實現頁面跳轉、切換 tab 頁、后退等功能的技巧&#xff0c;還會附上詳細代碼示例&#xff0c;讓大家輕松掌握&#xff01; 一、什么是頁面導…

Linux中《動/靜態庫原理》

目錄 目標文件ELF文件ELF從形成到加載輪廓ELF形成可執行readelf命令ELF可執行文件加載 理解連接與加載靜態鏈接ELF加載與進程地址空間虛擬地址/邏輯地址 重新理解進程虛擬地址空間 動態鏈接與動態庫加載進程如何看到動態庫進程間如何共享庫的動態鏈接動態鏈接到底是如何工作的&…

Android大圖加載優化:BitmapRegionDecoder深度解析與實戰

在移動端開發中&#xff0c;超大圖片加載一直是性能優化的難點。本文將深入剖析BitmapRegionDecoder原理&#xff0c;提供完整Kotlin實現方案&#xff0c;并分享性能調優技巧。 一、為什么需要大圖加載優化&#xff1f; 典型場景&#xff1a; 醫療影像&#xff1a;2000015000…

基于ApachePOI實現高德POI分類快速導入PostgreSQL數據庫實戰

目錄 前言 一、高德POI分類簡介 1、數據表格 2、分類結構 二、從Excel導入到Postgresql 1、Excel解析流程 2、Mybatis批量導入 3、數據入庫 三、總結 前言 在大數據與地理信息深度交融的當下&#xff0c;地理信息系統&#xff08;GIS&#xff09;的觸角已延伸至各個領域…

如何打造Apache Top-Level開源時序數據庫IoTDB

引言 數據與時間結合后&#xff0c;便擁有了生命。在金融、系統日志、工業產線和智能設備等領域&#xff0c;時序數據每毫秒都在不斷產生。管理這些海量時序數據需要專業的數據庫系統。時序數據庫產品正逐漸受到市場的關注&#xff0c;本文將分享如何通過開源的方式&#xff0…

高并發內存池實戰指南

項目源碼&#xff1a;https://gitee.com/kkkred/thread-caching-malloc 目錄 一、脫離new&#xff1a;高并發內存池如何替代傳統動態分配 1.1 new的痛點&#xff1a;碎片、延遲與鎖競爭 1.2 高并發內存池的替代方案&#xff1a;分層預分配無鎖管理 二、大內存&#xff08;…

基于springboot+vue的數字科技風險報告管理系統

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系統展示 管理員登錄 管理…

實戰篇----利用 LangChain 和 BERT 用于命名實體識別-----完整代碼

上一篇文章講解了Langchain,實現一個簡單的demo,結合利用 LangChain 和 BERT 用于命名實體識別。 一、命名實體識別模型訓練(bert+CRF) bert作為我們的預訓練模型(用于將輸入文本轉換為特征向量),CRF作為我們的條件隨機場(將嵌入特征轉為標簽),既然要訓練,那么我們的損失函…

現代 C++ 容器深度解析及實踐

一、線性容器&#xff1a;std::array 與 std::forward_list 1. std::array&#xff1a;固定大小的高效容器 在傳統 C 中&#xff0c;數組與 vector 的抉擇常讓人糾結&#xff1a;數組缺乏安全檢查&#xff0c;vector 存在動態擴容開銷。C11 引入的std::array完美平衡了兩者優…

數據集|豬姿態檢測PigBehaviorRecognitionDataset

數據集|豬姿態檢測PigBehaviorRecognitionDataset 一、數據集介紹1.1 介紹1.2 用途1.3 數據集統計 二、樣本類別介紹1. Lying&#xff08;躺臥&#xff09;2. Sleeping&#xff08;睡眠&#xff09;3. Investigating&#xff08;探索&#xff09;4. Eating&#xff08;進食&…

Vue-13-前端框架Vue之應用基礎路由器的使用步驟

文章目錄 1 路由和路由器2 基本切換效果2.1 App.vue(根組件)2.2 components(子組件)2.2.1 Home.vue(首頁)2.2.2 News.vue(新聞)2.2.3 About.vue(關于)2.3 路由器2.3.1 router/index.ts2.3.2 main.ts2.4 效果展示2.5 程序流程3 筆記3.1 路由組件和一般組件3.1.1 Header.vue(一般…

GaussDB實例級自動備份策略:構建數據安全的“自動防護網”

GaussDB實例級自動備份策略&#xff1a;構建數據安全的“自動防護網” 在數字化轉型的浪潮中&#xff0c;數據庫作為企業核心數據的載體&#xff0c;其安全性與可恢復性直接關系到業務的連續性。對于分布式數據庫GaussDB而言&#xff0c;實例級自動備份策略是保障數據安全的關…

推薦幾本關于網絡安全的書

對于網絡安全從業者、相關專業學生以及對網絡安全感興趣的人士而言&#xff0c;掌握扎實的網絡安全知識和技能至關重要。以下推薦的幾本網絡安全書籍&#xff0c;涵蓋了網絡安全領域的多個重要方面&#xff0c;是學習和研究網絡安全的優質參考資料。 1、攻擊網絡協議&#xff…

工業4.0浪潮下PROFIBUS DP轉ETHERNET/IP在軋鋼廠的創新實踐

在工業自動化4.0推動制造業向智能化升級的背景下&#xff0c;軋鋼廠生產對設備互聯與數據協同提出更高要求。PROFIBUS DP與ETHERNET/IP協議的特性差異&#xff0c;制約著西門子PLC與工業測距儀等設備的高效協作。通過協議轉換技術實現兩者互通&#xff0c;為軋鋼生產線注入智能…

從0開始學習R語言--Day31--概率圖模型

在探究變量之間的相關性時&#xff0c;由于并不是每次分析數據時所用的樣本集都能囊括所有的情況&#xff0c;所以單純從樣本集去下判斷會有武斷的嫌疑&#xff1b;同樣的&#xff0c;我們有時候也想要在數據樣本不夠全面時就能對結果有個大概的了解。 例如醫生在給患者做診斷…

微信小程序進度條progress支持漸變色

微信小程序自帶進度條progress支持漸變色代碼 .wx-progress-inner-bar {border-radius: 8rpx !important;background: linear-gradient(90deg, #FFD26E 8%, #ED0700 100%) !important; }<view class"progress-box"><progress percent"80" back…

Linux內核網絡協議棧深度解析:面向連接的INET套接字實現

深入剖析Linux內核中TCP連接管理的核心機制,揭示高效網絡通信的實現奧秘。 一、源地址匹配:連接建立的第一道關卡 在TCP連接建立過程中,內核需要驗證源地址是否匹配。inet_rcv_saddr_equal()函數是實現這一功能的核心,它巧妙地處理了IPv4/IPv6雙棧環境: bool inet_rcv_s…