多线程爬虫批量下载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的dict,set,list,tuple应用详解
Jul 24 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
Python 基础教程之闭包的使用方法
Sep 29 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
python实现维吉尼亚算法
Mar 20 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 Python
Python import模块的缓存问题解决方案
Jun 02 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
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
微信小程序使用字体图标的方法
2019/05/23 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
pycharm实现猜数游戏
2020/12/07 Python
Django中ORM的基本使用教程
2020/12/22 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
事业单位个人应聘自荐信
2013/09/21 职场文书
预备党员政审材料
2014/02/04 职场文书
给老师的检讨书
2014/02/11 职场文书
法人代表任命书范本
2014/06/05 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
医德医魂心得体会
2014/09/11 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers
Java获取字符串编码格式实现思路
2022/09/23 Java/Android