#!/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("\n\nCreat Success\n")
# 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("\n一共抓到%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

最新文章

  1. Vertica节点宕机处理一例
  2. Guava库介绍之集合(Collection)相关的API
  3. 如何有效使用Project(1)——编制进度计划、保存基准
  4. arm-linux-objdump
  5. ZooKeeper(3.4.5) - 配置伪集群模式
  6. springmvc错误 Spring3.X jdk8 java.lang.IllegalArgumentException
  7. POJ2586 Y2K Accounting Bug(贪心)
  8. web性能优化之---JavaScript中的无阻塞加载性能优化方案
  9. 无网络环境下安装Dynamics CRM
  10. 开源网络监控管理系统:OpenNMS
  11. 中国.NET:各地微软技术俱乐部汇总(更新中...)
  12. [转帖]Ansible管理windows集群
  13. [转]GitLab Continuous Integration (GitLab CI/CD)
  14. Tomcat7 1000并发量配置以及配置优化
  15. CSS实现水平居中的5种思路
  16. 51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
  17. django2.1---admin 修改模块的名字为中文显示
  18. JAVA对于程序的运行的一种解说
  19. 用uliweb 创建项目
  20. &quot;http://127.0.0.1:4723/wd/hub&quot;的解释

热门文章

  1. Knowledge Point 20180305 Java程序员详述编码Unicode
  2. Oracle作业3 —— 简单查询
  3. Centos6.5 VM网络故障,可以Ping 通网关,无法上网或者访问其它网段
  4. iOS手势识别器
  5. Lavavel5.5源代码 - RedisQueue是怎么实现
  6. while do while switch语句的简要分析
  7. ISAP学习笔记
  8. Tips &amp; Tricks Learned Releasing an Hybrid App Using Steroids.js
  9. 20145202mc《计算机病毒》实践2
  10. BZOJ3293_分金币_KEY