python爬虫抓图_Python系列之五_爬虫抓图

本文介绍了如何使用Python编写爬虫程序抓取网页HTML源代码,解析出图片链接,并下载所有图片。通过urllib库获取网页内容,正则表达式解析图片URL,最后使用urlretrieve下载图片。
摘要由CSDN通过智能技术生成

Python系列之五_爬虫抓图

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

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

6357797a417f6a24182517d3966d5021.png

我们的思路是这样的:

首先,把这个网页的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,在源代码中查看图片的链接:

d3b91423a236759344775d20f9f39bc9.png

发现图片在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文件夹,图片都下来啦:

fb0ab20f66f1d786457ff984a0045eb7.png

四、结尾

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

http://www..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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值