天天一個小程序—0013題(爬圖片+正則表達式 or BeautifulSoup)

第 0013 題: 用 Python 寫一個爬圖片的程序,爬 這個連接裏的日本妹子圖片 :-)html

 

關於python3的urllib模塊,能夠看這篇博客:傳送門python

首先是用urlopen打開網站而且獲取網頁內容,經過查看網頁源代碼,能夠很容易的發現圖片的格式都是差很少的,因此用正則表達式來匹配便可。web

 

 1 from urllib import request  2 import re  3 
 4 def get_pic():  5     web = request.urlopen(r'http://tieba.baidu.com/p/2166231880')  6     page = web.read()  7     page = page.decode()  8 
 9     regex = re.compile(r'<img.*?class="BDE_Image" src="(.*?)".*?>') 10     pic = re.findall(regex, page) 11     return pic 12 
13 def save(save_pic): 14     path = 'D:\python\project\爬蟲結果'
15     count = 0 16     for pic in save_pic: 17         request.urlretrieve(pic, '%s/%s.jpg' % (path, count)) 18         count += 1
19 
20 pic = get_pic() 21 save(pic)

 

以後我又用BeautifulSoup模塊來進行了爬圖,這個方法確實簡單多了。這位博主對於BeautifulSoup的介紹十分不錯:傳送門正則表達式

 1 from bs4 import BeautifulSoup  2 from urllib import request  3 
 4 url = 'http://tieba.baidu.com/p/2166231880'
 5 path = 'D:\python\project\爬蟲結果'
 6 
 7 page = request.urlopen(url).read()  8 page = page.decode()  9 
10 soup = BeautifulSoup(page, 'lxml') 11 count = 0 12 
13 pic_list = soup.findAll("img", class_ = 'BDE_Image') 14 for pic in pic_list: 15     pic = pic['src']   #獲取列表中的src內容
16     request.urlretrieve(pic, '%s/%s.jpg' % (path, count)) 17     count += 1

引用一下該博客中的一段話:函數

函數原型:網站

findAll(tag,attributes,recursive,text,limit,keywords);url

find(tag,attributes,recursive,text,keywords);spa

參數:.net

tag:標籤參數tag前面咱們已經看到過不少次了,你能夠傳一個標籤的名稱或者多個標籤名稱組成的python列表做爲標籤參數。code

         例如此代碼是返回HTML文檔中全部標題標籤的列表:.findAll({"h1","h2","h3","h4","h5","h6"})

attributes:屬性參數attributes是用一個python字典封裝一個標籤的若干個屬性和對應的屬性值。

        例如此代碼會返回HTML文檔裏紅色和綠色兩種顏色的span標籤:.findAll("span",{"class":{"green","red"}})

recursive:遞歸參數recursive是一個布爾變量。你想抓取HTML文檔標籤結構裏多少層的信息?若是recursive設爲True,findAll函數就會根據你的要求去查找標籤參數中的全部子標籤,以及子標籤的子標籤。若是recursive設置爲False,findAll函數就只查找文檔的一級標籤。findAll函數默認是支持遞歸查找的(recursive默認值是True),通常狀況下這個參數不須要設置,除非你真正想要了解本身須要哪些信息,並且抓取速度很是重要,那時你能夠設置遞歸參數。

text:文本參數text有點不一樣,它是用標籤的文本內容去匹配,而不是用標籤的屬性。假如咱們想查找前面網頁中包含「the prince」內容的標

籤數量,咱們能夠用這個代碼:                      

nameList=bsObj.findAll(text="the prince")

 print (len(nameList))

limit:範圍限制參數limit,顯然只用於findAll方法。find其實等價於findAll的limit等於時的情形。若是你只對網頁中獲取的前n項結果感興趣,就能夠設置它。可是須要注意,這個參數設置以後,得到的前幾項結果按照網頁上的 順序排序的,未必是你想要的那前幾項。

keyword:這個參數可讓你選擇那些具備特定屬性的標籤。

         例如:allText=bsObj.findAll(id="text"),這個代碼可讓你得到全部id爲text的標籤的內容。

相關文章
相關標籤/搜索