Python抓取图片





# -*- coding: utf-8 -*-  

import  urllib  
import urllib2  
import random  
import os,sys  
from sgmllib import SGMLParser  

class URLLister(SGMLParser):  
    '''''获取html中的图片地址\url地址,装入list中'''  
    def reset(self):  
        SGMLParser.reset(self)  
        self.img = []  
        self.urls = []  
    def start_img(self, attrs):  
        img = [v for k, v in attrs if k=='src']  
        if img:  
            self.img.extend(img)  
    def start_a(self, attrs):  
        href = [v for k, v in attrs if k=='href']  
        if href:  
            self.urls.extend(href)  
  
  
def get_docum(url):  
    #url=url+'//'  
    sock=urllib.urlopen(url)  
    file=sock.read()  
    sock.close()  
    return file  
  
def is_img(url):  
    global imglenth  
    request=urllib2.Request(url)
    opener=urllib2.build_opener()  
    try:  
        con=opener.open(request)  
        Type=con.headers.dict['content-type'][:5] 		#判断链接返回的 content-type是不是图片。  
        Length =int(con.headers.dict['content-length'])		#判断图片大小  
        if Length>imglenth:  
            return Type  
        else:  
            return 0  
    except:  
        print sys.exc_info()[0],sys.exc_info()[1]  		##一般来说这样就足够了  
        print '该图片无法在服务器找到或者图片地址无法识别!'  
        print url  

def get_file_name(ospath,imgname,num):   
    #name = 'P'+str(random.randint(10000000,99999999))  
    #filepath = "%s%s.%s" % (ospath,name,(imgname.split('.'))[-1])  
    #保留原文件名  
    idx=imgname.rfind("/")  
    filename=imgname  
    if idx > -1:  
        filename=imgname[idx+1:]  
    filepath=ospath+'%d_'%num+filename  
    print filepath  
    return filepath                  

def get_img(rq):  
    parser = URLLister();
    doc=get_docum(rq);
    print doc
    parser.feed(doc); 
    img = parser.img
    #print img
    parser.close()  
    for i in range(0,len(img)):  
        if img[i][0:4]!='http':			#处理绝对路径  
            img[i]=rq+img[i]  
    return img  

def get_url(rq):  
    parser = URLLister();    doc=get_docum(rq);    parser.feed(doc);    urls = parser.urls  
    parser.close()  
    for i in range(0,len(urls)):  
        if urls[i][0:4] != 'http': 		#处理绝对路径  
            urls[i] = rq+urls[i]  
    return urls  
  
def depth(url,dep,ospath):  
    '''''三个参数分别是 
    url : 需要下载的网站地址 
    dep :需要遍历的深度  
    ospath:图片下载的本地文件夹      
    '''  
    global num  
    if dep<=0:  
        return 0  
    else:  
        img=get_img(url) 
 	#print img 
        for j in range(0,len(img)):  
            if is_img(img[j]) == 'image':
                filepath = get_file_name(ospath,img[j],num+1);  
                if (os.path.exists(filepath)):  
                    pass  
                try:  
                    urllib.urlretrieve(img[j], filepath)  
                    print '已经下载好第%d张图片'%(num+1)  
                    num+=1  
                except:  
                    print '该图片无法下载或者图片地址无法识别!'  
                    print img[j]  
            else:  
                pass  
        urls=get_url(url)  
        if len(urls)>0:  
            for url in urls:  
                depth(url,dep-1,ospath)  
        else:  
            return 0  
        return 1  
 

if __name__ == '__main__':  
    imglenth = 1           		#设置需要下载的图片大小。   
    num=0  
    depth("http://taobaocdn.com/tps/",2,"/home/sina/work/picture/picture")
#    depth('http://tieba.baidu.com/f?kz=820731958',1,"/home/sina/work/picture") 
    print '********************************我爬完了!!******************************************' 


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值