zoukankan      html  css  js  c++  java
  • 【python 3.6】从网站抓图并存放到本地路径

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    _author_ = 'BH8ANK'
    
    import urllib.request
    import re
    import os
    import time
    
    #os.rmdir("D:/images")
    
    #1,打开页面,读取图片张数,抓html
    wangzhi = "https://www.zhihu.com/question/43551423"
    keywords = ".jpg"
    
    def get_html(url):
        page = urllib.request.urlopen(url)
        html = page.read()
        return html
    
    content = str(get_html(wangzhi))
    a = content.count(keywords)
    
    #print(content)
    #print("此页面有%d张图" %a)
    
    #2,匹配图片文件,抓jpg
    def get_image(html):
        t = r'src="(.+?.jpg)"' #正则表达式,匹配的是r后面的内容,这部分内容来自于网页的html
        img = re.compile(t)#将正则表达式翻译成它的对象
        html1 = html.decode('utf-8')
        # html用decode('utf-8')进行解码,由bytes变成string。
        # py3的urlopen返回的不是string是bytes,如果没有这一步,就会报下面的错
        #    return _compile(pattern, flags).findall(string)
        #TypeError: cannot use a string pattern on a bytes-like object
    
        img_list = re.findall(img,html1)#在html中找到所有符合正则表达式的图片,存入列表list
        # try:                           #要么用异常处理方式,要么用if not判断路径是否存在
        #     os.mkdir("D:/images")
        # except FileExistsError:
        #     pass
        if not os.path.exists("D:/images"):#不存在即创建
            os.mkdir("D:/images")
        print("
    
    Creat Success
    ")
        # input()
        n = 1                              #此处要重点理解的是循环变量n,这个n一边控制循环,一边给抓到的图命名
        for html in img_list:
            urllib.request.urlretrieve(html, 'D:/images/%s.jpg' %n)
            print("抓到第%3d张图"  %n,end="") #如果写为%03d,则不满3位,前面加0,如果写为%3d,则右对齐,前面不加0
            '''
            上面print中用到了end='',表示后面的打印不换行
            下面的模块负责显示抓到第几张图片时,打印进度条
            '''
            N=0.05#每隔0.05秒打印一个=
            k=1#循环控制变量,一共打印20个=,最后打印Done
            while k < 20:
                print("=", end='', flush=True)
                time.sleep(N)
                k += 1
            print("Done")
            n += 1
        print("
    一共抓到%d张图"   %(n - 1))
        return img_list
        # for img_url in img_list:
        #     urllib.urlretrieve(img_url, 'D:/tmp/%s.jpg' % n)
        #     return img_list
    # c = get_image(get_html(wangzhi))
    # d = c.decode('utf-8')
    #
    # print(d)
    
    if __name__ == "__main__":
        daima = get_html(wangzhi)
        print(daima)#此为目标网页的html代码
    # input()
        get_image(daima)#从html中取出匹配的图片,并存放

    代码部分本身比较简单,重点需要理解的部分是re.compile和re.findall.

    容易出错的地方:

    1,下面两行,为什么要decode呢

        html1 = html.decode('utf-8')
        img_list = re.findall(img,html1)

    如果不decode,就会报错

    原因是:

    TypeError: can't use a string pattern on a bytes-like object.

    html用decode('utf-8')进行解码,由bytes变成string。

    py3的urlopen返回的不是string是bytes,这一点和py2有差异。

    2,下面这句的意思是筛选 【src="(.+?.jpg)"】,这部分内容是通过查看网页html来确定的

      t = r'src="(.+?.jpg)"' 

    3,创建文件夹时,需要判断当前路径下,是否有这个文件夹,可以采用两种方式,if not 或者try except

  • 相关阅读:
    下载linux历史版本
    CentOS7 常用命令集合
    oracle初级系列教程
    redis内存数据的持久化方式
    使用Spring 或Spring Boot实现读写分离( MySQL实现主从复制)
    三个线程ABC,交替打印ABC
    wait,notify,notifyAll详细介绍
    索引优化分析
    Git常用命令使用大全
    长连接 、短连接、心跳机制与断线重连(转载)
  • 原文地址:https://www.cnblogs.com/BH8ANK/p/8940562.html
Copyright © 2011-2022 走看看