一、任務描述
本實驗任務主要對網絡爬蟲進行一些基本操作,通過完成本實驗任務,要求學生熟練掌握網絡爬蟲的網絡請求及數據解析,並對網絡爬蟲的基本操作進行整理並填寫工作任務報告。
二、任務目標
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-8
import os
import re
from bs4 import BeautifulSoup
import urllib2
from selenium import webdriver
import sys
reload(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()