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

若是您以爲感興趣的話,能夠添加個人微信公衆號:一步一步學Python
![](http://images2017.cnblogs.com/blog/993869/201711/993869-20171118215516327-881787609.jpg)css

隨筆中的代碼拷貝自html

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

感謝阿里波特,經過學習本身作了一些註釋,做爲總結和記錄。chrome

 

  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()  #執行類中的方法
相關文章
相關標籤/搜索