C ++或Python:强制在许多网页中查找文本

时间:2011-04-20 02:47:29

标签: c++ python html webpage

假设我想暴力破解网页:

例如,http://www.example.com/index.php?id=< 1 - 99999> 并搜索每个页面以查找是否包含某个文本。 如果页面包含文本,则将其存储为字符串

我有点在python中工作,但它很慢(每页大约1-2秒,这需要大约24小时才能完成)是否有更好的解决方案?我正在考虑使用C / C ++,因为我听说python效率不高。然而,经过第二次思考,我认为它可能不是python的效率,而是访问html元素的效率(我将整个html改为文本,然后搜索它......内容很长)< / p>

那么我怎样才能提高强拆的速度呢?

2 个答案:

答案 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 ++的效率就是你在这里寻找的。