利用python3.x实现小爬虫下载贴吧内图片

Hi, I'm back.

 
寒假在家只有一台笔记本,也懒得把台式机上的键盘拆下来用,因此编程被我暂时搁置,转而在网易云课堂上学了一下Python。可惜的是云课堂的Python教程是基于Python2.x,而且更加悲剧的是我在网上买的《Python核心编程》也是基于Python2.x的。而我本着学新不学旧的原则,脑子一抽安装了Python3.4,导致我学着编写示例代码的时候总是小心翼翼生怕踩到雷区。不过私以为学2.x写3.x等于是把两个版本都学了一下,还是有点好处的。
 
回到学校之后学着视频里写了一个小脚本,功能很简单,就是下载贴吧图片帖内所有的图片到指定的文件夹。先上代码:
import re
import urllib.request

# ------ 获取网页源代码的方法 ---
def getHtml(url):
    page = urllib.request.urlopen(url)
    html = page.read()
    return html

# ------ getHtml()内输入任意帖子的URL ------
html = getHtml("http://tieba.baidu.com/p/3205263090")
# ------ 修改html对象内的字符编码为UTF-8 ------
html = html.decode('UTF-8')

# ------ 获取帖子内所有图片地址的方法 ------
def getImg(html):
    # ------ 利用正则表达式匹配网页内容找到图片地址 ------
    reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
    imgre = re.compile(reg);
    imglist = re.findall(imgre, html)
    return imglist

imgList = getImg(html)
imgName = 0
for imgPath in imgList:
    # ------ 这里最好使用异常处理及多线程编程方式 ------
    f = open("pic/"+str(imgName)+".jpg", 'wb')
    f.write((urllib.request.urlopen(imgPath)).read())
    f.close()
    imgName += 1

print("All Done!")

 

先总结一下在编写过程中被“坑”的地方(Python:怪我咯?)
1.urllib在Python3.x中发生了改变,按照这份脚本来说,原本在urllib下的urlopen()方法现在在urllib.request下。
2.必须修改html对象内的字符编码,因为获取的字符都是以字节形式保存在对象中(因此图片可以直接通过read()方法保存在文件中)。
3.正则表达式修改了好几次,这个下面说。
4.Python中没有i++这种写法,所以"pic/"+str(++imgName)+".jpg"没有效果。
 
(以下为废话,如果你是百度这份代码直接使用的话下面的内容可以忽略)
说一下和正则表达式“斗智斗勇”的过程。
贴吧中图片标签内是这么写的
<img class="..." src="..." pic_ext="jpeg" ...>

一开始我的想法很简单,正则表达式如下

reg = r'src="(.*\.jpg)" pic="jpeg"'

因为“.”这个元操作符会匹配换行符外所有字符,因此当爬到格式为png或者gif的图片的时候也会匹配,差不多就是下面这种效果:

[..., 'http://.....png" ....... <src="...jpg"']
简单来说就是会从无关图片的“src”一直匹配到我需要下载的图片的末尾“pic="jpeg"”
解决的办法就是匹配到空格的时候就忽略,所以要将“.”和“\S”放在同一个字符类中,要么匹配除了空白符之外的所有字符,要么忽略。
 
小彩蛋时间,这是我下载到的所有图片(逃

posted on 2015-03-16 09:28  粥煦尘  阅读(6906)  评论(0编辑  收藏  举报

导航