Jadual Kandungan
(.*?)
Rumah pembangunan bahagian belakang Tutorial Python 多线程爬虫批量下载pcgame图片url 保存为xml的实现代码

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

Jun 16, 2016 am 08:46 AM
multithreading Muat turun kelompok reptilia

复制代码 代码如下:

#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'
  • 多线程爬虫批量下载pcgame图片url 保存为xml的实现代码.*?)" * */>.*?
  • ')
        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'

    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    Video Face Swap

    Video Face Swap

    Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

    Artikel Panas

    <🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    Nordhold: Sistem Fusion, dijelaskan
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
    3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Topik panas

    Tutorial Java
    1670
    14
    Tutorial PHP
    1273
    29
    Tutorial C#
    1256
    24
    Pengecualian fungsi C++ dan multithreading: pengendalian ralat dalam persekitaran serentak Pengecualian fungsi C++ dan multithreading: pengendalian ralat dalam persekitaran serentak May 04, 2024 pm 04:42 PM

    Pengendalian pengecualian fungsi dalam C++ amat penting untuk persekitaran berbilang benang untuk memastikan keselamatan benang dan integriti data. Pernyataan cuba-tangkap membolehkan anda menangkap dan mengendalikan jenis pengecualian tertentu apabila ia berlaku untuk mengelakkan ranap program atau rasuah data.

    Bagaimana untuk melaksanakan multi-threading dalam PHP? Bagaimana untuk melaksanakan multi-threading dalam PHP? May 06, 2024 pm 09:54 PM

    PHP multithreading merujuk kepada menjalankan berbilang tugas secara serentak dalam satu proses, yang dicapai dengan mencipta benang berjalan secara bebas. Anda boleh menggunakan sambungan Pthreads dalam PHP untuk mensimulasikan tingkah laku berbilang benang Selepas pemasangan, anda boleh menggunakan kelas Thread untuk mencipta dan memulakan utas. Contohnya, apabila memproses sejumlah besar data, data boleh dibahagikan kepada berbilang blok dan bilangan benang yang sepadan boleh dibuat untuk memprosesnya secara serentak untuk meningkatkan kecekapan.

    Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Apr 26, 2024 pm 04:15 PM

    Teknik concurrency dan multithreading menggunakan fungsi Java boleh meningkatkan prestasi aplikasi, termasuk langkah berikut: Memahami konsep concurrency dan multithreading. Manfaatkan pustaka konkurensi dan berbilang benang Java seperti ExecutorService dan Callable. Amalkan kes seperti pendaraban matriks berbilang benang untuk memendekkan masa pelaksanaan. Nikmati kelebihan peningkatan kelajuan tindak balas aplikasi dan kecekapan pemprosesan yang dioptimumkan yang dibawa oleh concurrency dan multi-threading.

    Bagaimanakah fungsi PHP berkelakuan dalam persekitaran berbilang benang? Bagaimanakah fungsi PHP berkelakuan dalam persekitaran berbilang benang? Apr 16, 2024 am 10:48 AM

    Dalam persekitaran berbilang benang, gelagat fungsi PHP bergantung pada jenisnya: Fungsi biasa: thread-safe, boleh dilaksanakan secara serentak. Fungsi yang mengubah suai pembolehubah global: tidak selamat, perlu menggunakan mekanisme penyegerakan. Fungsi operasi fail: tidak selamat, perlu menggunakan mekanisme penyegerakan untuk menyelaraskan akses. Fungsi operasi pangkalan data: Mekanisme sistem pangkalan data yang tidak selamat perlu digunakan untuk mengelakkan konflik.

    Bagaimana untuk menangani sumber yang dikongsi dalam multi-threading dalam C++? Bagaimana untuk menangani sumber yang dikongsi dalam multi-threading dalam C++? Jun 03, 2024 am 10:28 AM

    Mutex digunakan dalam C++ untuk mengendalikan sumber perkongsian berbilang benang: buat mutex melalui std::mutex. Gunakan mtx.lock() untuk mendapatkan mutex dan menyediakan akses eksklusif kepada sumber yang dikongsi. Gunakan mtx.unlock() untuk melepaskan mutex.

    Penggunaan rangka kerja ujian unit JUnit dalam persekitaran berbilang benang Penggunaan rangka kerja ujian unit JUnit dalam persekitaran berbilang benang Apr 18, 2024 pm 03:12 PM

    Terdapat dua pendekatan biasa apabila menggunakan JUnit dalam persekitaran berbilang benang: ujian berbenang tunggal dan ujian berbilang benang. Ujian berutas tunggal dijalankan pada utas utama untuk mengelakkan isu konkurensi, manakala ujian berbilang utas dijalankan pada utas pekerja dan memerlukan pendekatan ujian disegerakkan untuk memastikan sumber yang dikongsi tidak terganggu. Kes penggunaan biasa termasuk menguji kaedah selamat berbilang benang, seperti menggunakan ConcurrentHashMap untuk menyimpan pasangan nilai kunci, dan utas serentak untuk beroperasi pada pasangan nilai kunci dan mengesahkan ketepatannya, mencerminkan aplikasi JUnit dalam persekitaran berbilang benang. .

    Cabaran dan tindakan balas pengurusan memori C++ dalam persekitaran berbilang benang? Cabaran dan tindakan balas pengurusan memori C++ dalam persekitaran berbilang benang? Jun 05, 2024 pm 01:08 PM

    Dalam persekitaran berbilang benang, pengurusan memori C++ menghadapi cabaran berikut: perlumbaan data, kebuntuan dan kebocoran memori. Tindakan balas termasuk: 1. Menggunakan mekanisme penyegerakan, seperti mutex dan pembolehubah atom 2. Menggunakan struktur data tanpa kunci 3. Menggunakan penunjuk pintar 4. (Pilihan) Melaksanakan pengumpulan sampah;

    Cabaran dan strategi untuk menguji program berbilang benang dalam C++ Cabaran dan strategi untuk menguji program berbilang benang dalam C++ May 31, 2024 pm 06:34 PM

    Pengujian program berbilang benang menghadapi cabaran seperti ketidakbolehulangan, ralat konkurensi, kebuntuan dan kekurangan keterlihatan. Strategi termasuk: Ujian unit: Tulis ujian unit untuk setiap utas untuk mengesahkan kelakuan utas. Simulasi berbilang benang: Gunakan rangka kerja simulasi untuk menguji program anda dengan kawalan ke atas penjadualan benang. Pengesanan perlumbaan data: Gunakan alat untuk mencari perlumbaan data yang berpotensi, seperti valgrind. Nyahpepijat: Gunakan penyahpepijat (seperti gdb) untuk memeriksa status program masa jalan dan mencari sumber perlumbaan data.

    See all articles