zoukankan      html  css  js  c++  java
  • 使用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标签内容为: %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获取完成: %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标签内容为:
    %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获取完成:
    %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
  • 相关阅读:
    详解Net Core Web Api项目与在NginX下发布
    一个C#开发者重温Java的心路历程
    C#使用Consul集群进行服务注册与发现
    让我们一起揭开算法的神秘面纱
    C#调用RabbitMQ实现消息队列
    C#调用OpenCV开发简易版美图工具
    我们是如何做go语言系统测试覆盖率收集的?
    高效测试框架推荐之Ginkgo
    性能测试必知必会
    如何保障Go语言基础代码质量?
  • 原文地址:https://www.cnblogs.com/dingxinwen/p/14787594.html
Copyright © 2011-2022 走看看