Python爬虫入门——爬取贴吧图片

最近忽然想听一首老歌,“I believe” 于是到网上去搜,把几乎所有的版本的MV都看了一遍(也是够无聊的),最喜欢的还是最初版的《我的野蛮女友》电影主题曲的哪个版本,想起女神全智贤,心血来潮,于是就想到了来一波全MM的美照,哪里有皂片呢?自然是百度贴吧了。

放上链接-————

  1. http://tieba.baidu.com/p/3466236659  
http://tieba.baidu.com/p/3466236659

爬取贴吧图片是非常简单的一件事,我们要做的是这么几步:

1、获取要爬取的网址

2、获取此网址的HTML源码

3、用正则表达式找出源码中的图片地址

4、下载图片,完活儿!

就是这么简单。

下面来看代码:

一、预备:

首先要引入相应的python模块。

[python] view plain copy
print ?
  1. import re  
  2. //正则表达式模块,用来匹配图片地址  
  3. import urllib  
  4. //用来获取HTML源码  
  5. import sys    
  6. reload(sys)   
  7. sys.setdefaultencoding(’utf8’)  
  8. //解决文字编码的问题,事实上我的电脑没有这段也OK  
import re
//正则表达式模块,用来匹配图片地址
import urllib
//用来获取HTML源码
import sys  
reload(sys) 
sys.setdefaultencoding('utf8')
//解决文字编码的问题,事实上我的电脑没有这段也OK


二、获取网址源码这一部分十分简单,就是调用urllib模块的函数,直接上代码

[python] view plain copy
print ?
  1. def getHtml(url):  
  2.     page = urllib.urlopen(url)  
  3.     html = page.read()  
  4.     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、 ()表示 我们只取括号中的部分,省略之外的。


下面继续上代码:

[python] view plain copy
print ?
  1. def getImg(html, x):  
def getImg(html, x):
[python] view plain copy
print ?
  1. //imlist得到的是源码中符合正则reg的图片地址构成的列表  
  2.     reg = r’src=”(http://img.*?\.jpg)”’  
  3.     imgre = re.compile(reg)  
  4.     imList = re.findall(reg, html)  
  5. //打印列表有助于我们在运行中监控他  
  6.     print(imList)  
  7.     for i in imList:  
  8.         print(i)  
  9.         print x  
  10.         urllib.urlretrieve(i, ’%s.jpg’ % x)//下载地址为i的图片,并用x.jpg命名。  
  11.         x += 1  
  12.     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 x
        urllib.urlretrieve(i, '%s.jpg' % x)//下载地址为i的图片,并用x.jpg命名。
        x += 1
    return x
这里要说明一下,x变量是我们在下载图片时的计数变量,同时也是命名变量,因为一个帖子是有很多个页面的,因此我们需要处理的HTML源码也有很多个。

将x返回,是为了下次再调用GetImg()的时候,x可以接着上一次的继续累加。


四、多个页面

最后,我们来处理一下多个页面的问题。

非常简单,看图


只需要在网址后面加上?pn=页数 就好了

[python] view plain copy
print ?
  1. url = “http://tieba.baidu.com/p/3466236659?pn=”  
  2. for k in range(128):  
  3.     ul = url+str(k)  
  4.     print ul  
  5.     html = getHtml(ul)  
  6.     # print html  
  7.     x = getImg(html, x)  
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)


好啦,完成!

下面贴上完整代码:

[python] view plain copy
print ?
  1. import re  
  2. import urllib  
  3. import sys    
  4. reload(sys)   
  5. sys.setdefaultencoding(’utf8’)  
  6. def getHtml(url):  
  7.     page = urllib.urlopen(url)  
  8.     html = page.read()  
  9.     return html  
  10.   
  11. def getImg(html, x):  
  12.     reg = r’src=”(http://img.*?\.jpg)”’  
  13.     imgre = re.compile(reg)  
  14.     imList = re.findall(reg, html)  
  15.   
  16.     print(imList)  
  17.     for i in imList:  
  18.         print(i)  
  19.         print x  
  20.         urllib.urlretrieve(i, ’%s.jpg’ % x)  
  21.         x += 1  
  22.     return x  
  23.   
  24.   
  25. x = 1  
  26. url = ”http://tieba.baidu.com/p/3466236659?pn=”  
  27. for k in range(128):  
  28.     ul = url+str(k)  
  29.     print ul  
  30.     html = getHtml(ul)  
  31.     # print html  
  32.     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 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)


下面是我爬到的成果:



希望对大家有帮助。


晚安,明天还有一天的课,估计起不来了。。。。。。。

PS:我是不会翘课的!


————————————————————————————————————————————————————————————————

昨天第一次发blog,格式和图片都没有弄好,多多包涵啦

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值