Python爬蟲實戰:Requests與Selenium詳解

目錄

一 網絡爬蟲的了解

1 爬蟲庫

urllib庫

requests庫

scrapy庫

selenium庫

2 注意!!!

二 requests庫

1 request庫的安裝

2 認識網頁資源

3 獲取網頁資源

4 小案例

5 代理服務器

三 selenium

1 準備工作

2 應用

3 實例


一 網絡爬蟲的了解

????????網絡爬蟲是一種自動化程序,用于從互聯網上抓取、解析和存儲網頁數據。通常用于搜索引擎、數據分析或信息聚合等場景。

1 爬蟲庫

python給我們提供了多個爬蟲庫,下面我們來先了解四個

urllib庫

????????urllib是Python內置的HTTP請求庫,包含多個模塊用于處理URL操作。主要模塊包括urllib.request(打開和讀取URL)、urllib.error(異常處理)、urllib.parse(解析URL)和urllib.robotparser(解析robots.txt文件)。適用于簡單的HTTP請求,但功能相對基礎,缺乏高級特性如會話保持和連接池。

requests庫

????????requests是一個第三方HTTP庫,基于urllib開發,但提供了更簡潔的API和更強大的功能。支持HTTP連接保持、會話對象、Cookie持久化、文件上傳等。其設計注重易用性,適合大多數HTTP請求場景,如API調用或網頁抓取。

scrapy庫

????????scrapy是一個開源的爬蟲框架,用于大規模數據抓取。提供完整的爬蟲工作流管理,包括請求調度、數據提取、存儲等。支持異步處理、中間件擴展和分布式爬取。適合復雜爬蟲項目,但學習曲線較陡峭,需遵循框架的設計模式。

selenium庫

????????selenium是一個自動化測試工具,主要用于瀏覽器自動化。通過驅動真實瀏覽器(如Chrome、Firefox)模擬用戶操作,支持JavaScript渲染頁面的抓取。適用于動態網頁或需要交互的場景,但性能較低,資源消耗較大。

四者的選擇取決于需求:簡單請求用requests,復雜爬蟲用scrapy,動態頁面用selenium,而urllib適合無需依賴第三方庫的基礎場景。

這篇我們來具體學習requests,selenium庫

2 注意!!!

????????所有學習爬蟲的學者在學習爬蟲之前都要閱讀爬蟲規則,不是所有網站上的資源都允許爬取的,我們在爬取之前要查看該網站的robots.txt規則。下面以CSDN為例查看一下

上面列舉了這些不能爬取的。如果硬爬的話小心進局子!

二 requests庫

1 request庫的安裝

在命令提示符窗口或pycharm終端進行安裝。(如果比較慢,我們可以用清華源安裝)

pip install requests -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

2 認識網頁資源

我們可以通過在網頁空白處,點擊左鍵,會出現

網頁源代碼

????????我們先點擊一下查看頁面源代碼,我們查找一下.jpg發現沒有一張圖片但網頁中卻存在許多雜照片,這是是因為.jpg是經過瀏覽器渲染之后才會出現的,在源代碼中不存在.jpg格式的數據

檢查

我們點擊完檢查,然后再點擊中間那個按鈕,然后就可以自動定位到這個圖片的url了,我們也就可以使用了,所有這個是渲染之后的?

我們先點擊中間那個按鈕,然后就可以自動定位到這個圖片的url了,我們也就可以使用了,所有這個是渲染之后的?

3 獲取網頁資源

我們用get()函數來獲取,這個函數有三個形參,分別是

url? ? ? ? 圖片的HTML網址

params? ? ? ? 可選參數,構造url字符串的

返回值是一個由類Response創建的對象

下面舉例

import requests
r=requests.get("https://www.ptpress.com.cn/search",params={'keyword': 'Python教程'})
r.encoding=r.apparent_encoding
n=r.status_code
print(r.text)
print(n)

這段代碼,在get中,我們有兩個參數,一個url為中國郵電出版社的網址,一個params為一個字典{'keyword': 'Python教程'},這行代碼也相當于

https://www.ptpress.com.cn/?keyword=python

只查找一個python可能會有點麻煩,但如果要查找許多個這樣寫就會便捷許多

如果不對編碼進行調整,返回的text就會有亂碼的部分,這里將檢測到的編碼賦值給了我們設定對象類的編碼。

這里我們還對狀態碼進行了檢查,如果狀態碼為404,那么這個網頁不存在、如果是200則請求成功,如果500則是內部服務器錯誤。

4 返回頁面內容

有個問題,我們這里返回的是網頁源代碼還是檢查得到的內容呢,

我們在返回值中查詢,結果得到的.jpg的數量還是0,說明這個是返回的源代碼的內容

import requests
r=requests.get(r"https://cdn.ptpress.cn/uploadimg/Material/978-7-115-66932-2/72jpg/66932_s300.jpg")
f=open("test.jpg","wb")
f.write(r.content)
f.close()

這個代碼中我們輸入的一個.jpg格式的網站,然后我們把這個內容保存到了一個二進制文件中,然后就變成了一個圖片了,這個說明了r.content返回的內容和上面.txt返回的內容不一樣,這個返回的是一個保存著這個圖片的二進制的文件。

圖片、音頻、視頻、壓縮包可以用.content保存,HTML、JSON等可以用.txt保存

4 小案例

我們把一個網站中所有的書名打印下來

import re
import requests
r=requests.get(r"https://www.ryjiaoyu.com/book")
# title="計算機應用基礎習題與實驗教程(Windows 10+Office 2016)(第3版)">計算機應用基礎習題與實驗教程(Windows 10+Office 2016)(第3版)</a></h4>
result=re.findall(r'title=(.+?)">(.+?)</a></h4>',r.text)
print(result)
for i in range(len(result)) :print('第'+str(i+1)+'本書:'+result[i][1])

輸出結果:

代碼解讀:

?首先導入庫,然后用requests.get()函數讀取網址內容,然后觀察網址中我們要找書名存在位置行的特征,寫出正則表達式,我們這里保存下來的結果是一個列表,列表中包含若干個元組,然后我們循環打印出索引為1的值就出結果了

5 代理服務器

代理服務器就是當我們請求過多被加入黑名單之后,然后可以通過買代理服務器來繼續請求,這個服務器可以理解成另一個電腦,建立鏈接,我們向代理服務器發送請求,然后代理服務器把請求發送給目標網站,然后目標網站返回信息,代理服務器在返回給我們。

使用方法

import requestsproxie={'http':'代理服務器ip'}
response = requests.get("https://www.ptpress.com.cn/",proxies=proxie)
print(response.text)  # 獲取網頁內容

這里http應為代理服務器網址,可以買,免費的很少且不穩定。

三 selenium

????????驅動真實瀏覽器(如Chrome、Firefox)模擬用戶操作,且瀏覽器可以實現頁面的渲染,因此我們很容易獲得選然后的數據信息。(說明這里我們得到的是’檢查‘得到的內容)

1 準備工作

? ? ? ? selenium可以驅動內核,但我們還是要安裝對應版本的瀏覽器的內核驅動程序以便于更好的驅動瀏覽器。下面我們來安裝下WebDriver

第一步 先查看我們電腦的瀏覽器版本號(不同瀏覽器的驅動也不一樣,我這里是edge)

? ? ? ?在右上角有三個點,下面可以看到關于Microsoft Edfe

然后可以查看到,我的瀏覽器內核版本為138.0.3351.95

第二步 去官網下載

Microsoft Edge WebDriver | Microsoft Edge Developer上面可以找到對應版本。一般我們電腦下載x64位就好了

?第三步 把msedgedriver放到我們python的Scripts中

?(最好scripts中和python所在文件夾中分別放一個)

第四步 下載selenium庫

直接在終端pip安裝就好

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

了解selenium操作原理

2 應用

import time
import requests
from selenium import webdriver
from selenium.webdriver.edge.options import Options
edge_options = Options()
edge_options.binary_location=r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get("https://www.ptpress.com.cn/search?keyword=c++&jc=")
print(driver.page_source)
sleep(100)

不同人的edge的位置可能不用,要修改下edge_options.binary_locatio

不同瀏覽器的這個也不同,例如我的edge是這樣webdriver.Edge(options=edge_options)驅動的

如果是谷歌就是driver = webdriver.Edge(options=chrome_options)

然后就可以驅動起來了,但是驅動完又會直接退出,這里可以sleep一下

加載網頁用driver.get()來加載,填入url就可以加載頁面了

可以通過driver.page_source來獲取渲染后的網頁代碼,下面是部分

3 實例

使用selenium把中國郵電出版社的c++板塊的幾本書圖片給爬下來。

import re
import timeimport requests
from selenium import webdriver
from selenium.webdriver.edge.options import Options
edge_options = Options()
edge_options.binary_location=r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get("https://www.ptpress.com.cn/search?keyword=c++&jc=")
print(driver.page_source)
result=re.findall('<img src="(.+?jpg)">',driver.page_source)suresult=re.findall('</div><p>(.+?)</p></a>',driver.page_source)for i in range(len(result)):r = requests.get(result[i])name=r'c++圖書/'+suresult[i].replace(" ", "")+'.jpg'f = open(name, "wb")f.write(r.content)f.close()

輸出結果

??

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

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

相關文章

什么是樂觀鎖?什么是悲觀鎖?

&#x1f512; 深入淺出&#xff1a;樂觀鎖 vs 悲觀鎖終極對決&#xff01;面試必考知識點詳解 各位CSDN的小伙伴們好呀&#xff01;&#x1f44b; 我是雪碧聊技術&#xff0c;今天給大家帶來高并發編程中的核心概念——樂觀鎖與悲觀鎖的深度解析&#xff01;&#x1f4bb; 無論…

HTML前端性能優化完整指南

圖片優化&#xff1a;性能優化的重中之重 重新審視圖片的必要性 在開始優化之前&#xff0c;首先需要思考一個根本問題&#xff1a;要實現預期的視覺效果&#xff0c;真的需要使用圖片嗎&#xff1f; 隨著Web技術的快速發展&#xff0c;許多以往只能通過圖片實現的效果&…

數據煉金術:用Python做智能數據整理員

數據煉金術&#xff1a;用Python做智能數據整理員 解鎖自動化魔法&#xff1a;文件批量重命名Excel智能清洗數據凈化全流程實戰 一、數據整理的困境與破局之道 你是否面臨這些數據噩夢場景&#xff1f; &#x1f9e9; ??混亂文件目錄??&#xff1a;最終版_報告_V4(1).doc…

HTML基礎P1 | HTML基本元素

HTML標簽標簽名放在<>中&#xff0c;如<body>大部分標簽成對出現&#xff0c;如<h1>為開始標簽&#xff0c;</h1>為其對應的結束標簽&#xff0c;少數標簽只有開始標簽&#xff0c;如換行標簽<br/>&#xff0c;成為"單標簽"有的標簽中…

LVS集群搭建

集群是為了解決某個特定問題將多臺計算機組合起來形成的單個系統知識點&#xff1a;1.關鍵術語&#xff1a;VS&#xff1a;Virtual Server&#xff08;調度器&#xff09;RS&#xff1a;Real Server&#xff08;真實服務器&#xff09;CIP&#xff1a;Client IP&#xff08;客戶…

吳恩達《AI for everyone》第一周課程筆記

課程的核心目標&#xff1a;- AI是什么&#xff1f; - AI能做什么&#xff1f; - AI最擅長什么類型的任務&#xff1f; - AI怎么做決策&#xff1f; - 企業為什么需要AI戰略&#xff1f;導航Machine Learning 機器學習> 最常見的機器學習類型&#xff1a; > 人工智能中最…

iOS App 電池消耗管理與優化 提升用戶體驗的完整指南

在當今智能手機的使用中&#xff0c;電池壽命和續航能力是用戶選擇App時的重要考慮因素之一。iOS設備的電池管理功能較為封閉&#xff0c;這也讓開發者、產品經理以及普通用戶對于App的電池消耗有時無法全面了解。而如果你的App因電池消耗過快而遭到用戶卸載&#xff0c;無論功…

關于用git上傳遠程庫的一些常見命令使用和常見問題:

克隆遠程庫gitee到本地用命令git clone git clone https://gitee.com/automated-piggy-senior/20250717-test.gitLinux/macOS 終端&#xff1a; 執行 touch readme.txt&#xff08;創建空文件&#xff09;&#xff0c;或 echo "這是說明文件" > readme.txt&#…

想刪除表中重復數據,只留下一條,sql怎么寫

PostgreSQL 方法: DELETE FROM tbl_case_model WHERE id NOT IN (SELECT MIN(id) -- 保留id最小的記錄FROM tbl_case_modelGROUP BYcolumn1, -- 替換為實際重復列名column2, -- 繼續添加重復列... -- [所有需要比較的列] );因為我這次遇到的情況比較特殊&#xff0…

微服務中token鑒權設計的4種方式

1. JWT鑒權 「概述」&#xff1a;JWT是一種用于雙方之間安全傳輸信息的簡潔的、URL安全的令牌標準。它基于JSON格式&#xff0c;包含三個部分&#xff1a;頭部&#xff08;Header&#xff09;、負載&#xff08;Payload&#xff09;和簽名&#xff08;Signature&#xff09;。J…

nodejs搭建

1.創建一個空文件夾&#xff0c;在vscode中打開 2.執行命令開啟package文件 npm init -y3.設置根目錄文件app.js 先執行 npm install express 命令安裝 express 模塊 執行 npm install cors 命令安裝 cors 模塊 // app.js const express require(express) const app express…

frp內網穿透(二)

frp內網穿透&#xff08;二&#xff09; 前言 前篇內網穿透 上面一文中已描述如何安裝frp進行內網穿透&#xff0c;并配置ssh穿透連接內網服務器&#xff0c;本篇主要介紹如何配置web服務 使用場景 A服務器為公網服務器&#xff0c;B服務器為家庭中內網服務器&#xff0c;且B…

Spring 應用中 Swagger 2.0 遷移 OpenAPI 3.0 詳解:配置、注解與實踐

從 Swagger 2.0 到 OpenAPI 3.0 的升級指南 為什么升級 OpenAPI 3.0提供了更強大的功能、更簡潔的配置和更好的性能&#xff0c;同時保持了與 Swagger 2.0 的基本兼容性。本文將詳細介紹升級的各個步驟&#xff0c;并提供代碼示例。 1. 依賴管理的變化 Swagger 2.0 依賴配置 &l…

用 Flink CEP 打造實時超時預警:從理論到實戰

目錄 1. Flink CEP 是什么?為什么它能讓你的數據“開口說話”? 2. 超時預警的業務場景:從電商到物聯網 3. Flink CEP 超時機制的核心原理 3.1 模式匹配與時間窗口 3.2 超時事件的處理 3.3 事件時間與水位線 3.4 核心組件一覽 4. 實戰案例:電商訂單超時預警 4.1 準備…

Rocky Linux 9 源碼包安裝php7

Rocky Linux 9 源碼包安裝php7大家好&#xff01;我是星哥。盡管現在 PHP 版本已迭代至 8.x&#xff0c;但有時為了兼容遺留系統或特定應用需求&#xff0c;我們仍需部署特定版本的 PHP。最主要的是之前的項目采用的PHP7.3&#xff0c;未來兼容舊的項目&#xff0c; 今天&#…

uniapp+vue3+鴻蒙系統的開發

前言&#xff1a; uniappvue3鴻蒙系統的開發。 實現效果&#xff1a; 鴻蒙pad端真機測試效果-下面是正常的日志效果 實現步驟&#xff1a; 1、安裝鴻蒙的開發工具&#xff0c;點擊安裝&#xff0c;注意版本不能太舊了 deveco-studio 2、下載下來是個壓縮包&#xff0c;解壓后…

【C++類和對象解密】面向對象編程的核心概念(下)

之前我們了解到構造函數是在對象實例化之時對對象完成初始化工作的一個函數。在我們不寫時&#xff0c;編譯器會自動生成構造函數。構造函數有一些特點&#xff0c;比如&#xff0c;他對內置類型不做處理&#xff0c;對自定義類型的成員會去調用其自身的構造。我們上篇文章還提…

Flutter基礎(前端教程①②-序列幀動畫)

&#x1f9e0; 核心思路總結??徹底繞過 Image組件重建帶來的性能瓶頸??&#xff1a;不再讓 setState重建包含 Image的 Widget 樹&#xff08;這是開銷大、可能導致閃爍的根源&#xff09;&#xff0c;改為使用底層畫布 (Canvas) 直接繪制預先處理好的圖像幀數據。好的&…

Qt添加dmp文件生成及pdb文件

1.Pdb文件生成 下圖先通過構建生成Pdb文件&#xff0c;然后運行程序&#xff0c;通過提前準備的崩潰按鈕使得程序崩潰&#xff0c;生成“dump文件”的演示。 # #添加dmp文件生成及pdb文件生成DEFINES QT_MESSAGELOGCONTEXT DEFINES QT_DEPRECATED_WARNINGS# # 添加DUMP文件…

opencv、torch、torchvision、tensorflow的區別

一、框架定位與核心差異PyTorch動態計算圖&#xff1a;實時構建計算圖支持Python原生控制流&#xff08;如循環/條件&#xff09;&#xff0c;調試便捷。學術主導&#xff1a;2025年工業部署份額24%&#xff0c;適合快速原型開發&#xff08;如無人機自動駕駛、情緒識別&#x…