最近忽然想听一首老歌,“I believe” 于是到网上去搜,把几乎所有的版本的MV都看了一遍(也是够无聊的),最喜欢的还是最初版的《我的野蛮女友》电影主题曲的哪个版本,想起女神全智贤,心血来潮,于是就想到了来一波全MM的美照,哪里有皂片呢?自然是百度贴吧了。
放上链接-————
- http://tieba.baidu.com/p/3466236659
http://tieba.baidu.com/p/3466236659
爬取贴吧图片是非常简单的一件事,我们要做的是这么几步:
1、获取要爬取的网址
2、获取此网址的HTML源码
3、用正则表达式找出源码中的图片地址
4、下载图片,完活儿!
就是这么简单。
下面来看代码:
一、预备:
首先要引入相应的python模块。
- import re
- //正则表达式模块,用来匹配图片地址
- import urllib
- //用来获取HTML源码
- import sys
- reload(sys)
- sys.setdefaultencoding(’utf8’)
- //解决文字编码的问题,事实上我的电脑没有这段也OK
import re
//正则表达式模块,用来匹配图片地址
import urllib
//用来获取HTML源码
import sys
reload(sys)
sys.setdefaultencoding('utf8')
//解决文字编码的问题,事实上我的电脑没有这段也OK
二、获取网址源码这一部分十分简单,就是调用urllib模块的函数,直接上代码
- def getHtml(url):
- page = urllib.urlopen(url)
- html = page.read()
- return html
def getHtml(url):page = urllib.urlopen(url)html = page.read()return html
返回的html自然是url页面的源码,如图
三、匹配源码中的图片地址 并下载之
源码到手之后,要做的就是寻找其中对我们有用的信息啦——就是全MM的图片。我们可以在chrome浏览器中按F12打开源码,或者是邮件图片,点检查,像这样
我们不难看到,我们关心的图片,在HTML中有着相当规范的格式(当然,全MM专贴中基本都是她的图片啦,这让我们的工作简单了好多好多!),就是
src=http://img.***********.jpg
我们用正则表达式,可以轻松完成。(这里不懂得小伙伴需要自己补充一下正则表达式的知识哦)
设置正则:
reg = r'src="(http://img.*?\.jpg)"'
备注:
1、 .*? 三个符号可以匹配任意多个任意符号
2、 \. 是将 ‘.’ 转义,代表的就是HTML中的 .
3、 ()表示 我们只取括号中的部分,省略之外的。
下面继续上代码:
- def getImg(html, x):
def getImg(html, x):
- //imlist得到的是源码中符合正则reg的图片地址构成的列表
- reg = r’src=”(http://img.*?\.jpg)”’
- imgre = re.compile(reg)
- imList = re.findall(reg, html)
- //打印列表有助于我们在运行中监控他
- print(imList)
- for i in imList:
- print(i)
- print x
- urllib.urlretrieve(i, ’%s.jpg’ % x)//下载地址为i的图片,并用x.jpg命名。
- x += 1
- return x
//imlist得到的是源码中符合正则reg的图片地址构成的列表reg = r'src="(http://img.*?\.jpg)"'imgre = re.compile(reg)imList = re.findall(reg, html)
//打印列表有助于我们在运行中监控他print(imList)for i in imList:print(i)print xurllib.urlretrieve(i, '%s.jpg' % x)//下载地址为i的图片,并用x.jpg命名。x += 1return x
这里要说明一下,x变量是我们在下载图片时的计数变量,同时也是命名变量,因为一个帖子是有很多个页面的,因此我们需要处理的HTML源码也有很多个。 将x返回,是为了下次再调用GetImg()的时候,x可以接着上一次的继续累加。
四、多个页面
最后,我们来处理一下多个页面的问题。
非常简单,看图
只需要在网址后面加上?pn=页数 就好了
- url = “http://tieba.baidu.com/p/3466236659?pn=”
- for k in range(1, 28):
- ul = url+str(k)
- print ul
- html = getHtml(ul)
- # print html
- x = getImg(html, x)
url = "http://tieba.baidu.com/p/3466236659?pn="
for k in range(1, 28):ul = url+str(k)print ulhtml = getHtml(ul)# print htmlx = getImg(html, x)
好啦,完成!
下面贴上完整代码:
- import re
- import urllib
- import sys
- reload(sys)
- sys.setdefaultencoding(’utf8’)
- def getHtml(url):
- page = urllib.urlopen(url)
- html = page.read()
- return html
- def getImg(html, x):
- reg = r’src=”(http://img.*?\.jpg)”’
- imgre = re.compile(reg)
- imList = re.findall(reg, html)
- print(imList)
- for i in imList:
- print(i)
- print x
- urllib.urlretrieve(i, ’%s.jpg’ % x)
- x += 1
- return x
- x = 1
- url = ”http://tieba.baidu.com/p/3466236659?pn=”
- for k in range(1, 28):
- ul = url+str(k)
- print ul
- html = getHtml(ul)
- # print html
- x = getImg(html, x)
import re
import urllib
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def getHtml(url):page = urllib.urlopen(url)html = page.read()return htmldef getImg(html, x):reg = r'src="(http://img.*?\.jpg)"'imgre = re.compile(reg)imList = re.findall(reg, html)print(imList)for i in imList:print(i)print xurllib.urlretrieve(i, '%s.jpg' % x)x += 1return xx = 1
url = "http://tieba.baidu.com/p/3466236659?pn="
for k in range(1, 28):ul = url+str(k)print ulhtml = getHtml(ul)# print htmlx = getImg(html, x)
下面是我爬到的成果:
希望对大家有帮助。
晚安,明天还有一天的课,估计起不来了。。。。。。。
PS:我是不会翘课的!
————————————————————————————————————————————————————————————————
昨天第一次发blog,格式和图片都没有弄好,多多包涵啦