多线程爬虫批量下载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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
python使用递归解决全排列数字示例
Feb 11 Python
python之yield表达式学习
Sep 02 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
Python中的日期时间处理详解
Nov 17 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
python数据类型强制转换实例详解
Jun 22 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
Python 爬虫性能相关总结
Aug 03 Python
10个python爬虫入门实例(小结)
Nov 01 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 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
德生PL330测评
2021/03/02 无线电
一个域名查询的程序
2006/10/09 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
详解react如何在组件中获取路由参数
2017/06/15 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Python txt文件如何转换成字典
2020/11/03 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
中国医药集团国药在线:国药网
2017/02/06 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
教师师德反思材料
2014/02/15 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
春游踏青活动方案
2014/08/14 职场文书
公司搬迁通知
2015/04/20 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记