我正在尝试监控通过javascript生成的网站上的元素。之前已经处理过下载javascript修改页面的问题,我借用了以下代码解决了PyQt的问题。
但是当我将此代码设置为每20秒运行一次时,我的网络流量平均为70 KB / s,下降速度为5 KB / 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_() )
答案 0 :(得分:0)
首先,要明确你的动机。有些东西每20秒就会发生变化,你想告诉服务器一个字段何时发生变化。所以
1)。您需要发送整个页面还是仅发送一个字段的内容。我不清楚你目前在做什么,但如果你每20秒发送80k,这似乎有点过头了。
2)。服务器是否需要立即知道?每分钟而不是每20秒发送一次状态的后果是什么。你错过了一些变化,但这有关系吗?
你还没有真正说出你在做什么或为什么,所以我们不能对此发表评论。
我的第一个想法是,如果服务器只想知道一个字段,那么只用您关心的有效负载进行ajax调用。对我来说更有效率每隔几分钟发送一次摘要。一个复合记录比几个小记录便宜得多。