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..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