Seleninum&PhamtomJS爬取煎蛋網妹子圖

發布時間:2018-07-31 17:18:06編輯:Run閱讀(4608)

    目标網站:

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

    blob.png


    目标分析:

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

    blob.png


    找到每個圖片的地址:

    右鍵檢查圖片的代碼,找到圖片的代碼

    blob.png



    爬蟲代碼:

    創建一個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-windows\bin\phantomjs.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)-12s\r\n')
    
            # 日志顯示到屏幕上并輸出到日志文件内
            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運行結果

    XF[RNQW%82TFWANO~F8%9(4.png


    下載圖片截圖:

    blob.png


    代碼分析:

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


    主程序:

    getJianDan.py 主程序

    getBrowser  打開目标網站,并返回内容

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

    createDir   創建圖片保存目錄

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

關鍵字