首页 > 编程 > Python > 正文

Python系列之五_爬虫抓图

2019-11-06 07:51:42
字体:
来源:转载
供稿:网友

  Python系列之五_爬虫抓图

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

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

  我们的思路是这样的:

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

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

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

  一、抓取HTML源代码

#!/usr/bin/python# -*- coding: UTF-8 -*-import urllibdef get_html(url):    page = urllib.urlopen(url)    html = page.read()    return htmlht = 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 urllibimport redef get_html(url):    page = urllib.urlopen(url)    html = page.read()    return htmldef get_img(html):    reg = r'src="(http.+?/.jpg)"'    img_re = re.compile(reg)    img_list = re.findall(img_re, html)    return img_listht = 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 urllibimport redef get_html(url):    page = urllib.urlopen(url)    html = page.read()    return htmldef 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_listht = get_html("http://tieba.baidu.com/p/5004440579")for i in get_img(ht):    print i


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表