Python urllib2递归抓取某个网站下图片

需求:

抓取某个网站下图片

可定义 图片保存路径,最小图片大小域值,遍历深度,是否遍历到外站,抓取并下载图片


使用库:

urllib     http://docs.python.org/library/urllib.html【下载】

urllib2  http://docs.python.org/library/urllib2.html【抓取】

urlparse  http://docs.python.org/library/urlparse.html【url切分用到】

sgmllib  http://docs.python.org/library/sgmllib.html【html解析用到】


代码:

[python]  view plain copy print ?
  1. #!/usr/bin/python  
  2. # -*- coding:utf-8 -*-  
  3. # author: wklken  
  4. # 2012-03-17 wklken@yeah.net  
  5. #1实现url解析 #2实现图片下载 #3优化重构  
  6. #4多线程 尚未加入  
  7.   
  8. import os,sys,urllib,urllib2,urlparse  
  9. from sgmllib import SGMLParser   
  10.   
  11. img = []  
  12. class URLLister(SGMLParser):  
  13.   def reset(self):  
  14.     SGMLParser.reset(self)  
  15.     self.urls=[]  
  16.     self.imgs=[]  
  17.   def start_a(self, attrs):  
  18.     href = [ v for k,v in attrs if k=="href" and v.startswith("http")]  
  19.     if href:  
  20.       self.urls.extend(href)  
  21.   def start_img(self, attrs):  
  22.     src = [ v for k,v in attrs if k=="src" and v.startswith("http") ]  
  23.     if src:  
  24.       self.imgs.extend(src)  
  25.   
  26.   
  27. def get_url_of_page(url, if_img = False):  
  28.   urls = []  
  29.   try:  
  30.     f = urllib2.urlopen(url, timeout=1).read()  
  31.     url_listen = URLLister()  
  32.     url_listen.feed(f)  
  33.     if if_img:  
  34.       urls.extend(url_listen.imgs)  
  35.     else:  
  36.       urls.extend(url_listen.urls)  
  37.   except urllib2.URLError, e:  
  38.     print e.reason  
  39.   return urls  
  40.   
  41. #递归处理页面  
  42. def get_page_html(begin_url, depth, ignore_outer, main_site_domain):  
  43.   #若是设置排除外站 过滤之  
  44.   if ignore_outer:  
  45.     if not main_site_domain in begin_url:  
  46.       return  
  47.   
  48.   if depth == 1:  
  49.     urls = get_url_of_page(begin_url, True)  
  50.     img.extend(urls)  
  51.   else:  
  52.     urls = get_url_of_page(begin_url)  
  53.     if urls:  
  54.       for url in urls:  
  55.         get_page_html(url, depth-1)  
  56.   
  57. #下载图片  
  58. def download_img(save_path, min_size):  
  59.   print "download begin..."  
  60.   for im in img:  
  61.     filename = im.split("/")[-1]  
  62.     dist = os.path.join(save_path, filename)  
  63.     #此方式判断图片的大小太浪费了  
  64.     #if len(urllib2.urlopen(im).read()) < min_size:  
  65.     #  continue  
  66.     #这种方式先拉头部,应该好多了,不用再下载一次  
  67.     connection = urllib2.build_opener().open(urllib2.Request(im))  
  68.     if int(connection.headers.dict['content-length']) < min_size:  
  69.       continue  
  70.     urllib.urlretrieve(im, dist,None)  
  71.     print "Done: ", filename  
  72.   print "download end..."  
  73.   
  74. if __name__ == "__main__":  
  75.   #抓取图片首个页面  
  76.   url = "http://www.baidu.com/"  
  77.   #图片保存路径  
  78.   save_path = os.path.abspath("./downlaod")  
  79.   if not os.path.exists(save_path):  
  80.     os.mkdir(save_path)  
  81.   #限制图片最小必须大于此域值  单位 B  
  82.   min_size = 92  
  83.   #遍历深度  
  84.   max_depth = 1  
  85.   #是否只遍历目标站内,即存在外站是否忽略  
  86.   ignore_outer = True  
  87.   main_site_domain = urlparse.urlsplit(url).netloc  
  88.   
  89.   get_page_html(url, max_depth, ignore_outer, main_site_domain)  
  90.   
  91.   download_img(save_path, min_size)  



后续可以优化

1.使用多线程优化下载,目前多层遍历不够速度

2.使用BeautifulSoup写一个版本

3.加入图形界面......



2012-03-17

wklken


转载请注明出处:http://blog.csdn.net/wklken


其他相关文章链接:

http://blog.csdn.net/wklken/article/list/1



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值