2021-05-12 14:32:11
Python爬蟲實踐:30行程式碼實現爬取網站圖片,案例分享篇
關注我,每天分享軟體測試技術乾貨、面試經驗,想要領取測試資料、進入軟體測試學習交流群的可以直接私信我哦~~
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修改完之後看效果。
相關文章