Python系列之五_爬虫抓图

  Python系列之五_爬虫抓图


  前面我们粗略地学习了Python语言的语法,一直学语法也挺无聊的,现在让我们让做一些有趣的事情。


  例如你在百度贴吧里看到一篇文章,里面有很多好看的图片,但是一张张另存比较慢,学完Python语言后,我们可以编写一个爬虫程序,把所有图片全部抓下来。



  我们的思路是这样的:

  首先,把这个网页的HTML源代码先抓下来;

  然后,分析HTML源代码,找出所有图片的链接;

  最后把所有图片下载下来。


  一、抓取HTML源代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib


def get_html(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

ht = get_html("http://tieba.baidu.com/p/5004440579")
print ht
  下面我们来分析这段代码。

  “import urllib”这句表示导入urllib这个库,感觉有点像Java的import。

  def部分是定义一个函数,函数需要与前面隔开两行。函数体缩进一层。

  urllib.urlopen()函数用于打开一个url,并返回一个页面对象。

  page.read()函数读取页面的html源代码。


  运行这段代码,可以发现控制台打印出了html源代码。


  二、解析HTML源代码并找出所有图片链接
  这里需要用到正则表达式。现在正则表达式可以说是几乎所有编程语言必会的知识点了。


  我们利用Chrome浏览器的开发者工具,按快捷键F12,在源代码中查看图片的链接:



  发现图片在HTML源代码中,格式都有:src="http*.jpg"

  下面编写一段代码解析其中的图片链接:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
import re


def get_html(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html


def get_img(html):
    reg = r'src="(http.+?\.jpg)"'
    img_re = re.compile(reg)
    img_list = re.findall(img_re, html)
    return img_list

ht = get_html("http://tieba.baidu.com/p/5004440579")
li = get_img(ht)
for i in li:
    print i
  在这段程序中,编写了另一个函数get_img,用于根据html源代码,解析图片链接。

  由于使用到正则表达式,所以引入了re库。

  在get_img函数中,首先定义一个正则表达式reg,其中r前缀表示它是一个正则表达式。

  src="(http.+?\.jpg)"这串字符表示我们要在html源代码中查找的匹配项,正则表达式定义一些规则,可以通配。

  其中:

    .  匹配任意字符

    +  表示前面的内容出现1次或多次

    *  表示前面的内容出现0次或多次

    ?  匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
  如果正则表达式中出现以上通配符,则用反斜杠进行转义。

  所以,src="(http.+?\.jpg)"就表示http后可以带任意字符,任意字符出现1次或多次,后缀名为.jpg。一对小括号表示里面的内容是我们要截取的信息。


  上述程序运行后,发现还有一些问题,它把一些不是图片的片断也取出来了,所以后来我把正则表达式修改为:

  reg = r'src="(http[^"]+?\.jpg)"'

  其中[^"]表示http后的字符不能是双引号,^符号表示排除,除了双引号外其它任意字符都匹配。


  三、下载所有图片

  在上一步拿到图片链接之后,剩下的工作就很简单了,Python中下载数据很简单,有非常简单好用的库。

def get_img(html):
    reg = r'src="(http[^"]+?\.jpg)"'
    img_re = re.compile(reg)
    img_list = re.findall(img_re, html)
    n = 0
    for img_url in img_list:
        urllib.urlretrieve(img_url, 'E:/tmp/%s.jpg' % n)
        n += 1
    return img_list
  我们修改了一下get_img()函数,并添加了几句代码。
  在代码中,主要调用了urllib的urlretrieve()函数,这个函数的两个参数,第1个参数表示要下载的url,第2个参数表示要保存的本地文件名。

  由于我们想让图片依次命名为1.jpg、2.jpg、...,所以定义了一个变量n,让它递增。

  还有一个用法可能比较陌生:'E:/tmp/%s.jpg' % n,在Python的字符串中可以定义一个占位符,就象C语言一样,有%d、%s等,其后,跟上实际用到的变量,如果有两个以上占位符,需要用一个小括号,例如:'%s: %d' % ('张三', 22)


  运行结束,查看一下本地的E:/tmp文件夹,图片都下来啦:



  四、结尾

  在写这篇文章时,由于本人是Python语言初学者,所以参考了一些网上的文章,特别感谢“虫师”的一篇文章,把文章的链接贴出,大家参照学习:

  http://www.cnblogs.com/fnng/p/3576154.html


  在此,也将我的完整源代码贴出来:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
import re


def get_html(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html


def get_img(html):
    reg = r'src="(http[^"]+?\.jpg)"'
    img_re = re.compile(reg)
    img_list = re.findall(img_re, html)
    n = 0
    for img_url in img_list:
        urllib.urlretrieve(img_url, 'E:/tmp/%s.jpg' % n)
        n += 1
    return img_list

ht = get_html("http://tieba.baidu.com/p/5004440579")
for i in get_img(ht):
    print i

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值