簡體   English   中英

Web(Django)中用於Python腳本的GUI

[英]GUI in web (Django) for Python script

我有一個程序,該程序從用戶那里獲取1個URL,對整個站點進行爬網,並返回所有URL的列表以及每個URL的一些已解析數據。

一切看起來像:

class Crawl(url_from_user):
    self.result = [<Page object at 1>, <Page object at 2>, <Page object at 3>]

class Page(url):
    self.data_1 = "string_1"
    self.data_2 = "string_2"
    self.data_3 = "string_3"

Crawl類-處理線程和每頁的所有公共輸入/數據。

class Page為每個頁面存儲唯一數據並處理解析HTML。

我想把這個程序變成一個網站。 使用Django,我想創建使用url_from_user並開始抓取網站的頁面。 我想將結果存儲在SQL數據庫中,以便能夠將其傳遞給不同的視圖。

問題是,如何在搜尋過程中動態顯示結果,而尚未完成? 在抓取中間,我可以在控制台中將結果顯示給“ stdout”。 我可以在HTML頁面中顯示未完成的結果嗎?

我的第一個想法是JQuery,但是JQuery可以掛鈎到stdout輸出(或者,如果它可以使用Page的所有方法訪問結果列表本身,那就更好了-那么當列表仍在增長時,我將能夠操縱列表的各個元素與運行抓取)?

這是您要做的:

  1. 創建一個django網站,該網站從數據庫(可以是sqlite)中獲取要顯示的數據,並以所需格式顯示
  2. 創建一個爬網腳本
  3. 添加一個呈現表單的視圖(您所需的url輸入功能)並啟動腳本。 實際上有兩個可以解決的問題:

    3.1在主要工作中啟動腳本-凍結用戶的網站,直到抓取完成,但更容易完成

    3.2通過celerycron安排爬行作業-全面更好,不凍結任何東西,允許更多的靈活性,允許查看當前進度等,但是需要設置作業隊列,並且通常很難做到第一次。

  4. 使您的腳本將抓取的網址和所需的信息放到django正在從中獲取數據的同一數據庫中。

現在,對於動態進度顯示,我絕不是專家,但是我看到了一些方法:

  1. 讓腳本保留事件日志(可以通過django模型進行記錄,以便將事件存儲在db中)(例如,“ parsed url http://foo.bar ”),並有一個頁面顯示特定作業的事件。
  2. 使整個交互式爬網過程成為一個單獨的應用程序,該應用程序運行一個發送反饋的異步服務器。 例如,通過websockets進行操作:django提供一個js文件。 在js文件中,應用程序連接到websocket應用程序(最好與django在同一主機上運行),該應用程序正在通過websockets進行爬網和報告進度。 請注意,這很難設置,但可以實現。
  3. 您可能已經讓django從日志文件中顯示內容,但是我認為它很容易變得棘手。

對於動態進度顯示,您仍然需要某種異步方法。 您可以通過長時間輪詢來實現 :通過AJAX GET在django側輪詢django上創建一個js腳本,以使新信息大約每秒鍾顯示一次。 這項技術最近已經過時了(因為它向服務器發送大量昂貴的請求),但是它仍然有效並且非常簡單。

我認為最好的選擇是讓celery作業將爬網的數據和日志放入數據庫中,讓django向用戶顯示日志和數據並接受用戶輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM