第 0013 题: 用 Python 写一个爬图片的程序,爬 这个连接里的日本妹子图片 :-)html
关于python3的urllib模块,能够看这篇博客:传送门python
首先是用urlopen打开网站而且获取网页内容,经过查看网页源代码,能够很容易的发现图片的格式都是差很少的,因此用正则表达式来匹配便可。web
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:\python\project\爬虫结果' 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:\python\project\爬虫结果' 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);url
find(tag,attributes,recursive,text,keywords);spa
参数:.net
tag:标签参数tag前面咱们已经看到过不少次了,你能够传一个标签的名称或者多个标签名称组成的python列表做为标签参数。code
例如此代码是返回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的标签的内容。