我是Python的新手,我目前正在研究多个网页抓取工具。当我在玩Python时,我发现了线程,这确实加快了代码的速度。问题是脚本会占用大量网站,我喜欢在使用线程时使用'批处理'数组。
当我有一个1000件物品的数组时,我想要抓住10件物品。当脚本完成这10个项目后,抓住10个新项目直到没有任何内容
我希望有人可以帮助我。提前谢谢!
import subprocess
import threading
from multiprocessing import Pool
def scrape(url):
return subprocess.call("casperjs test.js --url=" + url, shell=True)
if __name__ == '__main__':
pool = Pool()
sites = ["http://site1.com", "http://site2.com", "http://site3.com", "http://site4.com"]
results = pool.imap(scrape, sites)
for result in results:
print(result)
将来我使用sqlite数据库存储所有URL(这将替换数组)。当我运行脚本时,我希望控制停止进程并在需要时继续。这不是我的问题,而是我的问题的背景。
答案 0 :(得分:0)
问题:... 1000件物品的数组我想要抓住10件物品
for p in range(0, 1000, 10):
process10(sites[p:p+10])
答案 1 :(得分:0)
如何使用Process
中的Queue
和multiprocessing
?编写一个worker函数并从循环中调用它使它作为批处理运行。使用Process
,可以在需要时启动和停止作业,并让您更好地控制它们。
import subprocess
from multiprocessing import Process, Queue
def worker(url_queue, result_queue):
for url in iter(url_queue.get, 'DONE'):
scrape_result = scrape(url)
result_queue.put(scrape_result)
def scrape(url):
return subprocess.call("casperjs test.js --url=" + url, shell=True)
if __name__ == '__main__':
sites = ['http://site1.com', "http://site2.com", "http://site3.com", "http://site4.com", "http://site5.com",
"http://site6.com", "http://site7.com", "http://site8.com", "http://site9.com", "http://site10.com",
"http://site11.com", "http://site12.com", "http://site13.com", "http://site14.com", "http://site15.com",
"http://site16.com", "http://site17.com", "http://site18.com", "http://site19.com", "http://site20.com"]
url_queue = Queue()
result_queue = Queue()
processes = []
for url in sites:
url_queue.put(url)
for i in range(10):
p = Process(target=worker, args=(url_queue, result_queue))
p.start()
processes.append(p)
url_queue.put('DONE')
for p in processes:
p.join()
result_queue.put('DONE')
for response in iter(result_queue.get, 'DONE'):
print response
请注意Queue
是支持推送和拉动元素的FIFO队列。