多线程爬虫批量下载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中sets模块的用法实例
Sep 30 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Python实现微信公众平台自定义菜单实例
Mar 20 Python
python轻松实现代码编码格式转换
Mar 26 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
pandas 缺失值与空值处理的实现方法
Oct 12 Python
pytorch 自定义参数不更新方式
Jan 06 Python
python如何实现单链表的反转
Feb 10 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
Banner程序
2006/10/09 PHP
php 生成随机验证码图片代码
2010/02/08 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
jQuery选择器及jquery案例详解(必看)
2016/05/20 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python将文本转换成图片输出的方法
2015/04/28 Python
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
对python中的logger模块全面讲解
2018/04/28 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
经贸韩语专业大学生职业规划
2014/02/14 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
普通党员个人整改措施
2014/10/27 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
小学班主任教育随笔
2015/08/15 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis