我一直在努力尝试使用线程脚本。它最终将成为一个网络刮板,希望它比我之前制作的原始线性刮擦脚本快一点。
阅读并播放一些示例代码后数小时。我仍然不确定在实施过程中哪些被认为是正确的。
目前我有以下代码,我一直在玩:
import {DomSanitizationService, SafeHtml} from '@angular/platform-browser';
...
constructor(
private sanitizer: DomSanitizationService,
...
){}
gcsesearch: SafeHtml;
ngOnInit() {
this.gcsesearch = this.sanitizer.bypassSecurityTrustHtml("<gcse:search></gcse:search>");
var cx = '016820916711928902111:qw0kgpuhihm';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
}
我的想法是我在test.txt文件中有一个URL列表。我打开文件并将所有URL放入队列中。从那里我得到10个线程从队列中拉出来并抓取一个网页,或者在这个例子中只打印出拉出的线。
一旦功能完成,我删除一个'工作线程',然后换一个新工作线程直到队列为空。
在我的真实世界实现中,我将不得不从我的函数擦除中获取数据并将其写入.csv文件。但是,现在我只是想了解如何正确实现线程。
我见过类似上面使用'Thread'的类似例子......我也看过使用继承类的'threading'示例。我只想知道我应该使用什么以及管理它的正确方法。
在这里轻松我,我只是一个尝试理解线程的初学者......是的,我知道它会变得非常复杂。但是,我认为这应该很容易第一次尝试......
答案 0 :(得分:2)
在Python 2.x上multiprocessing.dummy(使用线程)是一个很好的选择,因为它易于使用(也可以在Python 3.x中使用)
如果您发现抓取是CPU限制的并且您有多个CPU核心,这样您就可以非常简单地切换到真正的multiprocessing可能获得更大的加速。
(由于performance optimization,Python通常不会从具有多个进程的线程的多个CPU中获利 - 您必须自己找出在您的情况下更快的内容)
使用mutliprocessing.dummy可以做到
from multiprocessing.dummy import Pool
# from multiprocessing import Pool # if you want to use more cpus
def scrape(url):
data = {"sorted": sorted(url)} # normally you would do something more interesting
return (url, data)
urls=[]
threads = 10
if __name__=="__main__":
with open('test.txt') as in_file:
urls.extend(in_file) # lines
p=Pool(threads)
results=list(p.imap_unordered(scrape,urls))
p.close()
print results # normally you would process your results here
在Python 3.x上,concurrent.futures可能是更好的选择。