Phantomjs與Selenium爬取圖片

1、任務描述

  本實驗任務主要對網絡爬蟲進行一些基本操做,經過完成本實驗任務,要求學生熟練掌握網絡爬蟲的網絡請求及數據解析,並對網絡爬蟲的基本操做進行整理並填寫工做任務報告。css

2、任務目標

一、掌握正則表達式html

二、掌握網絡爬蟲的原理html5

3、任務環境

Ubuntu16.0四、Python2.7python

4、任務分析

  學習爬蟲,首先是要學習它的原理。打開網址,每頁都有不少套圖,若是要手動去保存,怎麼操做?想應該是這樣,從第一頁開始,點進第一個套圖,而後保存每張圖片,而後進行第二個套圖……第一頁完了以後第二頁,從第一個套圖開始,保存保存……這就是原理,固然,雖然這樣能達到這個目的,但你們應該沒有那麼多的時間,那麼就來學習爬蟲,來保存圖片。web

5、任務實施

步驟一、環境準備正則表達式

  右擊Ubuntu操做系統桌面,從彈出菜單中選擇【Open in Terminal】命令 打開終端。apache

  經過【cd /home】切換到home目錄下。【ls】查看該目錄下的全部內容。vim

 

圖1 切換目錄

  【mkdir Image】在home目錄下建立Image文件夾。瀏覽器

圖2 建立文件夾

步驟二、爬蟲分析ruby

  爬取的MM圖片URL爲https://mm.taobao.com/search_tstar_model.htm?

  打開瀏覽器輸入該URL,查看界面效果。把全部的MM圖片下載下來。

圖3 分析URL

  經過【cd /Image】切換到Image目錄下。【vim taobaoMM.py】回車後建立並編輯taobaoMM.py的Python文件。

圖4 切換目錄

  回車後進入編輯框內,按鍵盤【i】進入編輯狀態,編譯以下程序。

  導入程序所需的全部庫。

圖5 導入庫

  browserPath是Phantomjs的路徑

  homeUrl是爬取的頁面

  outputDir是保存的文件夾路徑

  parser是解析器

圖6 路徑

  加載PhantomJS的瀏覽器,經過driver.get(url)來訪問URL,用BeautifulSoup來對獲得爬取的URL進行解析。driver.page_source是網頁的所有HTML源碼。最後經過主方法來調用main方法。

圖7 獲取URL

  編輯完畢後,按【esc】退出編輯狀態,【:wq】保存並退出編輯框,【python taobaoMM.py】執行taobaoMM的Python文件。driver.page_source輸出的結果是網頁的所有HTML源碼。

圖8 運行Python文件

  打開訪問URL的瀏覽器,右鍵選擇【Inspect Element(Q)】根據判斷得知,MM的全部信息在id爲J_GirlsList內。

圖9 分析網址

  【vim taobaoMM.py】再次編輯taobaoMM.py文件。

  在main函數內經過find_element_by_id得到全部信息,正則表達式獲取妹子的封面圖片以及我的主頁的地址。

圖10 解析信息

  在main函數內經過list列表的截取獲得妹子的名字地點、身高體重、我的主頁地址以及封面圖片地址。

圖11 截取信息

  在main函數內將妹子的信息經過zip函數封裝(zip函數接受任意多個(包括0個和1個)序列做爲參數,返回一個tuple列表)。再經過for循環,對妹子的信息進行寫入。

圖12 信息封裝

  定義mkdir函數,判斷圖片輸出的路徑是否存在,不存在則建立。

圖13 輸出路徑

  在主方法內調用mkdir函數,並將輸出路徑做爲參數傳遞。

圖14 參數傳遞

  編輯完畢後,按【esc】退出編輯狀態,【:wq】保存並退出編輯框,【python taobaoMM.py】執行taobaoMM的Python文件。爬取須要幾分鐘。靜等幾分鐘後。打開/home/Image/MMImage下。發現生成不少文件夾。

圖15 運行Python文件

  每一個目錄下都包含MM的主圖以及保存信息的txt文件。

圖16 目錄信息

  txt文件內包含了MM的基本信息。

圖17 基本信息

步驟三、源代碼

    1. #coding:utf-8
    2. import os
    3. import re
    4. from bs4 import BeautifulSoup
    5. import urllib2
    6. from selenium import webdriver
    7. import sys
    8. reload(sys)
    9. sys.setdefaultencoding( "utf-8" )
    10. browserPath = "/home/soft/phantomjs/bin/phantomjs"
    11. homeUrl = "https://mm.taobao.com/search_tstar_model.htm?"
    12. outputDir = "MMImage/"
    13. parser = "html5lib"
    14. def main():
    15. #PhantomJS瀏覽器的地址
    16. driver = webdriver.PhantomJS(executable_path=browserPath)
    17. #訪問目標網頁地址
    18. driver.get(homeUrl)
    19. #解析目標網頁的 Html 源碼
    20. bsObj = BeautifulSoup(driver.page_source,parser)
    21. #得到主頁上全部妹子的姓名、所在城市、身高、體重等信息
    22. girlsList = driver.find_element_by_id("J_GirlsList").text.split("\n")
    23. #獲取全部妹子的封面圖片
    24. imagesUrl = re.findall(r"//gtd.alicdn.com/sns_logo.*.jpg",driver.page_source)
    25. #解析出妹子的我的主頁地址等信息
    26. girlsUrl = bsObj.find_all("a",{"href":re.compile("\/\/.*\.htm\?(userId=)\d*")})
    27. # 全部妹子的名字地點
    28. girlNL = girlsList[::3]
    29. # 全部妹子的身高體重
    30. girlsHW = girlsList [1::3]
    31. # 全部妹子的我的主頁地址
    32. girlsHURL = [("http:" + i["href"]) for i in girlsUrl]
    33. # 全部妹子的封面圖片地址
    34. girlsPhotoURL = [("https:" + i) for i in imagesUrl]
    35. girlsInfo = zip(girlNL, girlsHW, girlsHURL, girlsPhotoURL)
    36. for girlNL,girlHW,girlHURL,girlCover in girlsInfo:
    37. #創建文件夾
    38. mkdir(outputDir + girlNL)
    39. # 獲取妹子封面圖片
    40. data = urllib2.urlopen(girlCover).read()
    41. with open(outputDir + girlNL + "/cover.jpg","wb") as f:
    42. f.write(data)
    43. f.close()
    44. with open(outputDir + girlNL + "/information.txt","wb") as a:
    45. a.write("Name And City:" + girlNL + "\n")
    46. a.write("Hight And weight:" + girlHW + "\n")
    47. a.write("personal homepage:" + girlHURL)
    48. a.close()
    49. driver.close()
    50. def mkdir(path):
    51. #判斷路徑是否存在
    52. isExists = os.path.exists(path)
    53. #判斷結果
    54. if not isExists:
    55. #若是不存在則建立目錄
    56. print(" 新建了文件夾",path)
    57. #建立目錄操做函數
    58. os.makedirs(path)
    59. else:
    60. #若是目錄存在則不建立,並提示目錄已存在
    61. print("文件夾", path, "已建立")
    62. if __name__ == "__main__":
    63. if not os.path.exists(outputDir):
    64. os.makedirs(outputDir)
    65. main()
相關文章
相關標籤/搜索