随笔中的代码拷贝自
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() #执行类中的方法
时间: 2024-10-17 19:36:57