這道題是一道爬蟲練習題,需要爬鏈接http://tieba.baidu.com/p/2166231880里的所有妹子圖片,點進鏈接看一下,這位妹子是日本著名性感女演員——杉本由美,^_^好漂亮啊,趕緊開始爬吧。
以下就是我的爬蟲步驟:
一.獲取頁面
雖然request和beautifulsoup模塊方便又好用,但是我還是決定使用傳統的urllib和urllib模塊,畢竟對這兩個模塊熟悉之后,就能基本明白爬蟲的原理和實現啦。
首先是導入模塊,除了前面提到的兩個模塊,我們還要導入re模塊,使用正則表達式來匹配我們想要的內容。
導入模塊之后,就可以獲取頁面了。步驟如下:
1.使用urllib2.Requst( )得到request對象。
這個對象是用於打開一個網頁的請求,可以方便的攜帶一些請求需要的信息,如headers,cookies等數據。
因為我們打開的網頁——百度貼吧不需要登錄就可以瀏覽頁面,所以request對象只需要headers對象就可以了。
2.使用urllib2.urlopen( )得到response對象。
這個對象是爬蟲頁面的對象,與文件對象類似,你可以使用read( )來得到response頁面對象的源碼。
3.使用正則匹配要爬的資源鏈接
不會正則的同學,可以學一下,很快,一個下午就能學會正則基礎啦,至少爬蟲使用的正則你就會寫啦。我們想要得到頁面的所有圖片的鏈接,那就在瀏覽器中使用CTRL+ALT+c來打開頁面查看頁面的源碼,也就是頁面的HTML文本。
找一下圖片的標簽在哪里,發現所有要下載的圖片標簽<img>的類都是BDE_image,標簽格式都一樣,但是帖子中還有廣告樓層里面的圖片標簽也是也是這個類。我可不想下載下來之后瀏覽美女圖片,突然跳出來一個廣告圖片。
那再仔細看一下頁面,發現只要點擊只看樓主選項,廣告樓層就不見了,同時頁面url后面多了幾個字符是 ?see_lz=1 。好,那我們直接在我們的請求url后加上這幾個字符就行啦,至於其他的樓層,沒有了更好^_^,反正其他樓層都是灌水。
ok,那就開始匹配我們想要的鏈接吧。使用re.compile( )來編譯匹配模式,再使用re.findall( )得到所有的圖片的src屬性,也就是鏈接的列表。
這就完成了我們爬蟲最重要的一步啦。
二.下載鏈接
下載鏈接要使用urllib.urlretrieve( ),這個函數可以將你的鏈接資源下載到本地,如果指定目錄的話會下載到目錄,否則下載為臨時文件。
那就直接迭代我們第一步得到的圖片鏈接列表,一個個全下載下來吧。
到這里,爬這個頁面的小練習,就完成啦。
我的代碼在這里:
1 # coding=utf-8 2 import urllib,urllib2 3 import re 4 5 #頭信息 6 header={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0'} 7 8 def get_img_url(page_url):#得到頁面所有圖片的鏈接 9 10 request=urllib2.Request(page_url,headers=header) #生成request對象 11 reference=urllib2.urlopen(request) #獲取頁面對象 12 page=reference.read() #讀取頁面 13 14 regex=re.compile(r'<img.*?class="BDE_Image" src="(.*?)".*?>') #編譯正則匹配模式字符串 15 img_url_list=re.findall(regex,page) #匹配所有圖片鏈接生成列表 16 17 return img_url_list 18 19 def download_img(url_list,img_path): #從圖片鏈接下載圖片並存放在指定文件夾 20 for img_url in url_list: 21 urllib.urlretrieve(img_url,'%s/%s.jpg'%(img_path,img_url[-8:-5])) #下載圖片 22 print 'done' 23 24 url='http://tieba.baidu.com/p/2166231880?see_lz=1' #爬蟲頁面 25 path='/home/afei/picture' #存放路徑 26 urllist=get_img_url(url) 27 download_img(urllist,path)
wow,杉本由美真的好漂亮啊,有鼻子有眼的。