六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 72|回复: 0

Python抓取图片

[复制链接]

升级  3.33%

13

主题

13

主题

13

主题

秀才

Rank: 2

积分
55
 楼主| 发表于 2013-1-15 02:22:43 | 显示全部楼层 |阅读模式
# -*- coding: cp936 -*-import  urllibimport urllib2import randomimport os,sysfrom sgmllib import SGMLParserclass 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 filedef 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);    parser.feed(doc);    img = parser.img    parser.close()    for i in range(0,len(img)):        if img[i][0:4]!='http':#处理绝对路径            img[i]=rq+img[i]    return imgdef 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 urlsdef depth(url,dep,ospath):    '''三个参数分别是    url : 需要下载的网站地址    dep :需要遍历的深度     ospath:图片下载的本地文件夹         '''    global num    if dep<=0:        return 0    else:        img=get_img(url)        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 1if __name__ == '__main__':    imglenth = 1           #设置需要下载的图片大小。     num=0    depth('http://tieba.baidu.com/f?kz=820731958',1,"E:\\python\\GetImageFromWeb\\img\\")       print '********************************我爬完了!!******************************************' 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表