【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("\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
【python 3.6】从网站抓图并存放到本地路径的更多相关文章
- Python Locust对指定网站“一键压测”
[本文出自天外归云的博客园] 前篇 前篇:Python Locust性能测试框架实践 本篇 承上——归纳过程 在前篇的基础上,我们可以利用Locust性能测试框架编写python脚本对指定网站或者接口 ...
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
Python之路,Day22 - 网站用户访问质量分析监测分析项目开发 做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129 项目实战之 ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- python爬虫之天气预报网站--查看最近(15天)的天气信息(正则表达式)
python爬虫之天气预报网站--查看最近(15天)的天气信息(正则表达式) 思路: 1.首先找到一个自己想要查看天气预报的网站,选择自己想查看的地方,查看天气(例:http://www.tianqi ...
- python爬虫之12306网站--火车票信息查询
python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...
- python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- [转载]python实现带验证码网站的自动登陆
原文地址:python实现带验证码网站的自动登陆作者:TERRY-V 早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番 ...
- python爬取某个网站的图片并保存到本地
python爬取某个网站的图片并保存到本地 #coding:utf- import urllib import re import sys reload(sys) sys.setdefaultenco ...
- 推荐一个学习python非常好的网站
推荐一个入门python非常好的网站(也可以学习JAVA)非常适合入门,不说多易于理解,也是比较亲民的0基础学习教程,还免费…… 网址:https://www.liaoxuefeng.com/(廖雪峰 ...
随机推荐
- Nginx自定义模块编写:根据post参数路由到不同服务器
Nginx自定义模块编写:根据post参数路由到不同服务器 2014-05-05 15:27 blogread IT技术博客 字号:T | T Nginx可以轻松实现根据不同的url 或者 get参数 ...
- 关于sharepoint如何做SSO,如何做OOS监视编辑
应客户需求,需要做sharepoint SSO,以前都是默认的AD验证,如果客户已经有一套SSO系统,验证过SSO之后就能自动登录,而不是浏览器上设置保存用户名密码的AD登陆. 怎么做呢? 首先sha ...
- 如何在运行jar指定使用的JDK
写一个.bat文件 例如在同文件夹下,新建一个run.bat文件 run.bat 的内容是如下: set JAVA_HOME=C:\jdk1.7.0_67set CLASSPATH=.;%JAVA_H ...
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
转载请标明出处: 原文首发于:>https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f9-sleuth/ 本文出自方志朋的博客 这篇文章主 ...
- Zabbix——设置阈值和报警
前提条件: Zabbix 服务器可以正常监控其他设备 Zbbix 已经配置完成了邮件报警 Zabbix server版本为4.0 配置ICMP监测,1分钟如果ping不通,将会发送邮件 找到Templ ...
- 搭建 Redis 的主从
主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率 ...
- MAMP:MySQL wasn't able to start
MAMP 我点击start server的时候 发现mysql服务器打不开 http://images.cnblogs.com/cnblogs_com/lwwen/1231721/o_11111111 ...
- margin中的bug解决方法
margin bug问题 : 当做子元素中使用margin-top: 50px;父子元素都会跑出50px, 解决方法: 在父元素中使用下面三种任意一种都可以. 方法一:给父元素加边框 border: ...
- PHP 获取客户端 IP 地址
先来了解一个变量的含义: $_SERVER['REMOTE_ADDR']:浏览当前页面的用户计算机的ip地址 $_SERVER['HTTP_CLIENT_IP']:客户端的ip $_SERVER['H ...
- Git 学习笔记–基本操作
Git 与 SVN 不同,是分布式的版本控制系统,不需要主服务器即可工作,实际中为了方便各个工作者间同步工作,通常还是会设置主服务器. Git的设置及初始化: 设置全局用户信息: luojiahu@u ...