Python 数据挖掘多线程与多处理

Python 数据挖掘多线程与多处理,python,twisted,urllib3,Python,Twisted,Urllib3,我编写并重写了我的小python应用程序,现在我的python技能还不够。我从一个以Beauty Soup作为解析器的单线程应用程序开始,改为lxml。使脚本多线程化,我发现了twisted,但无法将这个小片段更改为twisted。我会把这篇文章贴在这里,也许你们可以告诉我更好的方向,让这篇文章快一点。要获取15万页,我需要大约1小时。我很高兴,因为当我第一次尝试写它时,我的速度慢了3倍 #/usr/bin/python #编码:ISO-8859-1 导入时间、PySQLPool、队列、线程 从

我编写并重写了我的小python应用程序,现在我的python技能还不够。我从一个以Beauty Soup作为解析器的单线程应用程序开始,改为lxml。使脚本多线程化,我发现了twisted,但无法将这个小片段更改为twisted。我会把这篇文章贴在这里,也许你们可以告诉我更好的方向,让这篇文章快一点。要获取15万页,我需要大约1小时。我很高兴,因为当我第一次尝试写它时,我的速度慢了3倍

#/usr/bin/python
#编码:ISO-8859-1
导入时间、PySQLPool、队列、线程
从urllib3从url导入连接
从lxml导入etree
将cStringIO作为StringIO导入
标题={
“用户代理”:“Mozilla/4.77[en](X11;I;IRIX;64 6.5 IP30),
“接受”:“text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”,
‘接受语言’:‘en-us;q=0.5,en;q=0.3’,
“接受编码”:“gzip,deflate”,
“接受字符集”:“utf-8;q=0.7,*;q=0.7”
}
t=time.time()
PySQLPool.getNewPool().maxActiveConnections=60
db=PySQLPool.getNewConnection(username='user',password='pass',host='127.0.0.1',db='fddb')
池=来自url的连接('http://fddb.info/,maxsize=60,超时=150,头数=headers)
detailCounter=0
URL={}
queue=queue.queue()
out\u queue=queue.queue()
清洁_行={
“Brennwert”:“详细信息”,
“Kaloren”:“详细信息”,
“蛋白质”:“细节蛋白质”,
“Kohlenhydrate”:“详细信息”,
“davon Zucker”:“细节”,
“达文普立万”:“普立万详情”,
“费特”:“细节”,
“压路石”:“压路石细节”,
“Broteinheiten”:“细节”,
“醇”:“醇的详细信息”,
“胆甾醇”:“胆甾醇详情”,
“科芬”:“细节”,
“Wassergehalt”:“详细信息”,
“维生素C”:“详细信息”,
“维生素A”:“详细信息”,
“维生素D”:“详细信息”,
“维生素E”:“详细信息”,
“维生素B1”:“详细信息”,
“维生素B2”:“详细信息”,
“维生素B6”:“详细信息”,
“维生素B12”:“维生素B12详情”,
“钠”:“钠的细节”,
“艾森”:“细节”,
“Zink”:“详细信息”,
“镁”:“镁的细节”,
“氯气”:“氯气详情”,
“漫画”:“细节”,
“Schwefel”:“详细信息”,
“钾”:“钾的细节”,
“Kalzium”:“细节”,
“荧光粉”:“荧光粉详情”,
“库普费尔”:“细节”,
“福陆”:“福陆详情”
}
def行\u转义(文本):
对于项,输入干净的行。项()
text=text.replace(项,键)
text=text.rstrip()
返回文本
清洁_值={
“kJ”:“,
“kcal”:“kcal”,
“g”:“,
“mg”:“,
"%"    :"",
","    :".",
u“\u03bc”:”
}
def值_转义(文本):
对于item,输入clean_值。items():
text=text.replace(项,键)
text=text.rstrip()
返回文本
def插件详细信息(容器、食品编号):
c=PySQLPool.getNewQuery(db)
查询_行=“”
查询值=“”
对于容器中的项目:
查询_rows+=项['row']+','
查询值+=项['value']+','
c、 查询(“插入到详细信息(%sdetails\u id,foods\u id)值(%sURL,%s)”%(查询行,查询值,foods\u id))
c、 查询(“更新食物集食物检查='1'其中食物id=%d”%(食物id))
def getHP(url):
r=pool.request('GET','/'+url)
返回r.data
类ThreadUrl(threading.Thread):
定义初始(自我、队列、输出队列):
threading.Thread.\uuuuu init\uuuuuu(自)
self.queue=队列
self.out\u队列=out\u队列
def运行(自):
尽管如此:
host=self.queue.get()
data=getHP(主机[0])
self.out\u queue.put([数据,主机[1]])
self.queue.task_done()
类DatamineThread(threading.Thread):
def u u初始(自,出队列):
threading.Thread.\uuuuu init\uuuuuu(自)
self.out\u队列=out\u队列
def运行(自):
尽管如此:
全局详细信息计数器
qData=self.out\u queue.get()
数据=qData[0]
食品id=qData[1]
容器=[]
parser=etree.HTMLParser(encoding='cp1252')
tree=etree.parse(StringIO.StringIO(数据),解析器)
divx=tree.xpath('//div[@style=“background color:#f0f5f9;padding:2px 4px;”或@style=“padding:2px 4px;”])
对于divx中的xdiv:
x=etree.ElementTree(element=xdiv,parser=parser)
value=x.xpath('string(//div/text())')
label=x.xpath('string(//*[self::a或self::span]/text()))
标签=行\转义(标签)
如果值中没有“[nodata]”:
如果值为u“\u03bc”:
值=值\u转义(值)
项目4=0
项目4=浮动(值)
第4项=第4项/1000
append({'row':label,'value':str(item4)})
其他:
append({'row':标签,'value':值\u转义(值)})
详细计数器+=1
容器=元组(容器)
插入详细信息(容器、食品\u id)
self.out\u queue.task\u done()
def main():
c=PySQLPool.getNewQuery(db)
c、 查询(“从食品中选择食品id、食品url,其中食品检查=0”)
url=c.record
对于范围(6)中的i:
t=线程URL(队列,输出队列)
t、 塞达