zoukankan      html  css  js  c++  java
  • 简单的爬取并下载图片的程序

      闲来无事就编写了一个爬取美女图片并下载的爬虫。看好多爬虫都是爬妹子图的我就写编写了一个爬取妹子图网站上的图片。

      需求:将妹子图网站上的首页到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)

    总结:程序写的比较简单,只是能完成自己的需求,其中还存在许多漏洞,比如没有添加异常处理,会遇到一些预想不到的问题。但是只要能完成自己的要求就够了,我也没有在进一步的优化。优化会比简单的编写一个程序麻烦的多。

  • 相关阅读:
    Spring Bean的生命周期
    Java中的Object类
    Java线程池七个参数
    ROS 第五讲 在模拟器中构建第一个机器人
    ROS 第四讲 让小车在RViz与Gazebo模拟器中跑起来
    ROS 第三讲 操控小乌龟
    ROS 第二讲 基本操作
    ROS 第一讲 引入
    自然语言处理(二) 新词发现或非监督词典构建
    递归找到一个复杂对象中的某个值和它的最小层级
  • 原文地址:https://www.cnblogs.com/xiaoli2018/p/4621312.html
Copyright © 2011-2022 走看看