#!/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="http://t.zoukankan.com/(.+?.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="http://t.zoukankan.com/(.+?.jpg)"】,这部分内容是通过查看网页html来确定的
t = r'src="http://t.zoukankan.com/(.+?.jpg)"'
3,创建文件夹时,需要判断当前路径下,是否有这个文件夹,可以采用两种方式,if not 或者try except