Python爬蟲08_Requests聚焦批量爬取圖片

一、Requests聚焦批量爬取圖片

import re
import requests
import os
import timeurl = 'https://www.douban.com/'
userAgent = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0'}#獲取整個瀏覽頁面
page_text = requests.get(url=url,headers=userAgent).text#提取圖片鏈接,分兩次特征提取并合并至一個列表中
ex1 = re.compile(r'<img src="(.*?)" data-origin="')
ex2 = re.compile(r'" data-origin="(.*?)" alt.*?')
img_data1 = ex1.findall(page_text)
img_data2 = ex2.findall(page_text)
#合并至一個列表中
for one in img_data2:img_data1.append(one)#設定圖片存儲路徑,判斷路徑是否存在,不存在則自動創建
if not os.path.exists('E:/Reptile/douban'):os.mkdir('E:/Reptile/douban')#循環向列表中的圖片鏈接發起請求并保存圖片
for two in img_data1:ex3 = re.compile(r'^http')#判斷以http開頭的鏈接才會發起get請求if ex3.findall(two):#設定圖片保存名字,以時間戳方式進行命名photo_time1 = time.time() + 1photo_time2 = str(photo_time1)#通過圖片所在鏈接發起get請求,并偽裝UAphoto_data = requests.get(two,headers=userAgent).content#提取原圖片的后綴名,采用字符串分割方式photo_extension = two.split('.')[-1]#設定圖片的最終文件名photo_names = photo_time2 + '.' + photo_extension#設定圖片的最終保存位置photo_path = 'E:/Reptile/douban/' + photo_names#保存圖片with open(photo_path,'wb') as fp:fp.write(photo_data)print(photo_names,"下載成功!!!")
print('爬取結束,over!!!')

二、批量爬取圖片方式正則匹配解析

采用正則表達式,提取頁面中所包含的所有圖片鏈接,正則表達式采用re庫,解析如下:
1、必備模塊與基本調用

import re# 1. 一次性匹配
m = re.search(r'(\d{4})-(\d{2})-(\d{2})', '2025-08-05')
if m:print(m.group(0))   # 2025-08-05print(m.group(1))   # 2025# 2. 預編譯(推薦,速度快、可復用)
pat = re.compile(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
m = pat.search('2025-08-05')
print(m.groupdict())   # {'year': '2025', 'month': '08', 'day': '05'}# 3. 全局查找
pat.findall('2025-08-05, 2026-12-30')   # [('2025','08','05'), ('2026','12','30')]# 4. 全局替換
new = pat.sub(r'\2/\3/\1', '2025-08-05')  # 08/05/2025

2、常見函數對照表

需求一次性預編譯對象方法
搜索第一個匹配re.search()p.search()
從頭開始必須完全匹配re.match()p.match()
找到所有匹配(列表/迭代器)re.findall()p.findall()
找到所有 match 對象re.finditer()p.finditer()
拆分字符串re.split()p.split()
替換re.sub() / re.subn()p.sub() / p.subn()
3、重點語法速記
1.基本元字符
. 任意字符,^ 開頭,$ 結尾,* 0 次或多次,+ 1 次或多次,? 0/1 次或“非貪婪”。
2.字符集與反義
[abc][^abc]、\d = [0-9]、\w = [A-Za-z0-9_]、\s 空白。
3.分組 / 捕獲
(...) 捕獲,(?:...) 不捕獲,(?P<name>...) 命名組。
4.非貪婪
在 *, +, ?, {m,n} 后面加 ? 即可。
5.斷言(零寬)
(?=...) 正向前瞻,(?!...) 負向前瞻,(?<=...) 正向后瞻,(?<!...) 負向后瞻。
6.修飾符(flag)
re.I 忽略大小寫,re.M 多行,re.S 讓 . 匹配換行,re.X 寫注釋。

4、場景示例
取 HTML 屬性(之前你問的兩個正則)

# 假設 html 是抓取到的網頁源碼
html = '<img src="a.jpg" data-origin="b.png" alt="pic">'ex1 = re.compile(r'<img src="(.*?)" data-origin="')
ex2 = re.compile(r'" data-origin="(.*?)" alt.*?')src = ex1.search(html).group(1)       # a.jpg
data_origin = ex2.search(html).group(1)  # b.png

更安全寫法(防止屬性順序變化):

src        = re.search(r'<img\b[^>]*\bsrc="([^"]*)"', html).group(1)
data_orig  = re.search(r'<img\b[^>]*\bdata-origin="([^"]*)"', html).group(1)

校驗手機號

phone_re = re.compile(r'^1[3-9]\d{9}$')
phone_re.fullmatch('13800138000')   # <re.Match object>

解析日志

log = '2025-08-05 12:00:01 ERROR module.py:42 division by zero'
pattern = re.compile(r'(?P<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 'r'(?P<level>\w+) 'r'(?P<file>\S+):(?P<line>\d+) 'r'(?P<msg>.+)'
)
m = pattern.match(log)
print(m.groupdict())
# {'time': '2025-08-05 12:00:01',
#  'level': 'ERROR',
#  'file': 'module.py',
#  'line': '42',
#  'msg': 'division by zero'}

替換文本中的郵箱為 [EMAIL]

re.sub(r'\b[\w.-]+@[\w.-]+\.\w+\b', '[EMAIL]', 'Contact: foo@bar.com')
# 'Contact: [EMAIL]'

切割不規則空白

re.split(r'\s+', 'a  b\tc\n d')   # ['a', 'b', 'c', 'd']

多行模式提取代碼塊

code = '''
```python
print('hi')

5、調試技巧

  • re.DEBUG 看編譯過程:
    re.compile(r'(a|b)*c', re.DEBUG)

  • 在線可視化:regex101.com(選 Python flavor)

  • 在 Python 中打印 pattern:
    print(pat.pattern) 查看原始表達式。

6. 常見坑提醒

  1. 貪婪 vs 非貪婪:
    .*? 只在需要時才加,否則可能匹配過度或性能差。

  2. 反斜杠地獄:
    在普通字符串里需寫 \\d,推薦用原始字符串 r'\d'

  3. 多行字符串用 re.S
    否則 . 匹配不到換行。

  4. 大文本慎用 findall(),用 finditer() 迭代器更省內存。

7. 一句話總結

“先 import re,再 compile,search/match 取 group,findall 得列表,sub 做替換,flag 調行為。”

—— 背住這 30 秒口訣,90 % 的正則問題都能快速拆掉。

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

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

相關文章

Spring Cloud系列—簡介

目錄 1 單體架構 2 集群與分布式 3 微服務架構 4 Spring Cloud 5 Spring Cloud環境和工程搭建 5.1 服務拆分 5.2 示例 5.2.1 數據庫配置 5.2.2 父子項目創建 5.2.3 order_service子項目結構配置 5.2.4 product_service子項目結構配置 5.2.5 服務之間的遠程調用 5.…

【普中STM32精靈開發攻略】--第 1 章 如何使用本攻略

學習本開發攻略主要參考的文檔有《STM32F1xx 中文參考手冊》和《Cortex M3權威指南(中文)》&#xff0c;這兩本都是 ST 官方手冊&#xff0c;尤其是《STM32F1xx 中文參考手冊》&#xff0c;里面包含了 STM32F1 內部所有外設介紹&#xff0c;非常詳細。大家在學習 STM32F103的時…

【Docker】RK3576-Debian上使用Docker安裝Ubuntu22.04+ROS2

1、簡述 RK3576自帶Debian12系統,如果要使用ROS2,可以在Debian上直接安裝ROS2,缺點是有的ROS包需要源碼編譯;當然最好是使用Ubuntu系統,可以使用Docker安裝,或者構建Ubuntu系統,替換Debian系統。 推薦使用Docker來安裝Ubuntu22.04,這里會有個疑問,是否可以直接使用Do…

解決docker load加載tar鏡像報json no such file or directory的錯誤

在使用docker加載離線鏡像文件時&#xff0c;出現了json no such file or directory的錯誤&#xff0c;剛開始以為是壓縮包拷貝壞了&#xff0c;重新拷貝了以后還是出現了問題。經過網上查找方案&#xff0c;并且自己實踐&#xff0c;采用下面的簡單方法就可以搞定。 歸結為一句…

《協作畫布的深層架構:React與TypeScript構建多人實時繪圖應用的核心邏輯》

多人在線協作繪圖應用的構建不僅是技術棧的簡單組合,更是對實時性、一致性與用戶體驗的多維挑戰。基于React與TypeScript開發這類應用,需要在圖形繪制的基礎功能之外,解決多用戶并發操作的同步難題、狀態回溯的邏輯沖突以及大規模協作的性能瓶頸。每一層架構的設計,都需兼顧…

智慧社區(八)——社區人臉識別出入管理系統設計與實現

在社區安全管理日益智能化的背景下&#xff0c;傳統的人工登記方式已難以滿足高效、精準的管理需求。本文將詳細介紹一套基于人臉識別技術的社區出入管理系統&#xff0c;該系統通過整合騰訊云 AI 接口、數據庫設計與業務邏輯&#xff0c;實現了居民出入自動識別、記錄追蹤與訪…

嵌入式開發學習———Linux環境下IO進程線程學習(四)

進程相關函數fork創建一個子進程&#xff0c;子進程復制父進程的地址空間。父進程返回子進程PID&#xff0c;子進程返回0。pid_t pid fork(); if (pid 0) { /* 子進程代碼 */ } else { /* 父進程代碼 */ }getpid獲取當前進程的PID。pid_t pid getpid();getppid獲取父進程的P…

標記-清除算法中的可達性判定與Chrome DevTools內存分析實踐

引言 在現代前端開發中&#xff0c;內存管理是保證應用性能與用戶體驗的核心技術之一。作為JavaScript運行時的基礎機制&#xff0c;標記-清除算法(Mark-and-Sweep) 通過可達性判定決定哪些內存需要回收&#xff0c;而Chrome DevTools提供的Memory工具則為開發者提供了深度的內…

微算法科技(NASDAQ:MLGO)基于量子重加密技術構建區塊鏈數據共享解決方案

隨著信息技術的飛速發展&#xff0c;數據已成為數字經濟時代的核心生產要素。數據的共享和安全往往是一對難以調和的矛盾。傳統的加密方法在面對日益強大的計算能力和復雜的網絡攻擊時&#xff0c;安全性受到了挑戰。微算法科技(NASDAQ&#xff1a;MLGO)通過引入量子重加密技術…

FastAPI快速入門P2:與SpringBoot比較

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄引言1 FastAPI事件管理2 類的使用2.1 初始化方法對…

SAP-ABAP: Open SQL集合函數COUNT(統計行數)、SUM(數值求和)、AVG(平均值)、MAX/MIN(極值)深度指南

SAP Open SQL集合函數深度指南 1. 核心價值與特性函數作用關鍵特性COUNT統計行數用COUNT(*)包含NULL值行&#xff0c;COUNT(字段)排除NULLSUM數值求和自動過濾NULL值&#xff0c;結果類型與源字段相同AVG平均值必須用TYPE f接收&#xff0c;否則四舍五入導致精度丟失MAX/MIN極值…

【docker】UnionFS聯合操作系統

Linux 的 Namespace、CGroups 和 UnionFS 三大技術支撐了 Docker 的實現。 一、為什么需要聯合文件系統&#xff1f;在傳統操作系統中&#xff0c;每個文件系統都是獨立的孤島。但當我們需要&#xff1a;合并多個目錄的內容保持基礎系統不變的同時進行修改高效共享重復文件內容…

CTF-XXE 漏洞解題思路總結

一、XXE 漏洞簡介XXE (XML External Entity) 漏洞允許攻擊者通過構造惡意的 XML 輸入&#xff0c;強迫服務器的 XML 解析器執行非預期的操作。在 CTF 場景中&#xff0c;最常見的利用方式是讓解析器讀取服務器上的敏感文件&#xff0c;并將其內容返回給攻擊者。二、核心攻擊載荷…

GitLab:一站式 DevOps 平臺的全方位解析

GitLab&#xff1a;一站式 DevOps 平臺的全方位解析 在當今數字化時代&#xff0c;軟件研發的效率與質量直接決定企業的市場競爭力。GitLab 作為全球領先的 DevOps 平臺&#xff0c;憑借 “從構思到部署” 的全流程管理能力&#xff0c;已成為無數企業加速軟件交付的核心工具。…

Flink富函數:一種更靈活、可擴展的方式來定義數據流的處理邏輯

本文重點 Flink中的富函數類是一組用于處理數據流的函數接口和實現類。富函數類提供了一種更靈活和可擴展的方式來定義數據流的處理邏輯。 富函數類 富函數類是DataStream API提供的一個函數類的接口,所有的Flink函數類都有其Rich版本。富函數類一般是以抽象類的形式出現的。…

【STM32】HAL庫中的實現(四):RTC (實時時鐘)

&#x1f552;HAL庫中的實現&#xff1a;RTC&#xff08;Real-Time Clock&#xff09;實時時鐘RTC 是 STM32 的低功耗實時時鐘模塊&#xff0c;常用于&#xff1a; 實時時間維護&#xff08;年月日時分秒&#xff09;定時喚醒日志時間戳鬧鐘功能RTC&#xff08;實時時鐘&#x…

Pauli 矩陣指數函數展開為顯式矩陣 e^A -> B

要展開表達式 為普通矩陣&#xff0c;其中 是 Pauli 矩陣&#xff0c; 是單位向量&#xff0c; 是實數。以下是詳細推導步驟&#xff1a;1. Pauli 矩陣的性質Pauli 矩陣定義為&#xff1a;它們滿足以下關系&#xff1a;?其中 是 Kronecker delta&#xff0c;? 是 Levi-…

【Algorithm | 0x03 搜索與圖論】DFS

DFS基礎知識典型例題例1&#xff1a;n皇后問題例2&#xff1a;拍照例3&#xff1a;理發基礎知識 核心原理&#xff1a;一條路走到黑 示意圖&#xff1a;其含義表示&#xff0c;在這個圖中頂層是第0層&#xff0c;也就是后面dfs的入口&#xff0c;一般從dfs(0)開始操作。 模版&a…

Redis的數據過期策略有哪些?

Redis內部通過兩種主要策略來處理過期的Key&#xff1a; 惰性刪除 惰性刪除&#xff1a;顧明思議并不是在TTL到期后就立刻刪除&#xff0c;而是在訪問一個key的時候&#xff0c;Redis會先檢查這個鍵是否過期。如果過期&#xff0c;就刪除它&#xff0c;然后返回nil。 這種方式非…

水庫雨水情測報和大壩安全監測系統解決方案

一、方案背景 在全球氣候變化和極端天氣頻發的背景下&#xff0c;水庫作為重要的水利設施&#xff0c;承擔著防洪、供水、灌溉、發電等多重功能。然而&#xff0c;由于水庫蓄水量巨大&#xff0c;一旦發生潰壩或運行異常&#xff0c;將對下游地區造成不可估量的生命財產損失。因…