一、任務描述
本實驗任務主要對網絡爬蟲進行一些基本操作,通過完成本實驗任務,要求學生熟練掌握網絡爬蟲的網絡請求及數據解析,並對網絡爬蟲的基本操作進行整理並填寫工作任務報告。
二、任務目標
1、掌握正則表達式
2、掌握網絡爬蟲的原理
三、任務環境
Ubuntu16.04、Python2.7
四、任務分析
學習爬蟲,首先是要學習它的原理。打開網址,每頁都有很多套圖,如果要手動去保存,怎么操作?想應該是這樣,從第一頁開始,點進第一個套圖,然后保存每張圖片,然后進行第二個套圖……第一頁完了之后第二頁,從第一個套圖開始,保存保存……這就是原理,當然,雖然這樣能達到這個目的,但大家應該沒有那么多的時間,那么就來學習爬蟲,來保存圖片。
五、任務實施
步驟1、環境准備
右擊Ubuntu操作系統桌面,從彈出菜單中選擇【Open in Terminal】命令 打開終端。
通過【cd /home】切換到home目錄下。【ls】查看該目錄下的所有內容。
【mkdir Image】在home目錄下創建Image文件夾。
步驟2、爬蟲分析
爬取的MM圖片URL為https://mm.taobao.com/search_tstar_model.htm?
打開瀏覽器輸入該URL,查看界面效果。把所有的MM圖片下載下來。
通過【cd /Image】切換到Image目錄下。【vim taobaoMM.py】回車后創建並編輯taobaoMM.py的Python文件。
回車后進入編輯框內,按鍵盤【i】進入編輯狀態,編譯如下程序。
導入程序所需的所有庫。
browserPath是Phantomjs的路徑
homeUrl是爬取的頁面
outputDir是保存的文件夾路徑
parser是解析器
加載PhantomJS的瀏覽器,通過driver.get(url)來訪問URL,用BeautifulSoup來對得到爬取的URL進行解析。driver.page_source是網頁的全部HTML源碼。最后通過主方法來調用main方法。
編輯完畢后,按【esc】退出編輯狀態,【:wq】保存並退出編輯框,【python taobaoMM.py】執行taobaoMM的Python文件。driver.page_source輸出的結果是網頁的全部HTML源碼。
打開訪問URL的瀏覽器,右鍵選擇【Inspect Element(Q)】根據判斷得知,MM的所有信息在id為J_GirlsList內。
【vim taobaoMM.py】再次編輯taobaoMM.py文件。
在main函數內通過find_element_by_id獲得所有信息,正則表達式獲取妹子的封面圖片以及個人主頁的地址。
在main函數內通過list列表的截取得到妹子的名字地點、身高體重、個人主頁地址以及封面圖片地址。
在main函數內將妹子的信息通過zip函數封裝(zip函數接受任意多個(包括0個和1個)序列作為參數,返回一個tuple列表)。再通過for循環,對妹子的信息進行寫入。
定義mkdir函數,判斷圖片輸出的路徑是否存在,不存在則創建。
在主方法內調用mkdir函數,並將輸出路徑作為參數傳遞。
編輯完畢后,按【esc】退出編輯狀態,【:wq】保存並退出編輯框,【python taobaoMM.py】執行taobaoMM的Python文件。爬取需要幾分鍾。靜等幾分鍾后。打開/home/Image/MMImage下。發現生成很多文件夾。
每個目錄下都包含MM的主圖以及保存信息的txt文件。
txt文件內包含了MM的基本信息。
步驟3、源代碼
#coding:utf-8import osimport refrom bs4 import BeautifulSoupimport urllib2from selenium import webdriverimport sysreload(sys)sys.setdefaultencoding( "utf-8" )browserPath = "/home/soft/phantomjs/bin/phantomjs"homeUrl = "https://mm.taobao.com/search_tstar_model.htm?"outputDir = "MMImage/"parser = "html5lib"def main():#PhantomJS瀏覽器的地址driver = webdriver.PhantomJS(executable_path=browserPath)#訪問目標網頁地址driver.get(homeUrl)#解析目標網頁的 Html 源碼bsObj = BeautifulSoup(driver.page_source,parser)#獲得主頁上所有妹子的姓名、所在城市、身高、體重等信息girlsList = driver.find_element_by_id("J_GirlsList").text.split("\n")#獲取所有妹子的封面圖片imagesUrl = re.findall(r"//gtd.alicdn.com/sns_logo.*.jpg",driver.page_source)#解析出妹子的個人主頁地址等信息girlsUrl = bsObj.find_all("a",{"href":re.compile("\/\/.*\.htm\?(userId=)\d*")})# 所有妹子的名字地點girlNL = girlsList[::3]# 所有妹子的身高體重girlsHW = girlsList [1::3]# 所有妹子的個人主頁地址girlsHURL = [("http:" + i["href"]) for i in girlsUrl]# 所有妹子的封面圖片地址girlsPhotoURL = [("https:" + i) for i in imagesUrl]girlsInfo = zip(girlNL, girlsHW, girlsHURL, girlsPhotoURL)for girlNL,girlHW,girlHURL,girlCover in girlsInfo:#建立文件夾mkdir(outputDir + girlNL)# 獲取妹子封面圖片data = urllib2.urlopen(girlCover).read()with open(outputDir + girlNL + "/cover.jpg","wb") as f:f.write(data)f.close()with open(outputDir + girlNL + "/information.txt","wb") as a:a.write("Name And City:" + girlNL + "\n")a.write("Hight And weight:" + girlHW + "\n")a.write("personal homepage:" + girlHURL)a.close()driver.close()def mkdir(path):#判斷路徑是否存在isExists = os.path.exists(path)#判斷結果if not isExists:#如果不存在則創建目錄print(" 新建了文件夾",path)#創建目錄操作函數os.makedirs(path)else:#如果目錄存在則不創建,並提示目錄已存在print("文件夾", path, "已創建")if __name__ == "__main__":if not os.path.exists(outputDir):os.makedirs(outputDir)main()
