爬虫爬取pcgame的图片库,,仅仅是例子,只是爬去Co


仅仅是例子,只是爬去Cosplay图片区的图片,并打印出对应的图片标题

#coding=gbkimport urllib2,re,osdef readsrc(src):    try:        url = urllib2.urlopen(src)        content = url.read()#.decode('utf-8')        return content    except:        print 'error'        return Nonedef pictype(content):    '''    通过抓取网站导航栏,获得网站的图片类型    返回列表,每个列表元素为一个字典,addr代表图片类型对于的链接,name代表图片类型的名称    错误会返回None    '''    p = re.compile(r'<ul>(.*)</ul>',re.S)    r=p.search(content)    if r:        content=r.group()    else:        print None    p = re.compile(r'<li\\s*.*?>\\s*<a href *= *"(?P<addr>.*?)">(?P<name>.*?)\\s*</a>\\s*</li>')    l = [i.groupdict() for i in p.finditer(content)]    l=l[1:]    if len(l):return l    else:return Nonedef pageinfo(src):    '''    获取一个页面的详细信息    返回对于的字典列表    name:图片的名字    cutaddr:缩小的浏览图    picaddr:实际图片的地址    '''    d=os.path.split(src)[0]    try:        url = urllib2.urlopen(src)        content = url.read()#.decode('utf-8')    except:        print 'error'        return None    #find all the pictures info in a page    p = re.compile(r'<ul.*?>(.*?)</ul>',re.S)    r = p.findall(content)    if not r: return None    r = r[1]    p = re.compile(r'<li><a href="(?P<picaddr>.*?)".*?><img.*?alt="(?P<name>.*?)" *src="(?P<cutaddr>.*?)" */></a>.*?</li>')    l = [ i.groupdict() for i in p.finditer(r)]    for i in l:        i['picaddr']=d+'/'+i['picaddr']    if len(l): return l    else: return Nonedef nextpageaddr(src):    '''    从页面的html源码中获取下一个页面地址的名称,最后一页返回None    '''    content=readsrc(src)    p = re.compile(r'<a class="next" href="(.*?)">.*?</a>')    r = p.search(content)    if r:        return os.path.dirname(src)+"/"+r.group(1)    else:        return Nonedef picinfoaddr(src):    '''    参数相册图集的html代码    返回全部图片的相对地址    '''    content=readsrc(src)    p = re.compile(r'<div class="picinfo">.*?<a href="(?P<addr>.*?)".*?>.*?</div>',re.S)    r = p.search(content)    if r:        return os.path.dirname(src)+"/"+r.group(1)    else:        return Nonedef parseinfo(content):    '''    读取全部图片html代码,获得一个相册的详细信息    kw:关键字    title:标题    type:类型    pic:各个图片的地址列表,末尾加上_220x165,_medium,_small 可以得到不同大小的图片    '''    info={}    temp=str()    #title    temp=''    r=re.search('<h1>(.*?)</h1>',content)#get the pic title    if r:        temp = r.group(1)    info['title']=temp    #keyword    temp=''    r=re.search('<meta name="keywords" content="(.*?)" />',content)    if r:        temp = r.group(1)    info['kw']=temp    #type    r=re.findall('<i><a.*?>(.*?)</a></i>.*?&gt',content)    if r:        info['type']='&'.join(r)    else:        info['type']=''    r=re.search('<ul class=".*?">(.*?)</ul>',content,re.S)    if not r:return None    content=r.group(1)#filter content#    print content    r=re.findall('<a href=".*?<img.*?src="(.*?)".*?</a>',content)    print r    for index,i in enumerate(r):        r[index]=i[0:i.rfind('_')]#        print r[index]    print info['title'],r    info['pic']=r    return infopath='C:\\\\pict\\\\'#下载的路径#os.mkdir(path)content=readsrc('http://photos.pcgames.com.cn/cate/3/1.html')r=pictype(content)print r[3]['name']addr = r[3]['addr']m=pageinfo(addr)while addr:    for i in m:        info=parseinfo(readsrc(i['picaddr']))        name=info['title']#        print info['title'],info['kw'],info['pic'],info['type']#        print 'downloading ',name#        foldname=path+name+"\\\\"#        os.mkdir(foldname)#        print info['pic']        for (n,picurl) in enumerate(info['pic']):            print 'downloading ',name,n            f=open('c:\\\\'+name+'_'+str(n)+".jpg","wb")            f.write(readsrc(picurl+'.jpg'))            f.close()    addr=nextpageaddr(addr)print 'end'#该片段来自于http://byrx.net

评论关闭