通過python進行單網頁內圖片爬取及下載
通過python進行單網頁內圖片爬取及下載
一、前言
我作為因為興趣而剛入門python不久的新手,當初學python的小目標就是爬取知乎上各種各樣好看的圖片,上個月學會了python基本語法後,這個月前幾周一直在上課+考試+課程設計比較忙,只是用閑暇時間看python入門的書籍,後來又了解到想做爬蟲需要用到正則表達式和HTML的知識,所以也看了這方面的書,但那段時間並沒有實際編程,直到這周一課程設計結束才開始真正編寫python爬蟲,到現在終於可以爬取下載單個網頁的圖片了!
在學習的過程中,我分別嘗試爬取了百度貼吧、知乎、CSDN博客,發現了一些不同之處,所以想寫下來作為學習心得,與大家共享。
(第一次寫與python有關的文章,由於對HTML語言僅為初學,有些關於HTML的措辭可能不對,歡迎指正)
在這篇文章中,我想討論的是:
利用python進行單網頁內圖片爬取及下載過程中:
1. 圖片爬取步驟
2.解析網站代碼的方式:
2.1正則表達式解析
2.2Beautiful soup模塊解析
2.3Beautiful soup模塊內搭配正則表達式
3.下載圖片:
3.1利用正則表達式識別圖片後綴名
4.推薦書籍、教程
二、正文
1,圖片爬取步驟
(用到模塊:urllib、urllib.request 、re、BeautifulSoup)
1, 使用urllib.request.urlopen()獲得網頁源代碼
2, 使用解析工具解析網頁源代碼,獲得圖片網址
3, 使用urllib.request.urlretrieve()下載圖片
我使用的python版本是python3.6。
怎樣用python爬取圖片並下載,很多視頻教程和博客上都有詳細的指導,在此就不贅述啦,感覺我也不太擅長寫教程。
2,解析網站代碼的方式
在學習python基礎語法時就聽說如果要做爬蟲,正則是要會的,那時還不知道有Beautifulsoup,就從圖書館借了本有關正則表達式的書看了起來,很薄的書每天帶著也不累(我會推薦在最後的參考書籍里)。但是也因為天天上課而沒有實踐正則,這幾天才有時間真正敲字元進行模式匹配,感覺正則很好用,Beautiful soup則是後來看視頻學到的。
2.1 正則表達式解析
爬取到網頁源代碼後,就可以用正則匹配出和圖片有關的節點。
節點示例:(來源貼吧)
<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=1d16f7798544ebf86d716437e9f8d736/823fb13533fa828bd0685399ff1f4134970a5a06.jpg"pic_ext="jpeg" changedsize="true" width="560" height="882">
我的正則匹配模式:
pat = re.compile(r<img class="BDE_Image".+?"(.+?)".+?>)images = re.findall(pat, html)
變數imges為一個列表,包含所有匹配成功內容中」()」內的部分,在其中以字元串形式保存。
這樣既能找到節點,括弧內又能返回我想要的圖片網址。
2.2 Beautiful soup模塊解析
節點示例同上文,這次用Beautifulsoup里的findall函數來提取標籤
函數用法:
soup = BeautifulSoup(html,"html.parser")imges = soup.find_all(img,class_ = "BDE_Image")
變數imges為一個包含所有節點的列表,節點在其中以字元串形式保存。
2.3 Beautiful soup模塊內搭配正則表達式
後來了解到,Beautiful soup內也可以搭配正則表達式來使用,因此我們可以將上一個函數修改為:
soup = BeautifulSoup(html,"html.parser")img = soup.find_all(img,class_ = re.compile(r[A-Z]_[a-z]))
感覺更靈活了哈哈
3.下載圖片
<img data-rawwidth="1136" data-rawheight="2048" src="https://pic4.zhimg.com/f780e74dea857dfa2529c6380dc21793_b.jpg" class="origin_image zh-lightbox-thumb lazy" data-original="https://pic4.zhimg.com/f780e74dea857dfa2529c6380dc21793_r.jpg" data-actualsrc="https://pic4.zhimg.com/f780e74dea857dfa2529c6380dc21793_b.jpg" width="1136">
基本上各個網站圖片都類似上圖(來源知乎)這樣,以img作為標籤,包含寬度、高度
,並在src屬性中包含圖片的url,與百度貼吧的不同之處在於,知乎的圖片節點中還包括一項data-original屬性,而其包含的url為圖片原圖的url(當爬取桌面壁紙時,通過src屬性與data-original屬性的值下載的圖片差別會很明顯)。
src屬性所對應的圖片全部是.jpg格式,所以下載時只需要在文件路徑後加上.jpg就可以了。而data-original屬性即原圖中圖片格式較多,不一而全,可以用正則表達式匹配出url末尾的圖片格式並放入urllib.request.urlretrieve()函數的路徑參數中,使每一張圖片下載後不至於因格式不同而出現問題。
具體代碼如下:
pat = re.compile(r.+?com/.+?(.[a-z]+))reg = re.findall(pat,images_url)suffix = "".join(reg)urllib.request.urlretrieve(images_url, filename +\+ str(i) + suffix)
(其中srt(i)是對圖片的編號,在for循環中讀入url並下載,i每循環遞增)
4,參考書籍
共4本,都是我自己在看或看完的覺得很好的書,附豆瓣截圖。
《像計算機科學家一樣思考Python》
《學習正則表達式》
《Python編程》
《白話大數據與機器學習》
這本書是這學期平常沒有事情又學不進專業書籍時看的,別看書名叫白話,實際裡面介紹完了後就開始上數學公式或用法,這學期學了一門課,名字是數值分析方法,裡面有一些公式倒是在這本書里看到實際用法了。
感覺像是大數據與機器學習的科普書,我是通過它對大數據和機器學習有了一個初步的認識。對了,裡面的代碼時python寫的。
像大數據、機器學習、圖像識別等都是近些年新興的領域,我雖初學乍道,卻也很想了解下它們。
三、寫在最後
當然,還有一些沒有實現的問題,這些將是我繼續學習的目標:
1, 知乎一個問題下有多個回答,如何識別多個回答並依次爬取。
2, 通過cookies模擬登錄知乎。
3, 代碼封裝問題。
本篇文章禁止轉載,同時發表在我的CSDN博客
歡迎關注
推薦閱讀: