版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!
前面章节的代码可以看出,我们并没有把「好笑数」,「图像的url地址」取到,从糗百主页我们可以看到有些用户发表的段子里包含了图片,那我们怎么取到这些图片呢,本篇老谢将教会大家如何把网络上的图片取到本地,这个技能你们一定要get到。get到了以后再看到漂亮妹子的图片再也不用右键将图片保存在本地了,哈哈哈…;此种神功,我练定了。
练此神功口诀
通过糗事百科主页我们可以看出有些用户发表的段子带了图片,有些又没有图片只有文本内容,前面文章的代码我们只能取出每个用户的文本内容并不能取到图片内容,那么要怎么才能取到图片内容呢?
- 口诀一:观察!观察!观察!
重要的事说三遍,做爬虫最精髓的地方就是观察,外加一点猜测,观察什么呢,观察带图片发表的用户和只有文本用户在html源码中的区别,怎么在源码中快速找到它们的区别呢,当然是用F12开发者工具了,如果你是初学者请一定要看前面章节的内容。 - 口诀二: 过滤,筛选
观察过后,使用正则表达式过滤,筛选是个永恒的主题,当然后面我们还会讲到Beautify soup、xpath、lxml等第三方库,第三方库有它的优势,也有它的劣势,就拿Beautify Soup来说,如果我们访问的页面不标准或者不完整,那么你或许拿不到你想要的结果。这种第三方库解决不了的问题就只能用最原始的正则表达式了,所以学好正则表达式是你不得不具备的技能。
观察
通过F12开发者工具我们看看带图片的和不带图片的有什么区别,当我们通过快速定位是可以看到有图片的包含在一个…中,这个时候我们不要马上就取编写正则表达式,我们还得去看看没有图片的有没有包含这对元素,如果有那么我们编写代码的逻辑就会和没有的不一样了,通过观察我们发现不带图片的并没有包含…这对元素,如下图:
过滤
差异找到了剩下的就是过滤了,如何过滤呢,这里就需要我们稍稍东东脑子了,想想有的用户发表是带了图片的有的用户发表是没有带图片的,如果这个时候我们还像前面文章那样把正则表达式写在
这个表达式里,那么我们肯定得不到我们想要的结果,想想是为什么,因为如果某个用户没有发表图片,那么我们使用这个表达式肯定连该用户发表的文本信息也拿不到了。所以我们必须的把匹配图片的正则表达式和之前的正则表达式分开来写
编码实现
|
|
执行结果
|
|
从上图可以看到我们已经把图片下载到本地磁盘了。
代码解析
本次代码新增了一个正则表达式,一个目录创建,一个从通过url地址下载的函数
- picture = re.compile(r’.?src=”(.?)”‘, re.S):
该表达式的作用是匹配到图片的url地址 - makedirs:该函数是创建目录,于我们在linux系统中执行mkdir -p path1/path2/path3的功能是一样的,它可以层级递归的去创建目录,不需要我们手动每一级每一级的去创建目录, 看到这里是不是比windows创建目录方便多了。
- urlretrieve:该函数是下载一个网络对象到本地文件,该函数返回一个元组,(local_filename, headers),函数定义如下:
urllib.request.urlretrieve(url, filename=None, reporthook=None,data=None)
url就是我们要从网络中下载的文件地址,filename是下载后存放在本地的文件名 - os.path.basename(pictures[0]):该函数的作用是返回文件名,什么意思呢,pictures[0]取到是//pic.qiushibaike.com/system/pictures/11966/119663395/medium/app119663395.jpg地址,通过这个函数处理后我们得到将是app119663395.jpg
note: 作为初学者,学习一种语言就是要不断的敲代码,只有通过敲代码才能发现问题,然后修正问题,最后才能把别人的东西变成自己的,不然别人的永远都是别人的,一定要实践,切记!切记!
欢迎关注我的公众号:「爱做饭的老谢」,老谢一直在努力…