1. 程式人生 > >Python爬蟲(二)“我想要很多很多的表情包”

Python爬蟲(二)“我想要很多很多的表情包”

Python爬蟲之二:“我想要很多很多的表情包”

哈哈hhh,標題寫的神神經經的不知所云,其實這是一個關於圖片抓取的小運用程式。

一、前期準備

        開啟百度貼吧中的“表情包吧”-->"http://tieba.baidu.com/p/5059180075",這是我們的表情包來源。開啟開發者除錯,抓取一張圖片,其實就是一個<img>標籤: <img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=a4d059db24f5e0feee1889096c6234e5/6652f8deb48 f8c54c02193ed33
292df5e1fe7f01.jpg" size="15478" width="262" height="251"> 我們要做的就是抓取頁面的所有的圖片的 src 資源路徑: src="https://imgsa.baidu.com/forum/w%3D580/sign=a4d059db24f5e0feee1889096c6234e5/6652f8deb48f8c54c02193ed33292df5e1fe7f01.jpg
        我們首先運用正則表示式把頁面的所有<img>標籤篩選出來。關於"爬蟲",我的理解是根據我們的需求從網頁中找到我們需要的內容,如果用字串匹配的話if-else夠我們寫到天荒地老了(不信你可以寫個demo識別一個字串如"-12.3"等是不是數字看看),所以正則表示式
在爬蟲中起了至關重要的作用,然而要用好正則表示式並沒有那麼簡單,一個美式笑話"When you find a problem can use regular expressions to solve, so you have two problems"。
        Python的正則表示式使用方法封裝在了re模組裡,在程式裡 import 進來就可以用了。         先說在html檔案裡匹配<img>標籤的正則表示式怎麼寫吧:r'<img class="BDE_Image".*?src="([^"]*\.jpg)"' 解釋一下,同一個頁面的同類型的img標籤,按正常的寫法『<img class="BDE_Image"』這一部分是固定的了,接續還有src屬性,width屬性,height屬性等(順序不一定固定),除了src 屬性都不是我們關心的內容,直接用“萬用字元”『.*?』匹配就好了(『.』 表示匹配除了換行符外的任何字元;『*?』這裡是指匹配前面的『.』 零次或多次,非貪婪模式);關鍵是寫好src屬性的匹配:『src="(
[^"]*\.jpg)"
』,其中『[^"]』指生成一個字元類(一個字元集合,可以匹配集合裡的任一字元),『^』是脫字元,這裡指的是取反,也就是生成的字元類裡包含除了『"』的所有字元,『*』指匹配前面的『[^"]』 零次或多次。還有提高效率的一點是用小括號『()』將圖片的地址括起來進行分組,因為我們用正則表示式模式物件的findall()方法時,會找到所有匹配的內容,並將它們組織成列表返回,像
[<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=a4d059db24f5e0feee1889096c6234e5/6652f8deb48 f8c54c02193ed33292df5e1fe7f01.jpg" size="15478" width="262" height="251">,<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=6fe64e07e9fe9925cb0c695804aa5ee4/3addbf8f8c5494eea5d059db24f5e0fe98257e01.jpg" size="27450" width="338" height="600"> .....]這樣的列表,而我們需要的只是圖片的地址,所以我們還要在裡邊把圖片的地址給提取出來,子組很方便就解決了這一問題:因為在findall()方法中,如果給出的正則表示式包含了一個或者多個子組,就會返回子組中匹配的內容,如果存在多個子組,那麼它還會將匹配的內容組合成元組的形式再返回。這裡只有一個元組,所以返回的自然就是圖片的地址了。

二、.py程式

程式也很簡短,30行程式碼,沒辦法,“人生苦短,我用Python!”。
結果就是我們用30行程式碼換來了500多張表情圖,媽媽再也不用擔心我和你們鬥圖了!