如果您覺得感興趣的話,可以添加我的微信公眾號:一步一步學Python

隨筆中的代碼拷貝自
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() #執行類中的方法