0

JavaScript で生成された Web サイトの要素を監視しようとしています。JavaScriptを変更したページをダウンロードする問題は以前に対処したことがありますが、PyQtで問題を解決する以下のコードをお借りしました。

しかし、このコードを 20 秒ごとに実行するように設定すると、ネットワーク トラフィックは平均で 70KB/秒減少し、5 KB/秒増加します。保存される実際のページはわずか 80 KB ですが、javascript が重いです。

1 日 6GB は妥当ではありません。私の ISP にはデータ制限があり、私はすでに限界に達しています。

たとえば、ページ上の特定の要素に対応する JavaScript のみを実行するように、このコードを変更する方法はありますか? もしそうなら、私は何を実行する必要があるかをどのように理解すればよいでしょうか? そして、それは私が見ているネットワーク トラフィックに重大な影響を与えるでしょうか?

あるいは、これをどのように行うべきですか? Chrome は既に JavaScript を処理しているので、Chrome 拡張機能を作成することを検討しましたが、それをプロジェクトの残りの部分と統合する方法を理解する必要があり、それは私にとってまったく新しい領域です。もっと良い方法があれば、私はむしろそれをしたいです。

#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_() )
4

1 に答える 1

0

まず、ここであなたの動機を明確にしてください。20 秒ごとに何かが変化しており、1 つのフィールドが変化したときにサーバーに通知したいとします。そう

1)。ページ全体を送信する必要がありますか、それとも 1 つのフィールドの内容のみを送信する必要がありますか。あなたが現在何をしているのかはわかりませんが、20 秒ごとに 80k を送信している場合、これはやり過ぎのように思えます。

2)。サーバーはすぐに知る必要がありますか? 状態を 20 秒ごとではなく 1 分ごとに送信すると、どのような結果になりますか。いくつかの変更を見逃していますが、それは問題ですか?

あなたは自分が何をしているのか、その理由については語っていないので、それについてコメントすることはできません.

私の最初の考えは、サーバーが1つのフィールドについて知りたいだけなら、関心のあるペイロードだけでajax呼び出しを行うということです。数分ごとに要約を送信する方が効率的です。1 つの複合レコードは、いくつかの小さなレコードよりもはるかに安価です。

于 2013-10-15T05:42:08.113 に答える