2013-10-14 46 views
0

我試圖監視通過JavaScript生成的網站上的元素。下載一個javascript修改過的頁面的問題已經被處理過了,我借用了下面的代碼來解決PyQt的問題。如何*有效*監控用JavaScript修改的網頁?

但是,當我將此代碼設置爲每20秒運行一次時,我的網絡流量平均下降了5KB/s,達到70KB/s。實際保存的頁面只有80KB,但是JavaScript很重。

6GB一天是不合理的,我的ISP有數據限制,我已經行了。

有沒有辦法修改這段代碼,例如,它只執行對應於頁面上特定元素的javascript?如果是這樣,我將如何去弄清楚我需要執行什麼?這會對我看到的網絡流量產生重大影響嗎?

或者,我應該怎麼做呢?我考慮做一個Chrome擴展,因爲Chrome已經爲我處理了JavaScript,但是我必須弄清楚如何將它與我的其他項目集成,這對我來說是全新的領域。如果有更好的方法,我寧願那樣做。

#Borrowed from http://stackoverflow.com/questions/19161737/cannot-add-custom-request-headers-in-pyqt4 
#which is borrowed from http://blog.motane.lu/2009/07/07/downloading-a-pages-content-with-python-and-webkit/ 

import sys, signal 
from PyQt4.QtCore import QUrl 
from PyQt4.QtGui import QApplication 
from PyQt4.QtWebKit import QWebPage 
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply 


cookie = ''#snipped, the cookie I have to send is about as long as this bit of code... 

class MyNetworkAccessManager(QNetworkAccessManager): 
    def __init__(self, url): 
      QNetworkAccessManager.__init__(self) 
      request = QNetworkRequest(QUrl(url)) 
      self.reply = self.get(request) 

    def createRequest(self, operation, request, data): 
      request.setRawHeader('User-Agent', 'Mozilla/5.0') 
      request.setRawHeader("Cookie",cookie); 
      return QNetworkAccessManager.createRequest(self, operation, request, data) 

class Crawler(QWebPage): 
     def __init__(self, url, file): 
       QWebPage.__init__(self) 
       self._url = url 
       self._file = file 
       self.manager = MyNetworkAccessManager(url) 
       self.setNetworkAccessManager(self.manager) 

     def crawl(self): 
       signal.signal(signal.SIGINT, signal.SIG_DFL) 
       self.loadFinished.connect(self._finished_loading) 
       self.mainFrame().load(QUrl(self._url)) 

     def _finished_loading(self, result): 
       file = open(self._file, 'w') 
       file.write(self.mainFrame().toHtml()) 
       file.close() 
       exit(0) 

def main(url,file): 
     app = QApplication([url,file]) 
     crawler = Crawler(url, file) 
     crawler.crawl() 
     sys.exit(app.exec_()) 
+1

你的目標是什麼?你想收集什麼樣的指標? – djna

+0

網頁上有一個文字字符串,它會在四個不同的字符串之間週期性地更改,我想在程序的其餘部分發生變化時報告它,以及它是四個字符串中的哪一個。 – Briana

+0

要清楚,您是否有效地想每20秒捕獲一次網站狀態(由JavaScript修改)?這勢必造成大量流量。 – halfer

回答

0

首先,在這裏要明確你的動機。每20秒發生一次更改,並且您希望在一個字段發生變化時通知服務器。所以

1)。你需要發送整個頁面還是隻發送一個字段的內容?我不清楚你目前正在做什麼,但是如果你每20秒發送80k,這似乎是矯枉過正。 2)。服務器是否需要立即知道?每分鐘發送一次狀態而不是每隔20秒會有什麼後果。你錯過了一些改變,但是這很重要嗎?

你還沒有真正地告訴你正在做什麼或爲什麼,所以我們不能對此發表評論。

我的第一個想法是,如果服務器只是想知道一個字段,然後使用您關心的有效載荷進行ajax調用。給我更高效的每隔幾分鐘發一次總結。一張合成唱片比幾張小唱片便宜得多。