第 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的標籤的內容。