通过python进行单网页内图片爬取及下载
一、前言
我作为因为兴趣而刚入门python不久的新手,当初学python的小目标就是爬取知乎上各种各样好看的图片,上个月学会了python基本语法后,这个月前几周一直在上课+考试+课程设计比较忙,只是用闲暇时间看python入门的书籍,后来又了解到想做爬虫需要用到正则表达式和HTML的知识,所以也看了这方面的书,但那段时间并没有实际编程,直到这周一课程设计结束才开始真正编写python爬虫,到现在终于可以爬取下载单个网页的图片了!
在学习的过程中,我分别尝试爬取了百度贴吧、知乎、CSDN博客,发现了一些不同之处,所以想写下来作为学习心得,与大家共享。
(第一次写与python有关的文章,由于对HTML语言仅为初学,有些关于HTML的措辞可能不对,欢迎指正)
在这篇文章中,我想讨论的是:
利用python进行单网页内图片爬取及下载过程中:
1. 图片爬取步骤
2.解析网站代码的方式:
2.1正则表达式解析
2.2Beautiful soup模块解析
2.3Beautiful soup模块内搭配正则表达式
3.下载图片:
3.1利用正则表达式识别图片后缀名:知乎
4.推荐书籍
二、正文
1,图片爬取步骤
(用到模块:urllib、urllib.request 、re、BeautifulSoup)
1, 使用urllib.request.urlopen()获得网页源代码
2, 使用解析工具解析网页源代码,获得图片网址
3, 使用urllib.request.urlretrieve()下载图片
我使用的python版本是python3.6。
怎样用python爬取图片并下载,很多视频教程和博客上都有详细的指导,在此就不赘述啦,感觉我也不太擅长写教程。
2,解析网站代码的方式
在学习python基础语法时就听说如果要做爬虫,正则表达式是要会的,那时还不知道有Beautifulsoup,就从图书馆借了本有关正则表达式的书看了起来,很薄的书每天带着也不累(我会推荐在最后的参考书籍里)。但是也因为天天上课而没有实践正则,这几天才有时间真正敲字符进行模式匹配,感觉正则很好用,Beautiful soup则是后来看视频学到的。
2.1 正则表达式解析
爬取到网页源代码后,就可以用正则匹配出和图片有关的节点。
节点示例:(来源贴吧)
<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=1d16f7798544ebf86d716437e9f8d736/823fb13533fa828bd0685399ff1f4134970a5a06.jpg"pic_ext="jpeg" changedsize="true" width="560" height="882">我的正则匹配模式:
pat = re.compile(r'<img class="BDE_Image".+?"(.+?)".+?>') images = re.findall(pat, html)变量imges为一个列表,包含所有匹配成功内容中”()”内的部分,在其中以字符串形式保存。
这样既能找到节点,括号内又能返回我想要的图片网址。
2.2 Beautiful soup模块解析
节点示例同上文,这次用Beautifulsoup里的findall函数来提取标签
函数用法:
soup = BeautifulSoup(html,"html.parser") imges = soup.find_all('img',class_ = "BDE_Image")变量imges为一个包含所有节点的列表,节点在其中以字符串形式保存。
2.3 Beautiful soup模块内搭配正则表达式
后来了解到,Beautiful soup内也可以搭配正则表达式来使用,因此我们可以将上一个函数修改为:
soup = BeautifulSoup(html,"html.parser") img = soup.find_all('img',class_ = re.compile(r'[A-Z]_[a-z]'))感觉更灵活了哈哈
3.下载图片
基本上各个网站图片都类似上图(来源知乎)这样,以img作为标签,包含宽度、高度
,并在src属性中包含图片的url,与百度贴吧的不同之处在于,知乎的图片节点中还包括一项data-original属性,而其包含的url为图片原图的url(当爬取桌面壁纸时,通过src属性与data-original属性的值下载的图片差别会很明显)。
src属性所对应的图片全部是.jpg格式,所以下载时只需要在文件路径后加上.jpg就可以了。而data-original属性即原图中图片格式较多,不一而全,可以用正则表达式匹配出url末尾的图片格式并放入urllib.request.urlretrieve()函数的路径参数中,使每一张图片下载后不至于因格式不同而出现问题。
具体代码如下:
pat = re.compile(r'.+?com/.+?(\.[a-z]+)') reg = re.findall(pat,images_url) suffix = "".join(reg) urllib.request.urlretrieve(images_url, filename +'\\'+ str(i) + suffix)(其中srt(i)是对图片的编号,在for循环中读入url并下载,i每循环递增 )
4,参考书籍
共4本,都是我自己在看或看完的觉得很好的书,附豆瓣截图。
《像计算机科学家一样思考Python》
《学习正则表达式》
《Python编程》
《白话大数据与机器学习》
这本书是这学期平常没有事情又学不进专业书籍时看的,别看书名叫白话,实际里面介绍完了后就开始上数学公式或用法,这学期学了一门课,名字是数值分析方法,里面有一些公式倒是在这本书里看到实际用法了。
感觉像是大数据与机器学习的科普书,我是通过它对大数据和机器学习有了一个初步的认识。对了,里面的代码时python写的。
像大数据、机器学习、图像识别等都是近些年新兴的领域,我虽初学乍道,却也很想了解下它们。
三、写在最后
当然,还有一些没有实现的问题,这些将是我继续学习的目标:
1, 知乎一个问题下有多个回答,如何识别多个回答并依次爬取。
2, 通过cookies模拟登录知乎。
3, 代码封装问题。
本篇文章禁止转载,同时发表在我的知乎专栏
欢迎关注
- Python获取网页上图片下载地址的方法
- 【Python】python3实现网页爬虫下载图片
- Python 爬虫学习 网页图片下载
- Python3下载网页中的图片
- python爬虫一:必应图片(从网页源代码中找出图片链接然后下载)
- Python筛选网页中的网址,下载图片
- Python3实现Web网页图片下载
- Python下载网页图片
- 用Python3下载网页图片
- PYthon 批量下载网页图片
- 【Python】Python的urllib模块、urllib2模块进行网页下载文件
- python使用re, os, httplib, urllib批量下载网页上的图片
- 利用Python2下载单张图片与爬取网页图片实例代码
- 爬虫--python3实现网页爬虫下载图片
- python批量下载网页图片及列表
- PYthon 批量下载网页图片
- 【转】python下载网页图片代码
- Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
- 关于我使用htmlparser,以及通过htmllparse下载网页中的图片
- 动态生成二维码图片后通过js(JavaScript)或jq实现网页图片转base64格式下载