使用requests爬取图片并下载
一、爬虫实现方式
使用requests访问网页,获取网页源码后,使用BeautifulSoup抓取的数据进行分析,拿取到需要的数据(图片的url地址),然后再根据地址将图片保存到本地
使用前需要安装好第三方库requests和BeautifulSoup,requests获取页面所有数据,BeautifulSoup对数据进行处理
二、使用requests访问网址
使用requests函数来访问需要爬取图片的地址,然后获取对应的返回数据
requests的常用返回数据方法:
1 r.encoding #获取当前的编码 2 r.encoding = 'utf-8' #设置编码 3 r.text #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。 4 r.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。 5 r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None 6 r.status_code #响应状态码 7 r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 8 r.ok # 查看r.ok的布尔值便可以知道是否登陆成功 9 #*特殊方法*# 10 r.json() #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常 11 r.raise_for_status() #失败请求(非200响应)抛出异常
def page(self,url=None,photoheadr_url = None): print("-----开始爬取图片-----") if url is None: print('请输入url') return request = requests.get(url) request.encoding = 'utf-8' #有时候返回的页面会出现乱码,所以最好加上编码格式 if request.status_code != 200: print("url请求失败,请检查url:%s" % url) return pagehtml = request.text print("页面HTML获取成功,url为:%s" % url) self.htmldownload(pagehtml,photoheadr_url) #调用下载图片函数
将获取到的页面的所有的数据,给到BeautifulSoup进行处理,获取想要的数据
三、下载和保存图片
拿取到页面的数据后,对数据进行处理:
pagehtml为刚刚获取到的页面的源码,使用
1 def htmldownload(self,pagehtml,photoheadr_url = None):
2 '''下载图片''' 3 img_urls = [] 4 soup = BeautifulSoup(pagehtml, 'html.parser') 5 # imgs = soup.find_all("img" ,src=re.compile("(.*)") ) #获取图片的img 6 imgs = soup.find_all("img") # 获取图片的img 7 if len(imgs) is 0: 8 print("当前页面没有找到img标签。请检查页面是否有图片(或图片是否在img标签里)") 9 return 10 else: 11 print("页面图片数为:%d " % len(imgs) ) 12 print("img标签内容为:\n%s " % imgs) 13 for img in imgs: 14 try: 15 photo_url = img['src'] # 获取所有的链接,默认去查找的src下的路径,如果路径不在src,修改对应的查找内容就可以了 16 new_full_url = parse.urljoin(photoheadr_url,photo_url) #将从src获取的路径拼成一个完整的,如果没有就不需要拼 17 img_urls.append(new_full_url) 18 except Exception as e: 19 print("img标签里src路径获取失败,请检查img标签内容") 20 print("报错内容: %s" % e) 21 print('图片url获取完成:\n%s' % img_urls) 22 self.ssave_image(img_urls)
完整代码如下:
1 import requests 2 import os # 用于指定文件的保存地址 3 from bs4 import BeautifulSoup 4 from urllib import parse 5 from urllib.parse import urlparse 6 7 8 class pachong(object): 9 '''获取页面HTML并提取图片url''' 10 def page(self,url=None,photoheadr_url = None): 11 print("-----开始爬取图片-----") 12 if url is None: 13 print('请输入url') 14 return 15 request = requests.get(url) 16 request.encoding = 'utf-8' 17 if request.status_code != 200: 18 print("url请求失败,请检查url:%s" % url) 19 return 20 pagehtml = request.text 21 print("页面HTML获取成功,url为:%s" % url) 22 self.htmldownload(pagehtml,photoheadr_url) #调用下载图片函数 23 24 def htmldownload(self,pagehtml,photoheadr_url = None): 25 '''下载图片''' 26 img_urls = [] 27 soup = BeautifulSoup(pagehtml, 'html.parser') 28 # imgs = soup.find_all("img" ,src=re.compile("(.*)") ) #获取图片的img 29 imgs = soup.find_all("img") # 获取图片的img 30 if len(imgs) is 0: 31 print("当前页面没有找到img标签。请检查页面是否有图片(或图片是否在img标签里)") 32 return 33 else: 34 print("页面图片数为:%d " % len(imgs) ) 35 print("img标签内容为:\n%s " % imgs) 36 for img in imgs: 37 try: 38 photo_url = img['src'] # 获取所有的链接,默认去查找的src下的路径,如果路径不在src,修改对应的查找内容就可以了 39 new_full_url = parse.urljoin(photoheadr_url,photo_url) #将从src获取的路径拼成一个完整的,如果没有就不需要拼 40 img_urls.append(new_full_url) 41 except Exception as e: 42 print("img标签里src路径获取失败,请检查img标签内容") 43 print("报错内容: %s" % e) 44 print('图片url获取完成:\n%s' % img_urls) 45 self.ssave_image(img_urls) 46 47 def ssave_image(self,img_urls = None): 48 '''保存图片到本地''' 49 if img_urls is None or len(img_urls) == 0: 50 print("下载时未找到图片url,请检查图片下载地址和img标签内的属性") 51 return 52 cur_path = os.path.abspath(os.curdir) # 获取当前绝对路径 53 goal_path = cur_path + '\\' + 'imgs' # 想将文件保存的路径 54 if not os.path.exists(goal_path): # os.path.isfile('test.txt') 判断文件夹/文件是否存在 55 os.mkdir(goal_path) # 创建文件夹 56 print("创建imgs文件夹成功,准备下载图片") 57 else: 58 print("已有imgs文件夹,准备下载图片") 59 for img in img_urls: 61 file_path = urlparse(img).path.split('/')[-1] 62 file_path = "{0}".format(file_path) #生成文件用来存放图片,名称为取的名称 63 try: 64 photo = requests.get(img) 65 if photo.status_code == 200: 66 with open(goal_path + '\\' + file_path, 'wb')as f: 67 f.write(photo.content) 68 f.close() 69 print("图片:%s 下载完成" % file_path) 70 except Exception as e: 71 print("下载图片:%s 失败,请检查图片下载url" % file_path) 72 print ('报错内容:%s ' % e) 73 print("爬取图片完成") 74 75 if __name__ == '__main__': 76 a = pachong() 77 a.page('https://the86driver.com/blog/29','https://the86driver.com') 78 a.page("http://www.nipic.com/topic/show_27400_1.html")
BeautifulSoup