热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

用Python写的多线程爬虫批量下载pcgame的图片url并保存为xml格式,主要是逻辑代码,喜欢的朋友可以测试下
代码如下:


#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'

    (.*)
',re.S)
r=p.search(content)
if r:
cOntent=r.group()
else:
print None
p = re.compile(r'\s*.*?)">(?P.*?)\s*\s*')

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'(.*?)',re.S)
r = p.findall(content)
if not r: return None
r = r[1]
p = re.compile(r'

  • .*?)" *src="(?P.*?)" */>.*?
  • ')
    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'')
    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'

    .*?.*?

    ',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('

    (.*?)

    ',content)#get the pic title
    if r:
    temp = r.group(1)
    info['title']=temp

    #keyword
    temp=''
    r=re.search('',content)
    if r:
    temp = r.group(1)
    info['kw']=temp

    #type
    r=re.findall('(.*?)
    .*?>',content)
    if r:
    info['type']=':'.join(r)
    else:
    info['type']=''
    r=re.search('

      (.*?)
    ',content,re.S)
    if not r:return None
    cOntent=r.group(1)#filter content
    # print content
    r=re.findall('',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'

    推荐阅读
    • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
    • VScode格式化文档换行或不换行的设置方法
      本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
    • android listview OnItemClickListener失效原因
      最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
    • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
    • Nginx使用(server参数配置)
      本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
    • 基于layUI的图片上传前预览功能的2种实现方式
      本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
    • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
    • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
    • 如何去除Win7快捷方式的箭头
      本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
    • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
    • Java实战之电影在线观看系统的实现
      本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
    • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
    • Webpack5内置处理图片资源的配置方法
      本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
    • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
    • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
      本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
    author-avatar
    徐大总统_584
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有