zoukankan      html  css  js  c++  java
  • python爬虫抓取图片

    一、什么是爬虫

      什么是爬虫?爬虫是蜘蛛么?是八爪鱼么?nonono。

      爬虫是指请求网站并获取数据的自动化程序,又称网页蜘蛛或网络机器,最常用领域是搜索引擎,最常用的工具是八爪鱼。

      它的基本流程分为以下五部分,依次是:

        明确需求——发送请求——获取数据——解析数据——存储数据。

      爬虫的三大特点:

      • 网页都有唯一的URL(统一资源定位符,也就是网址)进行定位
      • 网页都使用HTML(定位超文本标记语言)来描述页面信息
      • 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据

       爬虫可以由什么编写呢:

        编写爬虫的语言有很多,但用的最多最广的还应该是Python,并且也诞生了很多优秀的库和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般来说,搜索引擎的爬虫对爬虫的效率要求更高,会选用c++、java、go(适合高并发)。

    二、爬虫前期准备工作

    1、准备一台性能良好的电脑

      电脑要求:windows7以上,内存四核8G以上

    2、安装python环境

      python官网下载地址:

        https://www.python.org/downloads/release/python-395/

      安装流程:

        请自行百度。

    3、安装所需要的扩展

      咱们主要使用以下四个扩展:

    import os # python自带扩展不需要安装
    import requests   # pip install requests
    from urllib import request  # python自带扩展不需要安装
    from bs4 import BeautifulSoup  # 安装命令:pip install bs4

      

    4、查找一个可读取源码的图片网站

    注意注意:此链接仅供学习参考,请勿非法批量爬取,任何不听劝阻,一意孤行者,如若产生违法乱纪之事,请自行承担。(开发不易,且行且珍惜)
    
    抓取图片的地址:https://www.umei.cc/meinvtupian/meinvxiezhen/

    三、分析网站源码

    1、分析源码,得到获取源码的三个方向(编码格式、请求方式、header请求头)

    1.   windows默认是gbk的编码格式,网页一般默认是utf-8的编码,所以直接用windows电脑抓取网页内容信息的时候可能会遇到乱码的问题,所以请求的时候统一编码格式保证数据不乱吗   
    2.   请求方式有post、get、put等方式校验,所以选择对的请求方式获取页面信息,如果不争取可能会出现404找不到页面或者500服务器错误   
    3.   header请求头包含很多阴性信息,如果我们常见的,如:反爬机制、token校验、cookie校验等等

    2、查找列表页的唯一节点

    3、根据图片排版,查找源码规律(相同的li标签获取节点)

    4、获取列表的最后一页,获取最后一页的页码(NewPages节点下的尾页,代表最后141页)

    根据图片分页的页码地址规律,我们能得到(特别注意:第一页不能使用  index_1.htm  来查询):
    https://www.umei.net/meinvtupian/meinvxiezhen/                    第一页没有index
    https://www.umei.net/meinvtupian/meinvxiezhen/index_2.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_3.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_4.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_5.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_6.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_7.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_8.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/index_9.htm
    ......
    

      

    5、根据每一个图片链接,进入图片详情

    根据上题3可以看出,图片详情的地址为:
    
    https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
    

      

    6、查找图片详情的地址规律,获取所有的详情子图片地址

    根据图片详情可以查看出来每一个子图片的详情地址:
    https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_2.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_3.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_4.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_5.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_6.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_7.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_8.htm
    https://www.umei.net/meinvtupian/meinvxiezhen/233941_9.htm
    

     

    7、根据地址抓取图片流,保留本地

      根据题6获取的图片地址进行爬取图片信息,保存到本地,页面分析到此结束,废话不多说,直接上代码,赶紧抓取。

    四、开始编写我们的爬虫脚本

    1、封装式代码

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2021/06/06 14:48
    # @Author  : Liu
    # @Site    : 
    # @File    : 美图小姐姐.py
    # @Software: PyCharm
    
    import requests
    import time
    import os
    import re
    from urllib import request
    from bs4 import BeautifulSoup
    
    url_address = "https://www.umei.cc"
    
    def get_url_path(url):
        """
        获取地址内容信息
        :param url:
        :return:
        """
        # time.sleep(1)  # 获取源码的时候睡眠一秒
        obj = requests.get(url)
        obj.encoding = obj.apparent_encoding
        return obj.text
    
    
    def get_page_info():
        """
        抓取每页信息
        :return:
        """
        nums = int(input("输入抓取的页数:"))
        for i in range(nums):
            if i < 1:
                url = f"{ url_address }/meinvtupian/meinvxiezhen/"
            else:
                url = f"{ url_address }/meinvtupian/meinvxiezhen/index_{i + 1}.htm"
            ret = get_url_path(url)  # 获取页面信息
            get_bs4(ret)  # 逐页抓取页面信息
            print(f"第{i+1}页完成")
        pass
    
    
    def get_bs4(ret):
        soup = BeautifulSoup(ret, "html.parser")
        li_list = soup.select(".TypeList")[0].find_all(name="li")
        for i in li_list:
            # 先获取第一张图片
            img_src = url_address + i.a["href"]
            ret1 = get_url_path(img_src)  # 获取页面信息
            get_image_info(ret1, i.a.span.string, 1)
    
            # print(ret1)
    
            # 获取分页后的页面图片数量
            # script_reg = r'<script type="text/javascript">Next("d+","(?P<num>d+)",.*?)</script>'
            script_reg = r'<a href="/meinvtupian/meinvxiezhen/(?P<num>[0-9_]+).htm">尾页</a>'
            num_str = re.search(script_reg, ret1, re.S).group("num")
            page_num = int(num_str.split("_")[1])  # 获取图片数量
    
            img_lst = os.path.basename(i.a["href"]).split(".")  # 获取图片的后缀
            img_dir = os.path.dirname(i.a["href"])   # 获取图片的地址路径
            for j in range(2, page_num+1):
                img_src = f"{ url_address }{img_dir}/{img_lst[0]}_{j}.{img_lst[1]}"
                res = get_url_path(img_src)  # 获取页面信息
                get_image_info(res, i.a.span.string, j)
    
    
    def get_image_info(ret, name, i):
        soup = BeautifulSoup(ret, "html.parser")
        img = soup.select(".ImageBody img")[0]
        image_path = img["src"]  # 获取图片地址
        image_name = name  # 获取图片中文所属
        img_name = f"{image_name}_{i}.{os.path.basename(image_path).split('.')[1]}"  # 获取图片真实名字
        # 图片存储
        image_dir = f"girl/{image_name}"
        if not os.path.isdir(image_dir):
            os.makedirs(image_dir)
        # 远程打开图片写入到本地  第一种方式open
        # with open(f"{image_dir}/{img_name}", mode="wb") as add:
        #     add.write(requests.get(image_path).content)
        # 远程打开图片写入到本地  第二种方式urllib
        request.urlretrieve(image_path, filename=f"{image_dir}/{img_name}")
    
    
    print("已经开始执行了,可能需要等待一会,请您耐心等待!")
    begin_time = int(time.time())
    get_page_info()
    end_time = int(time.time())
    print(f"当前脚本执行了{end_time - begin_time}秒")
    print("执行已经结束了")

    2、简单的爬取首页展示图片代码

    import os
    import requests
    from bs4 import BeautifulSoup
    from urllib import request
    
    url_address = 'https://www.umei.cc'
    list_url = url_address + '/meinvtupian/meinvxiezhen/'
    obj = requests.get(list_url)
    obj.encoding = obj.apparent_encoding
    content = obj.text

    # 格式化页面 soup
    = BeautifulSoup(content, 'html.parser') li_soup = soup.select(".TypeList")[0].findAll("li") dir = "./girls/" for i in li_soup: if not os.path.isdir(dir): os.makedirs(dir) img_path = i.img["src"] img_suffix = os.path.basename(img_path).split('.')[1] img_url = dir + i.span.string + '.' + img_suffix request.urlretrieve(img_path, img_url)
  • 相关阅读:
    artDialog基本使用
    SQL数据类型(SQL Server六个类型使用)
    常用SQL语句大全(SQL Server)
    从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
    从PRISM开始学WPF(番外)共享上下文 RegionContext-更新至Prism7.1
    从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1
    从PRISM开始学WPF(六)MVVM(二)Command-更新至Prism7.1
    从PRISM开始学WPF(四)Prism-Module-更新至Prism7.1
    从PRISM开始学WPF(二)认识Prism-更新至Prism7.1
    从PRISM开始学WPF(一)认识WPF-更新至Prism7.1
  • 原文地址:https://www.cnblogs.com/liucysun/p/14862902.html
Copyright © 2011-2022 走看看