多线程爬虫批量下载pcgame图片url 保存为xml的实现代码


Posted in Python onJanuary 17, 2013
#coding=gbk
from xml.dom import minidom,Node
import urllib2,re,os
def readsrc(src):
    try:
        url = urllib2.urlopen(src)
        content = url.read()#.decode('utf-8')
        return content
    except:
        print 'error'
        return None
def 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 None
def 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 None
def 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 None
def 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 None
def 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>.*?>',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)
    for index,i in enumerate(r):
        r[index]=i[0:i.rfind('_')]
#        print r[index]
    info['pic']=r
    return info
import threading
class mthread(threading.Thread):
    def __init__(self,tp,addr,lock):
        threading.Thread.__init__(self)
#        self.doc = minidom.Document()
        self.doc=minidom.Document()
        self.tp=tp
        self.lock=lock
        self.addr=addr
        self.thread_stop=False
        self.picdoc=None
    def run(self):
        self.picdoc = self.doc.createElement('urlclass')
#        print self.tp
        self.picdoc.setAttribute('type',self.tp)
#        self.doc.appendChild(self.picdoc)
        m=pageinfo(self.addr)
        while self.addr:
            for i in m:
#                print i['picaddr']
                picaddr=picinfoaddr(i['picaddr'])
#                print picaddr
                info=parseinfo(readsrc(picaddr))
                name=info['title']

                picture=doc.createElement('picture')
                title = doc.createElement('title')
                title.appendChild(doc.createTextNode(info['title']))
                picture.appendChild(title)
                keyword = doc.createElement('keywords')
                keyword.appendChild(doc.createTextNode(info['kw']))
                picture.appendChild(keyword)
                tp = doc.createElement('pictype')
                tp.appendChild(doc.createTextNode(info['type']))
                picture.appendChild(tp)
                cuturl = doc.createElement('piccut')
                cuturl.appendChild(doc.createTextNode(i['cutaddr']))
                picture.appendChild(cuturl)
                urls = doc.createElement('urls')
                self.lock.acquire()
                print 'downloading ',name
                self.lock.release()
                for picurl in info['pic']:
                    singleurl=doc.createElement('url')
                    singleurl.appendChild(doc.createTextNode(picurl+'.jpg'))
                    urls.appendChild(singleurl)
                picture.appendChild(urls)
                self.picdoc.appendChild(picture)
            m=pageinfo(self.addr)
            self.addr=nextpageaddr(self.addr)
#        f = open('c:\\'+self.tp+'.xml','w')
#        f.write(doc.toprettyxml(indent = ''))
#        f.close()
    def stop(self):
        self.thread_stop=True

path='C:\\pict\\'#下载的路径
#import sys
sys.exit(12)
content=readsrc('http://photos.pcgames.com.cn/cate/3/1.html')
r=pictype(content)
lt=[]
doc = minidom.Document()
root=doc.createElement('url_resource')
root.setAttribute('type','url')
root.setAttribute('urltype','image')
root.setAttribute('imgfmt','jpg')
doc.appendChild(root)
lock=threading.RLock()
for iaddr in r:
    print 'downloading type: ',iaddr['name']
    addr=iaddr['addr']
    th=mthread(iaddr['name'],addr,lock)
    lt.append(th)
    th.start()
for t in lt:
    t.join()
    root.appendChild(t.picdoc)
print 'write'
f = open('c:\\'+'urls'+'.xml','w')
f.write(doc.toprettyxml(indent = ''))
f.close()
print doc.toprettyxml()
print 'end'
Python 相关文章推荐
Python获取服务器信息的最简单实现方法
Mar 05 Python
pycharm安装图文教程
May 02 Python
python如何让类支持比较运算
Mar 20 Python
高效使用Python字典的清单
Apr 04 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
Python高效编程技巧
Jan 07 #Python
Python内置函数bin() oct()等实现进制转换
Dec 30 #Python
python的id()函数解密过程
Dec 25 #Python
python cookielib 登录人人网的实现代码
Dec 19 #Python
python 多线程应用介绍
Dec 19 #Python
Python多线程学习资料
Dec 19 #Python
python搭建简易服务器分析与实现
Dec 15 #Python
You might like
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
PHP开发中常用的字符串操作函数
2011/02/08 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
tsconfig.json配置详解
2019/05/17 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python运行的17个时新手常见错误小结
2012/08/07 Python
python中精确输出JSON浮点数的方法
2014/04/18 Python
Cpy和Python的效率对比
2015/03/20 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
深入了解python中元类的相关知识
2019/08/29 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
虚拟机下载python是否需要联网
2020/07/27 Python
Python实现上下文管理器的方法
2020/08/07 Python
Python list和str互转的实现示例
2020/11/16 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
商场端午节活动方案
2014/01/29 职场文书
海飞丝广告词
2014/03/20 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
银行求职自荐信范文
2015/03/04 职场文书
小学运动会入场口号
2015/12/24 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书