基於python3.x的爬取馬蜂窩旅遊的遊記照片
前幾天在csdn首頁看到一個大佬爬取看準網資料並分析的部落格,自己搞了一下,各種問題,已超過目前的認知領域,so,先從基本的做起吧,一點點新增新內容。
本次任務為爬取馬蜂窩旅行達人的遊記照片,之前搞過幾次馬蜂窩,中間停頓過長,再次迴歸吧。
上程式碼:
import re import urllib.request import os from lxml import etree def savePhoto(soup,path): print(u"開始儲存圖片") img=soup.xpath('//img/@data-src') total_img=0 for myimg in img: total_img += 1 print(myimg) urllib.request.urlretrieve(myimg,path+'%s.jpg'%total_img) print(u"已經儲存第",total_img,u"張照片") print(u"總共儲存第",total_img,u"張照片") def getTitle(soup): result=soup.xpath('//div/h1/text()')[0] result=re.sub('\\n','',result) result=re.sub('\|','',result) print("title:"+result) if result: return result else: return None def mkdir(path): path=path.strip() isExists=os.path.exists(path) if not isExists: print(u"建立了名為",path,u"的資料夾") os.makedirs(path) return True else: print(u"名為",path,u"的資料夾已存在") return False def start(html,path): print(u"開始爬取圖片") title=getTitle(soup) path=path+title+"\\" mkdir(path) savePhoto(soup,path) print(u"請輸入一個馬蜂窩旅行的遊記地址") url=(input()) path="D:\Mafengwo\photo\\" request=urllib.request.Request(url) response=urllib.request.urlopen(url) soup = etree.HTML(response.read().decode('utf-8')) print(u"連線成功") start(soup,path)
ok,總共有四個函式,儲存圖片,獲取標題,判斷資料夾是否存在以及我們的開始函式,首先我們輸入想要爬取的網址,可以使用input,注意raw_input()在python3.x中已經去除了;然後設定存放照片的路徑,可以提前建立資料夾也可以自動建立,這裡注意一下路徑,photo後邊需要‘\\’,一個'\'會出錯,關於路徑的反斜槓問題大家可以去搜一下,我已經看暈了,印象中雙反斜槓,在轉義字元中用到過,還有相對絕對路徑中,對於所有子檔案貌似用雙斜槓。。
下邊的兩條命令(剛才打到這裡時突然發現今天是週六,然後出去給家裡打了個電話,各位離家在外的遊子,不要忘了每週給家裡打個電話報個平安聊聊瑣事~~emmmmm,不煽情了),訪問網站最常用的命令,其實這裡有點怪,urlopen(url)中的url應該替換為request,即前一條命令返回的結果,事實上這兩種方式都行。。最後用etree.HTML()解析得到的html文件,處理之。
對於這四個函式,大部分都是常規操作,使用xpath時注意一下文件格式即可,一般大問題沒有小毛病一大堆,先看下所爬取頁面的結構吧:
這裡有好幾個src,其實都是對應的同一張圖片,只是尺寸不一樣,這個大家點開就知道了,一個是在上邊的href頁面顯示的照片,一個是原圖。我們抓取的是data-src的內容,常規尺寸,正合適。。
在抓取標題時注意一下命名規則,用到了re.sub()方法,替換掉一些檔名不支援的特殊字元,不然會報錯。
關於幾個常用方法大家可以總結一下,如urllib.request系列的,都很好用~~
我們選取的是馬蜂窩旅行首頁的幾位達人的遊記:
看下ipython操作的過程:
這裡大家注意到在“請輸入一個馬蜂窩旅行的遊記地址”下邊是有個空行的,因為print方法末尾自動換行,看下原型print('contents', end='[email protected]#$%^&*'),其end屬性預設值為‘\n’,即換行,我們可以修改一下:print(u"請輸入一個馬蜂窩旅行的遊記地址",end=''),這樣就不會有空行了:
最後看下最終效果:
我們一共爬取了五個達人的遊記照片,看下第一個:
ok,大概就是這樣,稍後使用這些圖片搞一點好玩的事情……