Seleninum&PhamtomJS爬取煎蛋網妹子圖

目標網站:

需要爬取的網站:http://jandan.net/ooxx

目標分析:

先找到總頁數,即可以利用selenium的模擬點擊到下一個頁面

找到每個圖片的地址:

右鍵檢查圖片的程式碼,找到圖片的程式碼

爬蟲程式碼:

創建一個getJianDan.py文件,程式碼如下:

#!/usr/bin/env python  # coding: utf-8  from selenium import webdriver  from mylog import MyLog as mylog  import json  import os  import urllib.request  import time      class GetJianDan(object):      """the all data from jandan.net      所有數據來自煎蛋網      """      def __init__(self):          self.startUrl = 'http://jandan.net/ooxx'          self.log = mylog()          self.browser = self.getBrowser()          self.getPageNext(self.browser)        def getBrowser(self):          try:              # 方法一: 指定PhantomJS的路徑              #browser = webdriver.PhantomJS(executable_path=r"D:phantomjs-2.1.1-windowsbinphantomjs.exe")              # 方法二: 複製PhantomJS.exe到C:Python35目錄下(Python安裝目錄下)              browser = webdriver.PhantomJS()              browser.get(self.startUrl)   # 打開目標網站              browser.implicitly_wait(20)  # 等待js程式碼載入完畢          except Exception as e:              self.log.error('open the %s failed:%s' % (self.startUrl, e))          else:              return browser        def saveImg(self, browser):          # 找到所有圖片的標籤,返回一個list          elements = browser.find_elements_by_xpath('//ol[@class="commentlist"]//div[@class="row"]          //div[@class="text"]')          for element in elements:              src = element.find_element_by_xpath("./p//img").get_attribute('src')    # img 下載地址              imgName = element.find_element_by_xpath("./span/a").text    # img 名字              suffix_name = os.path.splitext(src)[1]  # img後綴名              # 判斷圖片後綴是否為.gif,如果是則獲取org_src屬性              if suffix_name == '.gif':                  # 重新賦值給src,這樣爬取的才是動態的gif圖片                  src = element.find_element_by_xpath("./p//img").get_attribute('org_src')              full_name_img = imgName + suffix_name  # img完整名字              try:                  # 下載圖片,需要傳入(圖片下載地址,img完整名字帶後綴名)                  urllib.request.urlretrieve(src, full_name_img)                  time.sleep(1)  # 設置下載延遲,防止被封              except Exception as e:                  self.log.error('%s download failed, %s' % (full_name_img, e))              else:                  self.log.info('%s download success' % full_name_img)        def createDir(self, dirName):          """創建目錄"""          if os.path.exists(dirName):              self.log.error('create directory %s failed, have a sane name file or directory' % dirName)          else:              try:                  os.makedirs(dirName)              except Exception as e:                  self.log.error('create directory %s failed : %s' % (dirName, e))              else:                  self.log.info('create directory %s success' % dirName)        def getPageNext(self, browser):          # 獲取總頁數          sumPage = json.loads(browser.find_element_by_xpath("//div[@class='comments']/          div[@class='cp-pagenavi']/span[last()]").text)          cartoonTitle = browser.title  # 獲取目錄名          self.createDir(cartoonTitle)  # 創建存儲圖片目錄          os.chdir(cartoonTitle)  # 進入創建的目錄          i = 1          while i <= sumPage[0]:              self.saveImg(self.browser)              i += 1              self.log.info('開始爬取第%d頁' % i)              # 利用selenium點擊下一頁,獲取下一頁的內容              NextTag = browser.find_element_by_partial_link_text("下一頁").click()              browser.implicitly_wait(30)  # 等待載入js程式碼              time.sleep(3)          self.log.info('save img success')          browser.quit()      if __name__ == '__main__':      st = GetJianDan()

mylog.py日誌文件程式碼如下:

#!/usr/bin/env python  # coding: utf-8  import logging  import getpass  import sys      # 定義MyLog類  class MyLog(object):      def __init__(self):          self.user = getpass.getuser()  # 獲取用戶          self.logger = logging.getLogger(self.user)          self.logger.setLevel(logging.DEBUG)            # 日誌文件名          self.logfile = sys.argv[0][0:-3] + '.log'  # 動態獲取調用文件的名字          self.formatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(message)-12srn')            # 日誌顯示到螢幕上並輸出到日誌文件內          self.logHand = logging.FileHandler(self.logfile, encoding='utf-8')          self.logHand.setFormatter(self.formatter)          self.logHand.setLevel(logging.DEBUG)            self.logHandSt = logging.StreamHandler()          self.logHandSt.setFormatter(self.formatter)          self.logHandSt.setLevel(logging.DEBUG)            self.logger.addHandler(self.logHand)          self.logger.addHandler(self.logHandSt)        # 日誌的5個級別對應以下的5個函數      def debug(self, msg):          self.logger.debug(msg)        def info(self, msg):          self.logger.info(msg)        def warn(self, msg):          self.logger.warn(msg)        def error(self, msg):          self.logger.error(msg)        def critical(self, msg):          self.logger.critical(msg)      if __name__ == '__main__':      mylog = MyLog()      mylog.debug(u"I'm debug 中文測試")      mylog.info(u"I'm info 中文測試")      mylog.warn(u"I'm warn 中文測試")      mylog.error(u"I'm error 中文測試")      mylog.critical(u"I'm critical 中文測試")

運行主程式getJianDan.py

Pycharm運行結果

下載圖片截圖:

程式碼分析:

mylog.py  日誌模組,記錄一些爬取過程中的資訊,在大量爬取的時候,沒有log幫助定位,很難找到錯誤點

主程式:

getJianDan.py 主程式

getBrowser  打開目標網站,並返回內容

saveImg  處理每個頁面img,並下載

createDir   創建圖片保存目錄

getPageNext  模擬用戶點擊下一頁行為,發起新的請求