Python PhatomJS 和Selenium動態加載頁面 獲取圖片內容


如果您覺得感興趣的話,可以添加我的微信公眾號:一步一步學Python
![](http://images2017.cnblogs.com/blog/993869/201711/993869-20171118215516327-881787609.jpg)

隨筆中的代碼拷貝自

http://www.cnblogs.com/Albert-Lee/p/6275146.html

感謝阿里波特,通過學習自己做了一些注釋,作為總結和記錄。

 

  1 from selenium import webdriver
  2 import requests
  3 from bs4 import BeautifulSoup
  4 import os
  5 import time
  6 #定義函數時,盡量寫上默認參數,字符='',數字=0,特殊對象也要定義默認值,這樣就可以簡單的通過.來得到參數具有的性質等。
  7 class BeautifulPicture():
  8     def __init__(self):
  9         # 給請求指定一個請求頭來模擬chrome瀏覽器
 10         self.headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1'}
 11         self.web_url='https://unsplash.com'
 12         self.folder_path=r'E:\Python Code\test'
 13 
 14     def request(self,url):#返回網頁的response
 15         r=requests.get(url)#獲得目標網址的response對象
 16         return r
 17 
 18     def mkdir(self,path=''):#創建文件夾
 19         path=path.strip()#刪除空白字符
 20         isExists=os.path.exists(path)#判斷路徑是否存在
 21         if not isExists:#如果不存在,則創建文件夾
 22             print('創建名字叫做',path,'的文件夾')
 23             os.makedirs(path)#創建目標文件夾
 24             print('創建成功')
 25             return True#文件夾不存在返回True
 26         else:#如果存在,返回
 27             print(path,'文件夾已經存在了,不再創建了')
 28             return False
 29 
 30     def scroll_down(self,driver=webdriver.PhantomJS(),times=1):#模擬下拉操作
 31         for i in range(times):
 32             print('開始執行第',str(i+1),'次下拉操作')
 33             driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')#執行js代碼操作,頁面滾動到指定位置(x,y)
 34             print('',str(i+1),'次下拉操作執行完畢')
 35             print("", str(i + 1), "次等待網頁加載......")
 36             time.sleep(20)
 37 
 38     def get_files(self,path=''):
 39         pic_names=os.listdir(path)#獲取目錄中的內容
 40         return pic_names
 41 
 42     def save_img(self,url,file_name):
 43         print('開始請求圖片地址,過程比較長。。。')
 44         img=self.request(url)#img是個response對象
 45         print('開始保存圖片')
 46         f=open(file_name,'ab')
 47 
 48         # rU或Ua以只讀方式打開
 49         # w 以寫方式打開
 50         # a 以追加模式打開
 51         # r+ 以讀寫方式打開
 52         # w+ 讀寫
 53         # a+ 讀寫
 54         # rb 二進制讀
 55         # wb 二進制寫 ab 二進制追加 rb+ 二進制讀寫 wb+二進制讀寫 ab+二進制讀寫
 56         #
 57         f.write(img.content)
 58         #如果想獲取文本,可以通過response.text,如果想獲取圖片、文件,可以通過response.content。
 59         # resp.text返回的是Unicode型的數據。
 60         # resp.content返回的是bytes型也就是二進制的數據。
 61         print(file_name,'圖片保存成功')
 62         f.close()
 63 
 64 
 65     def get_pic(self):
 66         print('開始網頁請求')
 67         #使用selenium通過PhantomJS來進行網絡請求
 68         driver=webdriver.PhantomJS()
 69         driver.get(self.web_url)#這里就不再通過urllib進行網絡請求了
 70         self.scroll_down(driver=driver,times=5)#下拉5次,可以自己設定
 71         print('開始獲取所有a標簽')
 72         #獲取網頁中class為cV68d的所有a標簽
 73         all_a=BeautifulSoup(driver.page_source,'lxml').find_all('a',class_='cV68d')
 74         #按照css類名搜索tag的功能非常實用,但標識css類名的關鍵字class在Python中是保留字,實用class做參數會導致語法錯誤。同BS4.1.1版本開始,通過class_參數搜索。
 75         print('開始創建文件夾')
 76         is_new_folder=self.mkdir(self.folder_path)
 77         print('開始切換文件夾')
 78         os.chdir(self.folder_path)#改變當前工作路徑,.gwd()為獲取當前工作目錄
 79 
 80         print('a標簽的數量是:',len(all_a))
 81         file_names=self.get_files(self.folder_path)#獲取當前工作目錄下的文件名?干嗎用?
 82 
 83         for a in all_a:
 84             img_str=a['style']
 85             print('a標簽的style內容是:',img_str)
 86             first_pos=img_str.index('(')+1
 87             second_pos=img_str.index(')')
 88             img_url=img_str[first_pos:second_pos]
 89 
 90             # 注:為了盡快看到下拉加載的效果,截取高度和寬度部分暫時注釋掉,因為圖片較大,請求時間較長。
 91             # 獲取高度和寬度的字符在字符串中的位置
 92             # width_pos = img_url.index('&w=')
 93             # height_pos = img_url.index('&q=')
 94             # width_height_str = img_url[width_pos : height_pos] #使用切片功能截取高度和寬度參數,后面用來將該參數替換掉
 95             # print('高度和寬度數據字符串是:', width_height_str)
 96             # img_url_final = img_url.replace(width_height_str, '')  #把高度和寬度的字符串替換成空字符
 97             # print('截取后的圖片的url是:', img_url_final)
 98 
 99             # 截取url中參數前面、網址后面的字符串為圖片名
100             name_start_pos=img_url.index('.com/')+5
101             name_end_pos=img_url.index('?')
102             img_name=img_url[name_start_pos:name_end_pos]+'.jpg'
103             img_name=img_name.replace('/','')
104 
105             if is_new_folder:#如果文件夾不存在,那么肯定沒有重復文件,則直接保存文件。
106                 self.save_img(img_url,img_name)
107             else:
108                 if img_name not in file_names:#如果文件夾存在,需要判斷是否有重復文件
109                     self.save_img(img_url, img_name)  # 調用save_img方法來保存圖片
110                 else:
111                     print("該圖片已經存在:", img_name, ",不再重新下載。")
112 
113 
114 beauty = BeautifulPicture()  #創建類的實例
115 beauty.get_pic()  #執行類中的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM