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

复制代码 代码如下:

#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>.*?&gt',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'

时间: 2025-01-20 21:54:33

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

猎豹浏览器怎么批量下载网页图片

  1.打开猎豹浏览器点击左上角头像→猎豹应用市场(http://store.liebao.cn/) 2.搜索图片批量 3.点击"Fatkun图片批量下载"应用安装 4.打开所需要批量下载的图片页面 5.点击"Fatkun图片批量下载"图片进行图片批量查看(支持所有页面以及当前页面) 6.点击"保存图片"进行图片批量下载 7.弹出提示,需要关闭下载前询问每个文件的保存位置(点击猎豹浏览器点击左上角头像→设置→更多设置里关闭[下载前询问每个文件的保

有哪一款软件可以在批量下载网页图片的同时自动更改图片标题?

问题描述 有哪一款软件可以在批量下载网页图片的同时自动更改图片标题? < i mg src=""http://www.baidu.com/group1/M00/79/DF/ea893a83373aa25f0c968ad9a0528a97.gif"" alt="""">< p class = "" comment "" > 优美的风景画 < / p >

PHP下载远程图片并保存到本地方法总结_php实例

1.获取远程文件大小及信息的函数 function getFileSize($url){ $url = parse_url($url); if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port'],$error)){ fputs($fp,"GET ".(empty($url['path'])?'/':$url['path'])." HTTP/1.1\r\n"); fputs($fp,&qu

python批量下载豆瓣图片代码

溜达豆瓣的时候,发现一些图片,懒得一个一个扒,之前写过c#和python版本的图片下载,因此拿之前的Python代码来改了改,折腾出一个豆瓣版本,方便各位使用 # -*- coding:utf8 -*- import urllib2, urllib, socket import re import requests from lxml import etree import os, time DEFAULT_DOWNLOAD_TIMEOUT = 30 class AppURLopener(url

php批量下载网页图片并替换路径为本地

一篇文章复制过来,发现图片路径都是别人网站的,如何一键下载这些图片到本地,并且修改成为本地的路径呢.    代码如下 复制代码 /**  * 获取替换文章中的图片路径  * @param string $xstr 内容 采集网页的content  * @param string $keyword 创建照片的文件名 我写upimg  * @param string $oriweb 网址 一般写null  * @return string  *  */ function replaceimg($xs

猎豹浏览器如何批量下载图片

  1.打开猎豹浏览器点击左上角头像→猎豹应用市场(http://store.liebao.cn/) 2.搜索图片批量 3.点击"Fatkun图片批量下载"应用安装 4.打开所需要批量下载的图片页面 5.点击"Fatkun图片批量下载"图片进行图片批量查看(支持所有页面以及当前页面) 6.点击"保存图片"进行图片批量下载 7.弹出提示,需要关闭下载前询问每个文件的保存位置(点击猎豹浏览器点击左上角头像→设置→更多设置里关闭[下载前询问每个文件的保

百度图片批量下载怎么样

  百度图片下载器是一款可以批量下载百度图片的软件,而且还能帮你删减重复图片.是一款能够根据关键字而下载图片的软件,非常简单实用.下面小编介绍一下它的特点和界面. 百度图片下载器特点介绍: 1.最好用的百度图片下载器,一键快速批量下载百度亿万精美图片; 2.快速高效的图片检索和多任务下载,下载进度实时显示,包括下载速度.耗时.已下载.下载状态等; 3.支持图片即时预览.分享到微博等社交网站.设为桌面壁纸.图片另存为等快捷实用功能; 4.支持批量任务管理,可批量添加关键字下载任务到队列,方便任务批

人人桌面如何批量下载?

  人人桌面如何批量下载?不少网友都会将一些照片分享到人人桌面上,也有网友会在人人桌面上浏览让人的相册照片.如果看到喜欢的照片想要下载下来,但是,照片数量太多的话,下载起来非常不方便该怎么办呢?在今天的教程中,我们就给大家分享一下人人桌面批量下载相册图片的方法! 谷歌浏览器插件 方法一:使用谷歌浏览器插件帮助人人桌面批量下载相册 第一步.还是去下载谷歌浏览器;(推荐:谷歌浏览器最新版下载地址) 第二步.下载完成后,打开chrome在线商店,咱们去下载并安装插件:人人网改造器,操作如首图. 安装完

winform 中显示异步下载的图片_C#教程

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { ////利用 WebClient 来下载图片 using (WebClient wc = new WebClient()) { ////WebClient 下载完毕的响应事件绑定 wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_Dow