2013-10-03 10 views
6

Piszę program python, który używa PyQT4 do załadowania adresu URL i przetworzenia jego zawartości/DOM (po zmodyfikowaniu przez javascript). Potrzebuję też niestandardowych nagłówków, aby poprosić o tę stronę.Nie można dodać nagłówków żądań niestandardowych w PyQT4

Poniższy kod działa, ale nie może pobrać adresu URL przy użyciu własnych niestandardowych nagłówków zdefiniowanych za pomocą 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() 

Czy ktoś może mi powiedzieć, dlaczego nie wybiera ustawień nagłówka?

Odpowiedz

4

Przenoszenie funkcji setRawHeader wewnątrz createRequest i będzie działać. Możesz wysłać prośbę o testowanie na numer here.

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) 

Uwaga Ja również zmienił User-agent do User-Agent

Powiązane problemy