2013-10-03 13 views
6

Sto scrivendo un programma Python che utilizza PyQT4 per caricare alcuni URL e processarne il contenuto/DOM (dopo essere stato modificato da javascript). Ho anche bisogno di intestazioni personalizzate per richiedere quella pagina.Impossibile aggiungere intestazioni di richiesta personalizzate in PyQT4

Il codice riportato di seguito funziona tranne che non è possibile recuperare l'URL utilizzando le intestazioni personalizzate che definisco con QNetworkRequest.

import sys 
    import signal 
    from optparse import OptionParser 
    from PyQt4.QtCore import * 
    from PyQt4.QtGui import * 
    from PyQt4.QtWebKit import QWebPage 
    from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply 

    class MyNetworkAccessManager(QNetworkAccessManager): 
     def __init__(self, url): 
      QNetworkAccessManager.__init__(self) 
      self.request = QNetworkRequest(QUrl(url)) 
      self.request.setRawHeader('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)') 
      self.request.setRawHeader("Accept-Language","en-us,en;q=0.5"); 
      self.request.setRawHeader("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
      self.request.setRawHeader("Connection","keep-alive");  
      self.reply = self.get(self.request) 

     def createRequest(self, operation, request, data): 
      print "mymanager handles ", request.url() 
      return QNetworkAccessManager.createRequest(self, operation, request, data) 

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

     def userAgentForUrl(self, url): 
      return "Mozilla/122.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1" 

     def crawl(self): 
      signal.signal(signal.SIGINT, signal.SIG_DFL) 
      self.connect(self, SIGNAL('loadFinished(bool)'), 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() 
      sys.exit(0) 

    def main(): 
     app = QApplication(sys.argv) 
     options = get_cmd_options() 
     crawler = Crawler(options.url, options.file) 
     crawler.crawl() 
     sys.exit(app.exec_()) 

    def get_cmd_options(): 
     """ 
      gets and validates the input from the command line 
     """ 
     usage = "usage: %prog [options] args" 
     parser = OptionParser(usage) 
     parser.add_option('-u', '--url', dest = 'url', help = 'URL to fetch data from') 
     parser.add_option('-f', '--file', dest = 'file', help = 'Local file path to save data to') 

     (options,args) = parser.parse_args() 

     if not options.url: 
      print 'You must specify an URL.',sys.argv[0],'--help for more details' 
      exit(1) 
     if not options.file: 
      print 'You must specify a destination file.',sys.argv[0],'--help for more details' 
      exit(1) 

     return options 

    if __name__ == '__main__': 
     main() 

Potrebbe piacere a qualcuno dirmi perché non sta selezionando le impostazioni dell'intestazione?

risposta

4

Spostare la funzione setRawHeader all'interno della funzione createRequest e funzionerà. È possibile inviare una richiesta here per il test.

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

def createRequest(self, operation, request, data): 
    print("mymanager handles ", request.url()) 
    request.setRawHeader('User-Agent', 'Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101') 
    request.setRawHeader("Accept-Language","en-us,en;q=0.5"); 
    request.setRawHeader("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
    request.setRawHeader("Connection","keep-alive"); 
    return QNetworkAccessManager.createRequest(self, operation, request, data) 

Nota ho anche cambiato User-agent-User-Agent

Problemi correlati