基于requests_html的python爬蟲

前言:今天介紹一個相對性能更高的爬蟲庫requests_html,會不會感覺和requests有點聯系?是的。為什么開始不直接介紹呢?因為我覺得requests是最基本入門的東西,并且在學習過程中也能學到很多東西。我的python老師在介紹這兩個庫時是直接一起講的,然后我就很混亂,各自特點以及用法都分不清楚。不是說老師講得不好啊,老師是高手,是我太菜了~.~

requests_html庫也是requests的作者開發的,是對requestsPyQuerylxmlbeautifulsoup4等庫的二次封裝。它將請求和解析功能集成在一起,使用起來更加方便。此外,requests_html支持異步請求,能夠提高爬蟲的效率。但是,在某些復雜場景下,它的使用不如單獨使用requestsBeautifulSoup靈活。

首先第一步當然是安裝requests_html庫啦,前面的文章有介紹,自行查閱

發送請求

from requests_html import HTMLSession  #從requests_html模塊中導入了HTMLSession類(封裝了 requests)
session=HTMLSession()                  #創建HTMLSession的實例(一個會話對象),用于發送HTTP請求
r=session.get('https://blog.csdn.net/2402_88126487?type=blog') #發起GET請求,r是Response對象(同requests)
if r.status_code!=200:raise Exception('error')
print(r.text)                         #返回的是響應的原始HTML文本
print(r.html.html)                    #r.html是requests_html庫提供的功能(包含一些額外的處理,比如自動解碼)
#r.html是一個HTML對象,對響應的HTML內容進行了解析和封裝,r.html.html是將解析后的HTML對象轉換為字符串形式,便于查看和操作

requests_html為html對象提供了許多方便的屬性和方法

r.html.html      #返回解析后的HTML內容的字符串形式
r.html.url       #返回實際請求的URL,可能與初始請求的URL不同(例如經過重定向后)
r.html.base_url  #返回頁面的基準URL
r.html.links     #返回頁面中所有鏈接的集合
r.html.absolute_links  #返回頁面中所有絕對鏈接的集合(完整的URL)
r.html.encoding  #查看以及更改頁面的編碼格式
r.html.render()  #渲染頁面以執行JavaScript
#如果請求的網頁包含動態加載的數據,那么在提取數據之前需調用r.html.render(),確保頁面上的JavaScript代碼被執行,從而加載所有動態內容
#使用需下載包(前面的文章介紹過了),
r.html.find()
r.html.xpath()   #這兩個方法將在下面介紹

request-html支持CSS選擇器和XPATH兩種語法來選取HTML元素

r.html.find(selector,first=False)

使用 CSS 選擇器查找頁面中的元素,如果 first=True,則只返回第一個匹配的Element對象;否則返回所有匹配的Element對象的列表,使用方法有點類似于soup.find(),但不能直接在 find 方法中指定如class等的參數,selector參數說明如下:

r.html.find('div')               #查找所有標簽為<div>的元素
r.html.find('div.article-list')  #查找所有標簽為<div>類名為article-list的元素
r.html.find('div#abc123')        #查找id為abc123的<div>標簽的元素

Element對象是requests_html庫中用于表示HTML元素的對象,有如下屬性和方法

element.text                #獲取元素的文本內容
element.attrs['href']       #通過element.attrs字典(包含了元素的所有屬性)來訪問元素的屬性
element.find()              #查找當前元素的子元素
element.html                #獲取元素的HTML內容

現在我們來嘗試打印主包博客首頁每篇文章的標題

from requests_html import HTMLSession
session=HTMLSession()
r=session.get('https://blog.csdn.net/2402_88126487?type=blog') 
if r.status_code!=200:raise Exception('error')
titles=r.html.find('article.blog-list-box')   #titles是列表,不能繼續.find
for title in titles:title=title.find('h4', first=True)print(title.text)

r.html.xpath(xpath,first=False)

使用 XPath 表達式查找頁面中的元素,如果 first=True,則只返回第一個匹配的元素;否則返回所有匹配的元素(element對象),xpath參數說明如下

r.html.xpath('//div')                   #查找所有標簽為<div>的元素
r.html.xpath("//div[@class='example']")  #查找所有<div>的class="example"的元素
r.html.xpath("//a[@href='https://example.com']")查找所有href=https://example.com的<a>元素

給大家分享一下如何快速得到xpath

找到要提取的元素,右鍵,點擊“復制”,點擊“復制完整的XPath”

我們復制前兩篇文章標題的xpath,如下,可以發現除了article后面的數字,其它都完全相同,并且數字代表篇數,那么我們可以通過改變數字獲取所有標題的h4標簽(為什么會想到這個呢?因為可以發現標題的存儲都十分有規律)

/html/body/div[2]/div/div[1]/div/div/div/div/div/div[2]/div/div[2]/div[1]/div[2]/div/article[1]/a/div[2]/div[1]/div[1]/h4
/html/body/div[2]/div/div[1]/div/div/div/div/div/div[2]/div/div[2]/div[1]/div[2]/div/article[2]/a/div[2]/div[1]/div[1]/h4

再寫代碼之前還要補充下:從瀏覽器開發者工具中復制的 XPath 是基于當前頁面的完整結構生成的絕對路徑。若網頁中的某些內容是通過 JavaScript 動態生成的,這個XPath就會失效。解決方法是調用r.html.render()來渲染動態內容。博客首頁開始有些地方是沒有展示的,當我們在底部繼續往下拉后才顯示出來,但是url沒有改變,說明這個網頁是動態加載的

代碼如下

from requests_html import HTMLSession
session=HTMLSession()
r=session.get('https://blog.csdn.net/2402_88126487?type=blog') 
if r.status_code!=200:raise Exception('error')
r.html.render()
for n in range(1,11):title=r.html.xpath(f'/html/body/div[2]/div/div[1]/div/div/div/div/div/div[2]/div/div[2]/div[1]/div[2]/div/article[{n}]/a/div[2]/div[1]/div[1]/h4')if title==[]:continueprint(title[0].text)

展示如下,不知道為什么STL那篇沒法顯示,但我單獨查找article[7]是可以搜索到的,可能是頁面加載時間過長了吧

?關閉會話

完成請求后,建議關閉會話對象,釋放資源(雖然不關不會報錯,但這可以避免潛在的資源泄漏)

session.close()

?爬取百度

現在,我們來解決一下之前遺留的問題(入門那一篇),當然用上一篇的抓包動態加載也可以,但requests_html支持JavaScript真的方便很多哦

代碼如下

from requests_html import HTMLSession
url='https://www.baidu.com/'
session=HTMLSession()
r=session.get(url)
r.html.render()
titles=r.html.find('ul#hotsearch-content-wrapper',first=True).find('li')
for title in titles:data=title.find('span')print(title.find('a',first=True).attrs['href'],data[0].text,data[1].text)

展示如下

至此,一代新星即將升起,你已經“出師”了

最后,再給大家分享個網站——博客園,主包之前查信息有看到過這個網站,不過沒去細看,最近發現里面真的有好多好棒的IT(Information Technology)專業信息文章,并且網頁都是渲染過的,視覺體驗好棒

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

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

相關文章

【架構篇】架構類型解釋

架構設計的本質&#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;出現了一個嚴重的問…

構建 TypoView:一個富文本樣式預覽工具的全流程記錄

我正在參加CodeBuddy「首席試玩官」內容創作大賽&#xff0c;本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 在一次和 CodeBuddy 的日常交流中&#xff0c;我提出了一個構想&#xff1a;能不能幫我從零構建一個富文本樣式…

AI:OpenAI論壇分享—《AI重塑未來:技術、經濟與戰略》

AI&#xff1a;OpenAI論壇分享—《AI重塑未來&#xff1a;技術、經濟與戰略》 導讀&#xff1a;2025年4月24日&#xff0c;OpenAI論壇全面探討了 AI 的發展趨勢、技術范式、地緣政治影響以及對經濟和社會的廣泛影響。強調了 AI 的通用性、可擴展性和高級推理能力&#xff0c;以…

Bash fork 炸彈 —— :(){ :|: };:

&#x1f9e0; 什么是 Fork 炸彈&#xff1f; Fork 炸彈是一種拒絕服務&#xff08;DoS&#xff09;攻擊技術&#xff0c;利用操作系統的 fork() 系統調用不斷創建新進程&#xff0c;直到系統資源&#xff08;如進程表、CPU、內存&#xff09;被耗盡&#xff0c;從而使系統無法…

<前端小白> 前端網頁知識點總結

HTML 標簽 1. 標題標簽 h1到h6 2. 段落標簽 p 3. 換行 br 水平線 hr 4. 加粗 strong 傾斜 em 下劃線 ins 刪除 del 5. 圖像標簽 img src-圖像的位置 alt- 圖片加載失敗顯示的文字 替換文本 title--- 鼠標放到圖片上顯示的文字 提示…

tomcat查看狀態頁及調優信息

準備工作 先準備一臺已經安裝好tomcat的虛擬機&#xff0c;tomcat默認是狀態頁是默認被禁用的 1.添加授權用戶 vim /usr/local/tomcat/conf/tomcat-users.xml22 <role rolename"manager-gui"/>23 <user username"admin" password"tomcat&q…

.NET NativeAOT 指南

目錄 1. 引言 2. 什么是 .NET NativeAOT&#xff1f; 2.1 NativeAOT 的定義 2.2 NativeAOT 與傳統 JIT 的對比 2.3 NativeAOT 的適用場景 3. NativeAOT 的核心優勢 3.1 性能提升 3.2 簡化部署 3.3 更小的應用體積 3.4 知識產權保護 4. NativeAOT 的基本用法 4.1 環境…