您的位置:首页 > 编程语言 > Python开发

通过python进行单网页内图片爬取及下载

2017-06-23 16:57 239 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fancyfancy2017/article/details/73649957

一、前言

    我作为因为兴趣而刚入门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, 代码封装问题。

 

本篇文章禁止转载,同时发表在我的知乎专栏

欢迎关注












内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: