第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-)
关于python3的urllib模块,可以看这篇博客:传送门
首先是用urlopen打开网站并且获取网页内容,通过查看网页源代码,可以很容易的发现图片的格式都是差不多的,所以用正则表达式来匹配即可。
1 from urllib import request 2 import re 3 4 def get_pic(): 5 web = request.urlopen(r'http://tieba.baidu.com/p/2166231880') 6 page = web.read() 7 page = page.decode() 8 9 regex = re.compile(r'<img.*?class="BDE_Image" src="(.*?)".*?>') 10 pic = re.findall(regex, page) 11 return pic 12 13 def save(save_pic): 14 path = 'D:pythonproject爬虫结果' 15 count = 0 16 for pic in save_pic: 17 request.urlretrieve(pic, '%s/%s.jpg' % (path, count)) 18 count += 1 19 20 pic = get_pic() 21 save(pic)
之后我又用BeautifulSoup模块来进行了爬图,这个方法确实简单多了。这位博主对于BeautifulSoup的介绍十分不错:传送门
1 from bs4 import BeautifulSoup 2 from urllib import request 3 4 url = 'http://tieba.baidu.com/p/2166231880' 5 path = 'D:pythonproject爬虫结果' 6 7 page = request.urlopen(url).read() 8 page = page.decode() 9 10 soup = BeautifulSoup(page, 'lxml') 11 count = 0 12 13 pic_list = soup.findAll("img", class_ = 'BDE_Image') 14 for pic in pic_list: 15 pic = pic['src'] #获取列表中的src内容 16 request.urlretrieve(pic, '%s/%s.jpg' % (path, count)) 17 count += 1
引用一下该博客中的一段话:
函数原型:
findAll(tag,attributes,recursive,text,limit,keywords);
find(tag,attributes,recursive,text,keywords);
参数:
tag:标签参数tag前面我们已经看到过很多次了,你可以传一个标签的名称或者多个标签名称组成的python列表作为标签参数。
例如此代码是返回HTML文档中所有标题标签的列表:.findAll({"h1","h2","h3","h4","h5","h6"})
attributes:属性参数attributes是用一个python字典封装一个标签的若干个属性和对应的属性值。
例如此代码会返回HTML文档里红色和绿色两种颜色的span标签:.findAll("span",{"class":{"green","red"}})
recursive:递归参数recursive是一个布尔变量。你想抓取HTML文档标签结构里多少层的信息?如果recursive设为True,findAll函数就会根据你的要求去查找标签参数中的所有子标签,以及子标签的子标签。如果recursive设置为False,findAll函数就只查找文档的一级标签。findAll函数默认是支持递归查找的(recursive默认值是True),一般情况下这个参数不需要设置,除非你真正想要了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。
text:文本参数text有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。假如我们想查找前面网页中包含“the prince”内容的标
签数量,我们可以用这个代码:
nameList=bsObj.findAll(text="the prince")
print (len(nameList))
limit:范围限制参数limit,显然只用于findAll方法。find其实等价于findAll的limit等于时的情形。如果你只对网页中获取的前n项结果感兴趣,就可以设置它。但是需要注意,这个参数设置之后,获得的前几项结果按照网页上的 顺序排序的,未必是你想要的那前几项。
keyword:这个参数可以让你选择那些具有特定属性的标签。
例如:allText=bsObj.findAll(id="text"),这个代码可以让你获得所有id为text的标签的内容。