首页 > 技术文章 > 使用requests爬取图片并下载

dingxinwen 2021-06-01 11:16 原文

一、爬虫实现方式

  使用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

推荐阅读