多線程爬蟲批量下載pcgame圖片url 保存為xml的實(shí)現(xiàn)代碼
#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):
'''
通過抓取網(wǎng)站導(dǎo)航欄,獲得網(wǎng)站的圖片類型
返回列表,每個(gè)列表元素為一個(gè)字典,addr代表圖片類型對于的鏈接,name代表圖片類型的名稱
錯(cuò)誤會(huì)返回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):
'''
獲取一個(gè)頁面的詳細(xì)信息
返回對于的字典列表
name:圖片的名字
cutaddr:縮小的瀏覽圖
picaddr:實(shí)際圖片的地址
'''
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源碼中獲取下一個(gè)頁面地址的名稱,最后一頁返回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):
'''
參數(shù)相冊圖集的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代碼,獲得一個(gè)相冊的詳細(xì)信息
kw:關(guān)鍵字
title:標(biāo)題
type:類型
pic:各個(gè)圖片的地址列表,末尾加上_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'
- 零基礎(chǔ)寫python爬蟲之抓取糗事百科代碼分享
- 零基礎(chǔ)寫python爬蟲之打包生成exe文件
- 零基礎(chǔ)寫python爬蟲之爬蟲編寫全記錄
- 零基礎(chǔ)寫python爬蟲之爬蟲框架Scrapy安裝配置
- 零基礎(chǔ)寫python爬蟲之使用Scrapy框架編寫爬蟲
- 簡單的抓取淘寶圖片的Python爬蟲
- Python實(shí)現(xiàn)爬取知乎神回復(fù)簡單爬蟲代碼分享
- Python實(shí)現(xiàn)抓取頁面上鏈接的簡單爬蟲分享
- 以Python的Pyspider為例剖析搜索引擎的網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)方法
- Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信
- 淺析Python中的多進(jìn)程與多線程的使用
- python3簡單實(shí)現(xiàn)微信爬蟲
- Python3中多線程編程的隊(duì)列運(yùn)作示例
- 淺析Python多線程下的變量問題
- 用Python實(shí)現(xiàn)一個(gè)簡單的多線程TCP服務(wù)器的教程
- python妹子圖簡單爬蟲實(shí)例
- Python實(shí)現(xiàn)多線程抓取妹子圖
- 基python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲
相關(guān)文章
Python+KgCaptcha實(shí)現(xiàn)驗(yàn)證碼的開發(fā)詳解
驗(yàn)證碼通常是為了區(qū)分用戶是人還是計(jì)算機(jī),也可以防止解開密碼等惡意行為,而客戶端上多數(shù)會(huì)用在關(guān)鍵操作上?,F(xiàn)在驗(yàn)證碼的種類樣式也特別多,本文主要介紹了如何用Python和KgCaptcha做出驗(yàn)證碼功能,需要的可以參考一下2023-04-04使用Python對網(wǎng)易云歌單數(shù)據(jù)分析及可視化
這篇文章主要介紹了使用Python對網(wǎng)易云歌單數(shù)據(jù)分析及可視化,本項(xiàng)目以數(shù)據(jù)采集、處理、分析及數(shù)據(jù)可視化為項(xiàng)目流程,需要的朋友可以參考下2023-03-03django 解決manage.py migrate無效的問題
今天小編就為大家分享一篇django 解決manage.py migrate無效的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實(shí)戰(zhàn)
這篇文章主要介紹了Python用內(nèi)置模塊來構(gòu)建REST服務(wù)與RPC服務(wù)實(shí)戰(zhàn),python在網(wǎng)絡(luò)方面封裝一些內(nèi)置模塊,可以用很簡潔的代碼實(shí)現(xiàn)端到端的通信,比如HTTP、RPC服務(wù),下文實(shí)戰(zhàn)詳情,需要的朋友可以參考一下2022-09-09PyTorch開源圖像分類工具箱MMClassification詳解
MMClassification是一款基于PyTorch的開源圖像分類工具箱,集成了常用的圖像分類網(wǎng)絡(luò),將數(shù)據(jù)加載,模型骨架,訓(xùn)練調(diào)參,流程等封裝為模塊調(diào)用,便于在模型間進(jìn)行轉(zhuǎn)換和比較,也高效簡潔的實(shí)現(xiàn)了參數(shù)調(diào)整2022-09-09tensorflow實(shí)現(xiàn)圖像的裁剪和填充方法
今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)圖像的裁剪和填充方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python實(shí)現(xiàn)統(tǒng)計(jì)文章閱讀量的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何溧陽Python語言實(shí)現(xiàn)統(tǒng)計(jì)文章閱讀量的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02使paramiko庫執(zhí)行命令時(shí)在給定的時(shí)間強(qiáng)制退出功能的實(shí)現(xiàn)
這篇文章主要介紹了使paramiko庫執(zhí)行命令時(shí),在給定的時(shí)間強(qiáng)制退出,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03