首頁 > 軟體

Python爬蟲實踐:30行程式碼實現爬取網站圖片,案例分享篇

2021-03-19 22:00:29

關注我,每天分享軟體測試技術乾貨、面試經驗,想要領取測試資料、進入軟體測試學習交流群的可以直接私信我哦~~

Python作為一門高階程式語言,它的定位是優雅、明確和簡單。我學用python差不多一年時間了,用得最多的還是各類爬蟲指令碼:寫過抓代理本機驗證的指令碼,寫過論壇中自動登入自動發貼的指令碼,寫過自動收郵件的指令碼,寫過簡單的驗證碼識別的指令碼。

這些指令碼有一個共性,都是和web相關的,總要用到獲取連結的一些方法,故累積了不少爬蟲抓站的經驗,在此總結一下,那麼以後做東西也就不用重複勞動了。

下面分享一個小案例,實現爬取網站裡面的圖片,包括源碼及實現思路。

一、還原手工操作

所謂爬取頁面圖片,正常人手動操作可以分為兩步:

1.開啟頁面

2.選中圖片下載到指定資料夾

用程式碼實現的話可以節省掉每次下載圖片的操作,運行程式碼實現批量下載。

二、設計程式碼實現

步驟一:匯入相關庫操作

import urllib #匯入urllib包

import urllib.request#匯入urllib包裡的request方法

import re #匯入re正則庫

步驟二:定義解析頁面 load_page()

這個函數實現開啟傳入的路徑並將頁面資料讀取出來,實現程式碼,包括髮送請求,開啟頁面,獲取資料。

程式碼實現:

def load_page(url):

request=urllib.request.Request(url)#傳送url請求

response=urllib.request.urlopen(request)#開啟url網址

data=response.read()#讀取頁面資料

return data#返回頁面資料

步驟三:定義get_image()函數

首先利用正則表示式匹配圖片路徑並存到陣列中。

其次遍歷陣列實現圖片下載操作。

程式碼實現:

def get_image(html):

regx=r'http://[S]*jpg' #定義正則匹配公式

pattern=re.compile(regx)#構造匹配模式,速度更快

get_image=re.findall(pattern,repr(html))#repr()將內容轉化為字元串形式,findall列表形式展示正則表示式匹配的結果

num=1 #定義變數控制迴圈

for img in get_image: #定義變數遍歷陣列

image=load_page(img)#將圖片路徑傳入載入函數

with open('F:photo%s.jpg'%num,'wb') as fb: #以只讀方式開啟圖片並命名

fb.write(image) #寫入內容

print('正在下載第%s張圖片'%num)

num=num+1 #變數遞增

print("下載完成")

步驟四:函數呼叫

#呼叫函數

url='http://p.weather.com.cn/2019/10/3248439.shtml' #傳入url路徑

html=load_page(url)#載入頁面

get_image(html)#圖片下載

關鍵單詞釋義

如果第一次接觸爬蟲程式碼,相信有幾個單詞大家很陌生,為了方便記憶我把他們歸類到一起加深印象,你也可以拿出一張白紙試著努力回憶著。

1.爬蟲協議庫ulrlib、urllib.request

2.正則匹配庫rb

3.傳送請求方法request()

4.開啟頁面方法urlopen()

5.讀取資料方法read()

6.正則表示式-所有圖片【S】*.jpg

7.匹配模式定義compile()

8.查詢匹配findall()

9.迴圈遍歷語句 for a in b

10.開啟檔案 並命名 with open()... as fb

11.寫到... write*()

12.輸出語句 print()

到現在為止可以把我上面的程式碼在pycharm中開啟嘗試著運行起來吧!

最後,有2個報錯資訊彙總供參考:

1. module 'urllib' has no attribute 'requset'

定位到當行語句,發現request 單詞拼寫錯誤。

2. 沒有報錯,但是圖片沒有下載成功

重新檢查程式碼,發現正則表示式寫的有錯誤,記住是大寫的S修改完之後看效果。


IT145.com E-mail:sddin#qq.com