假设我想暴力破解网页:
例如,http://www.example.com/index.php?id=< 1 - 99999> 并搜索每个页面以查找是否包含某个文本。 如果页面包含文本,则将其存储为字符串
我有点在python中工作,但它很慢(每页大约1-2秒,这需要大约24小时才能完成)是否有更好的解决方案?我正在考虑使用C / C ++,因为我听说python效率不高。然而,经过第二次思考,我认为它可能不是python的效率,而是访问html元素的效率(我将整个html改为文本,然后搜索它......内容很长)< / p>
那么我怎样才能提高强拆的速度呢?
答案 0 :(得分:6)
很可能你的问题与你快速解析HTML的能力无关,而且与页面检索的延迟和顺序任务的阻塞有关。
1-2秒是检索页面的合理时间。您应该能够更快地在页面上查找文本数量级。但是,如果您一次处理一个页面,则在您可以找到结果时,您将被阻止等待来自Web服务器的响应。您可以通过工作进程一次检索多个页面,并等待它们的输出。
以下代码已从Python's multiprocessing docs修改为更符合您的问题。
import urllib
from multiprocessing import Process, Queue
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = func(*args)
output.put(result)
def find_on_page(num):
uri = 'http://www.example.com/index.php?id=%d' % num
f = urllib.urlopen(uri)
data = f.read()
f.close()
index = data.find('datahere:') # obviously use your own methods
if index < 0:
return None
else:
return data[index:index+20]
def main():
NUM_PROCESSES = 4
tasks = [(find_on_page, (i,)) for i in range(99999)]
task_queue = Queue()
done_queue = Queue()
for task in tasks:
task_queue.put(task)
for i in range(NUM_PROCESSES):
Process(target=worker, args=(task_queue, done_queue)).start()
for i in range(99999):
print done_queue.get()
for i in range(NUM_PROCESSES):
task_queue.put('STOP')
if __name__ == "__main__":
main()
答案 1 :(得分:4)
您是否分析过解析部分是算法的瓶颈而不是HTTP请求和应答事务?
我不认为那种能给你提供C / C ++的效率就是你在这里寻找的。 p>