Seleninum&PhamtomJS爬取煎蛋網妹子圖
- 2020 年 1 月 7 日
- 筆記
目標網站:
需要爬取的網站: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 模擬用戶點擊下一頁行為,發起新的請求
