1. 程式人生 > >基於python3.x的爬取馬蜂窩旅遊的遊記照片

基於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,大概就是這樣,稍後使用這些圖片搞一點好玩的事情……