2011-04-20 62 views
2

假設我要猜解的網頁:C++或Python:暴力破解查找文本在許多網頁

例如,http://www.example.com/index.php?id= < 1 - 99999> 和搜索每個頁面以尋找是否有含有一定的文字。 如果頁面包含文本,然後將其存儲到一個字符串

我有點讓它在python中工作,但它很慢(每個頁面大約1-2秒,這將需要大約24小時做到這一點)有沒有更好的解決方案?我正在考慮使用C/C++,因爲我聽說python效率不高。然而,經過第二次思考,我認爲它可能不是python的效率,而是訪問html元素的效率(我將整個html更改爲文本,然後搜索它...並且內容相當長)

那麼我應該如何提高bruteforce的速度?

+1

發佈您的代碼。 – Sylverdrag 2011-04-20 02:50:41

+2

你確定開銷並不僅僅是在首先檢索數據?大多數網站需要1-2秒才能加載。 Python應該足夠快,適合你的任務。 – Adam 2011-04-20 02:54:18

+0

你有沒有試過psyco? – 2011-04-20 02:58:20

回答

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() 
+0

哦,我還沒有讀過它,但我認爲解決我的問題,我認爲這是多處理起初,但在聽到你所說的話後,我必須改變我的想法 – biloon 2011-04-20 04:00:33

+1

在Python 3.2中使用新的'concurrent.futures'模塊更容易一些(這個概念與你在這裏的概念是一樣的,但它會請自動處理更多細節) – ncoghlan 2011-04-20 04:07:06

+1

請記住,即使您擁有帶寬,Web服務器可能並不樂意爲您提供高頻率的多個頁面。它可以被解釋爲對DOS攻擊的嘗試。 – 2011-04-20 10:08:03

4

您是否分析過解析部分是算法的瓶頸,而不是HTTP請求和應答事務?

我不認爲那種給你C/C++的效率就是你在這裏尋找的東西。

+0

那麼,如何解析html的某個部分而不會損失任何速度?我嘗試了美麗的湯,但它只是尋找合適的標籤,然後搜索裏面的東西。如果可能的話,我想在特定的行號開始我的操作員內搜索,但我不知道如何 – biloon 2011-04-20 03:13:54