若是您以爲感興趣的話,能夠添加個人微信公衆號:一步一步學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() #執行類中的方法