在對Python有了必定的基礎學習後,進行貼吧圖片抓取小程序的編寫。html
要讓python能夠進行對網頁的訪問,那確定要用到urllib之類的包。So先來個 import urllib python
urllib中有 urllib.urlopen(str) 方法用於打開網頁並返回一個對象,調用這個對象的read()方法後能直接得到網頁的源代碼,內容與瀏覽器右鍵查看源碼的內容同樣。正則表達式
1 #coding:utf-8 2 import urllib 3 4 page = urllib.urlopen('http://tieba.baidu.com/p/1753935195')#打開網頁 5 htmlcode = page.read()#讀取頁面源碼 6 print htmlcode#在控制檯輸出
運行結果與查看源碼其實差很少小程序
運行結果就不放上來了瀏覽器
也能夠寫到文本文檔中:學習
1 #coding:utf-8 2 import urllib 3 4 page = urllib.urlopen('http://tieba.baidu.com/p/1753935195') 5 htmlcode = page.read() 6 #print htmlcode 7 8 pageFile = open('pageCode.txt','w')#以寫的方式打開pageCode.txt 9 pageFile.write(htmlcode)#寫入 10 pageFile.close()#開了記得關
運行一遍,txt就出如今了getJpg.py的目錄下url
好了別鬧,咱們把它封裝成方法:spa
1 def get_html(url): 2 page = urllib.urlopen(url) 3 html = page.read() 4 return html
而後咱們的頁面獲取代碼就K.O.了3d
作完上面步驟,你打開txt一看,我去!這都是什麼跟什麼啊,根本找不到圖片在哪好伐?code
客官別急啊,我這就去給你叫咱們的小。。。圖片!圖片!
首先咱們要一個正則表達式 (什麼你不會?請看菜鳥入門教程-->Go)
而後咱們看源代碼,Yeah 咱們找到了其中一張圖片是這樣的
寫出圖片的正則表達式: reg = r'src="(.+?\.jpg)" width'
解釋下吧——匹配以src="開頭而後接一個或多個任意字符(非貪婪),以.jpg" width結尾的字符串。好比圖中紅框內src後 雙引號裏的連接就是一個匹配的字符串。
接着咱們要作的就是從get_html方法返回的辣麼長一串字符串中 拿到 知足正則表達式的 字符串。
用到python中的re庫中的 re.findall(str) 它返回一個知足匹配的字符串組成的列表
1 # coding:utf-8 2 import urllib 3 import re 4 5 def get_html(url): 6 page = urllib.urlopen(url) 7 html = page.read() 8 return html 9 10 reg = r'src="(.+?\.jpg)" width'#正則表達式 11 reg_img = re.compile(reg)#編譯一下,運行更快 12 imglist = reg_img.findall(get_html('http://tieba.baidu.com/p/1753935195'))#進行匹配 13 for img in imglist: 14 print img
打印出這麼多圖片連接
光把連接拿出來沒用啊,咱們的目標是下載下來~
urllib庫中有一個 urllib.urlretrieve(連接,名字) 方法,它的做用是以第二個參數爲名字下載連接中的內容,咱們來試用一下
在上面代碼循環中加上 urllib.urlretrieve(img, 'tieba.jpg')
臥槽!!!怎麼只下了一張
至少它下載了不是?啪啪啪啪啪(掌聲)
檢查下問題出在哪。。。。
沒錯咱們只給了一個tieba.jpg的名字,後來的把前面的覆蓋了。
調整下代碼:
1 # coding:utf-8 2 import urllib 3 import re 4 5 def get_html(url): 6 page = urllib.urlopen(url) 7 html = page.read() 8 return html 9 10 reg = r'src="(.+?\.jpg)" width' 11 reg_img = re.compile(reg) 12 imglist = reg_img.findall(get_html('http://tieba.baidu.com/p/1753935195')) 13 x = 0 14 for img in imglist: 15 urllib.urlretrieve(img, '%s.jpg' %x) 16 x += 1
啪啪啪啪啪
第一步完成~
我想要抓另外一個帖子,總不能打開源代碼,而後把那段地址改了在運行吧。
只是一個小程序,那也不行欸,加一個讓用戶指定地址的交互。
先把提取圖片的那段代碼打包下:
1 def get_image(html_code): 2 reg = r'src="(.+?\.jpg)" width' 3 reg_img = re.compile(reg) 4 img_list = reg_img.findall(html_code) 5 x = 0 6 for img in img_list: 7 urllib.urlretrieve(img, '%s.jpg' % x) 8 x += 1
最後來個請輸入:
1 print u'請輸入url:', 2 url = raw_input() 3 if url: 4 pass 5 else: 6 url = 'http://tieba.baidu.com/p/1753935195' 7 html_code = get_html(url) 8 get_image(html_code)
運行一下,試試另外一個帖子:
完美~~
雖然寫的是一個簡單的小程序,但有強迫症的我仍是給他加上了交互(否則多難受啊:雙擊,屏幕一閃,下載完了。。。)
最後的代碼
1 # coding:utf-8 2 import urllib 3 import re 4 5 def get_html(url): 6 page = urllib.urlopen(url) 7 html_code = page.read() 8 return html_code 9 10 def get_image(html_code): 11 reg = r'src="(.+?\.jpg)" width' 12 reg_img = re.compile(reg) 13 img_list = reg_img.findall(html_code) 14 x = 0 15 for img in img_list: 16 urllib.urlretrieve(img, '%s.jpg' % x) 17 x += 1 18 19 print u'-------網頁圖片抓取-------' 20 print u'請輸入url:', 21 url = raw_input() 22 if url: 23 pass 24 else: 25 print u'---沒有地址輸入正在使用默認地址---' 26 url = 'http://tieba.baidu.com/p/1753935195' 27 print u'----------正在獲取網頁---------' 28 html_code = get_html(url) 29 print u'----------正在下載圖片---------' 30 get_image(html_code) 31 print u'-----------下載成功-----------' 32 raw_input('Press Enter to exit')
相對來講比較舒服的交互體驗,大功告成~
參考連接:https://www.cnblogs.com/Axi8/p/5757270.html