闲来无事就编写了一个爬取美女图片并下载的爬虫。看好多爬虫都是爬妹子图的我就写编写了一个爬取妹子图网站上的图片。
需求:将妹子图网站上的首页到73页正文中的妹子图片爬取下来并保存在当前目录下
思路:通过查看网站的源代码发现,网站展示的图片都是有html链接的,每个图片都会链接到新的网址,来展示一个美女的多张图片。于是,需要先将以及界面的链接爬取出来,然后进入二级界面开始爬取并下载图片。
程序效果:通过简单的一个程序实现了图片的下载,在连续爬取了一个小时左右的时间爬取了大概有1000张图片。
遇到的问题:在编译的过程中发现妹子图的服务器经常当了啊,总是出现Sever unavaliable的情况。开始以为是程序问题,发现通过浏览器也登不进去,过一段时间又会恢复正常,是不是我的运气太差了,正赶上人家系统维护呢?
1 #encoding=utf-8 2 __author__ = ‘heng‘ 3 4 ‘‘‘ 5 项目目标:爬取www.meizitu.com上的美女的图片,并保存在当前文件夹 6 ‘‘‘ 7 8 import re 9 import urllib 10 import urllib2 11 import time 12 13 #获取网页的html源码 14 def HTML(url): 15 16 user_agent = ‘Mozilla/5.0(X11:Ubuntu;Linux x86_64;rv:38.0)Gecko/20100101Firefox/38.0‘ 17 headers = {‘User-Agent‘:user_agent} 18 req = urllib2.Request(url,headers=headers) 19 response = urllib2.urlopen(req) 20 the_html = response.read().decode(‘gbk‘) 21 return the_html 22 23 #从一级界面获取图片的链接 24 def FirstPage(html,url): 25 if url == ‘http://www.meizitu.com‘: #因为首页的源代码的格式和后面的页面的代码的风格不同,所以要特殊处理 26 myitems = re.findall(‘<h2><a href="(.*?)" title=‘,html,re.S) #将图片的网址链接提取出来 27 else: #处理剩下界面的源代码 28 myitems = re.findall(‘‘‘<h3 class="tit"><a href="(.*?)" target=‘_blank‘>‘‘‘,html,re.S) 29 30 return myitems 31 32 #从二级界面中爬取出妹子的图片并存储 33 def SecondPage(url): 34 html = HTML(url) 35 myitmes = re.findall(‘<img alt="(.*?)" src="(.*?)" /><br />‘,html,re.S) #获取妹子图片的名字和图片 36 for item in myitmes: 37 name = item[0] #存储图片的名字 38 picture = item[1] #存储图片 39 data = urllib2.urlopen(picture).read() 40 f = open(name + ‘.jpg‘,‘wb‘) #建立一个存储图片的jpg文件 41 f.write(data) #将图片写入文件保存 42 print "save%s"%name 43 time.sleep(0.1) 44 f.close() 45 print ‘%s save succeed!‘%name 46 47 def main(url): 48 html = HTML(url) 49 print ‘获取html成功‘ 50 first = FirstPage(html,url) 51 for ItemHtml in first: 52 SecondPage(ItemHtml) 53 print ‘第一页获取完毕‘ 54 for i in range(2,74): 55 url = str(url) + ‘/a/list_1_%s.html‘%i 56 html2 = HTML(url) 57 print url 58 for ItemHtml2 in FirstPage(html2,url): 59 SecondPage(ItemHtml2) 60 print ItemHtml2 61 print ‘%s page succeed‘%i 62 url = ‘http://www.meizitu.com‘ #这一句非常容易忽略,在爬取完这个界面之后一定要记得初始化 63 print ‘爬取完毕‘ 64 if __name__ == ‘__main__‘: 65 url = ‘http://www.meizitu.com‘ 66 main(url)
总结:程序写的比较简单,只是能完成自己的需求,其中还存在许多漏洞,比如没有添加异常处理,会遇到一些预想不到的问题。但是只要能完成自己的要求就够了,我也没有在进一步的优化。优化会比简单的编写一个程序麻烦的多。
原文:http://www.cnblogs.com/xiaoli2018/p/4621312.html