【问题标题】:How to *efficiently* monitor a webpage modified with javascript?如何*有效地*监控使用 javascript 修改的网页?
【发布时间】:2013-10-14 21:19:49
【问题描述】:

我正在尝试监控网站上通过 javascript 生成的元素。下载一个javascript修改页面的问题之前处理过,借用下面的代码解决了PyQt的问题。

但是当我将此代码设置为每 20 秒运行一次时,我的网络流量平均下降 70KB/s,下降 5KB/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_() )

【问题讨论】:

  • 您在这里的目标是什么?您想收集哪些指标?
  • 网页上有一个文本字符串在四个不同的字符串之间周期性变化,我想在它发生变化时向我的程序的其余部分报告它是四个字符串中的哪一个。
  • 明确地说,您是否希望每 20 秒捕获一次网站状态(由其 JavaScript 修改)?这势必会产生大量流量。

标签: python web-scraping pyqt4 monitoring


【解决方案1】:

首先,请明确您的动机。每 20 秒发生一次变化,您想在某个字段发生变化时通知服务器。所以

1)。您需要发送整个页面还是仅发送一个字段的内容。我不清楚你目前在做什么,但如果你每 20 秒发送 80k,这似乎有点矫枉过正。

2)。服务器需要立即知道吗?每分钟而不是每 20 秒发送状态的后果是什么。您错过了一些更改,但这有关系吗?

你还没有真正告诉你你在做什么或为什么,所以我们不能对此发表评论。

我的第一个想法是,如果服务器只想知道一个字段,那么只使用您关心的有效负载进行 ajax 调用。对我来说更有效的是每隔几分钟发送一次摘要。一条复合记录比几条小记录便宜得多。

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2016-06-02
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多