Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;或Python:在许多网页中查找文本_C++_Python_Html_Webpage - Fatal编程技术网

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

C++ C++;或Python:在许多网页中查找文本,c++,python,html,webpage,C++,Python,Html,Webpage,假设我想对网页进行暴力攻击: 比如说,, 并搜索每一页以查找是否包含特定文本。 如果页面包含文本,则将其存储到字符串中 我可以用python实现它,但是速度非常慢(每页大约1-2秒,这需要24小时才能完成),有更好的解决方案吗?我正在考虑使用C/C++,因为我听说python效率不高。然而,经过再三思考,我认为这可能不是python的效率,而是访问html元素的效率(我将整个html更改为文本,然后搜索它…并且内容相当长) 那么,如何提高暴力破解的速度呢?您是否分析过,解析部分是算法的瓶颈,而不

假设我想对网页进行暴力攻击:

比如说,, 并搜索每一页以查找是否包含特定文本。 如果页面包含文本,则将其存储到字符串中

我可以用python实现它,但是速度非常慢(每页大约1-2秒,这需要24小时才能完成),有更好的解决方案吗?我正在考虑使用C/C++,因为我听说python效率不高。然而,经过再三思考,我认为这可能不是python的效率,而是访问html元素的效率(我将整个html更改为文本,然后搜索它…并且内容相当长)


那么,如何提高暴力破解的速度呢?

您是否分析过,解析部分是算法的瓶颈,而不是HTTP请求和应答事务


我不认为C/C++所带来的效率是您在这里想要的。

很可能您的问题与快速解析HTML的能力无关,而与页面检索和顺序任务阻塞的延迟有关

1-2秒是检索页面的合理时间。您应该能够更快地在页面上找到数量级的文本。但是,如果您一次只处理一个页面,您可能会在查找结果时被阻止,等待web服务器的响应。相反,您可以通过辅助进程一次检索多个页面,只等待它们的输出

以下代码已从修改为更适合您的问题

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()
导入urllib
从多处理导入进程,队列
def工作者(输入、输出):
对于func,iter中的args(input.get,“STOP”):
结果=func(*args)
输出输出(结果)
def find_on_页面(num):
乌里http://www.example.com/index.php?id=%d“%num”
f=urllib.urlopen(uri)
data=f.read()
f、 关闭()
index=data.find('datahere:')#显然使用您自己的方法
如果指数<0:
一无所获
其他:
返回数据[索引:索引+20]
def main():
进程数=4
tasks=[(在[u页,(i,))上查找[u]范围内的i(99999)]
任务队列=队列()
完成\u队列=队列()
对于任务中的任务:
任务队列.放置(任务)
对于范围内的i(NUM_进程):
进程(目标=工作者,参数=(任务队列,完成队列)).start()
对于范围内的i(99999):
打印完成\u队列。获取()
对于范围内的i(NUM_进程):
任务队列。put('STOP')
如果名称=“\uuuuu main\uuuuuuuu”:
main()

您确定开销不只是首先检索数据吗?大多数站点需要1-2秒才能加载。Python对于您的任务来说应该非常快。@jcomeau_ictx我现在正在处理psyco,但它不适用于较新的版本。请配置您的程序并发布您的代码。那么如何在不损失任何速度的情况下解析html的某一部分呢?我试过漂亮的汤,但它只是在寻找正确的标签,然后搜索里面的东西。如果可能的话,我想在某个行号开始我的操作员内搜索,但我不知道怎么读。哦,我还没有读过,但我认为这解决了我的问题,起初我认为它是多处理的,但听了你的话,我必须改变我的想法,使用Python 3.2中新的
concurrent.futures
模块可能更容易(概念与您这里的相同,但它会自动处理更多精细的细节),请记住web服务器可能不乐意以高频率为您提供多个页面,即使你有足够的带宽。这可能被解释为试图进行DOS攻击。