利用python3.x實現小爬蟲下載貼吧內圖片


Hi, I'm back.

 
寒假在家只有一台筆記本,也懶得把台式機上的鍵盤拆下來用,因此編程被我暫時擱置,轉而在網易雲課堂上學了一下Python。可惜的是雲課堂的Python教程是基於Python2.x,而且更加悲劇的是我在網上買的《Python核心編程》也是基於Python2.x的。而我本着學新不學舊的原則,腦子一抽安裝了Python3.4,導致我學着編寫示例代碼的時候總是小心翼翼生怕踩到雷區。不過私以為學2.x寫3.x等於是把兩個版本都學了一下,還是有點好處的。
 
回到學校之后學着視頻里寫了一個小腳本,功能很簡單,就是下載貼吧圖片帖內所有的圖片到指定的文件夾。先上代碼:
import re import urllib.request # ------ 獲取網頁源代碼的方法 ---
def getHtml(url): page = urllib.request.urlopen(url) html = page.read() return html # ------ getHtml()內輸入任意帖子的URL ------
html = getHtml("http://tieba.baidu.com/p/3205263090") # ------ 修改html對象內的字符編碼為UTF-8 ------
html = html.decode('UTF-8') # ------ 獲取帖子內所有圖片地址的方法 ------
def getImg(html): # ------ 利用正則表達式匹配網頁內容找到圖片地址 ------
    reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"' imgre = re.compile(reg); imglist = re.findall(imgre, html) return imglist imgList = getImg(html) imgName = 0 for imgPath in imgList: # ------ 這里最好使用異常處理及多線程編程方式 ------
    f = open("pic/"+str(imgName)+".jpg", 'wb') f.write((urllib.request.urlopen(imgPath)).read()) f.close() imgName += 1

print("All Done!")

 

先總結一下在編寫過程中被“坑”的地方(Python:怪我咯?)
1.urllib在Python3.x中發生了改變,按照這份腳本來說,原本在urllib下的urlopen()方法現在在urllib.request下。
2.必須修改html對象內的字符編碼,因為獲取的字符都是以字節形式保存在對象中(因此圖片可以直接通過read()方法保存在文件中)。
3.正則表達式修改了好幾次,這個下面說。
4.Python中沒有i++這種寫法,所以"pic/"+str(++imgName)+".jpg"沒有效果。
 
(以下為廢話,如果你是百度這份代碼直接使用的話下面的內容可以忽略)
說一下和正則表達式“斗智斗勇”的過程。
貼吧中圖片標簽內是這么寫的
<img class="..." src="..." pic_ext="jpeg" ...>

一開始我的想法很簡單,正則表達式如下

reg = r'src="(.*\.jpg)" pic="jpeg"'

因為“.”這個元操作符會匹配換行符外所有字符,因此當爬到格式為png或者gif的圖片的時候也會匹配,差不多就是下面這種效果:

[..., 'http://.....png" ....... <src="...jpg"']
簡單來說就是會從無關圖片的“src”一直匹配到我需要下載的圖片的末尾“pic="jpeg"”
解決的辦法就是匹配到空格的時候就忽略,所以要將“.”和“\S”放在同一個字符類中,要么匹配除了空白符之外的所有字符,要么忽略。
 
小彩蛋時間,這是我下載到的所有圖片(逃


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM