2013-10-03 17 views
6

Tôi đang viết chương trình python sử dụng PyQT4 để tải một số URL và xử lý nội dung của nó/DOM (sau khi được sửa đổi bởi javascript). Tôi cũng cần tiêu đề tùy chỉnh để yêu cầu trang đó.Không thể thêm tiêu đề yêu cầu tùy chỉnh trong PyQT4

Mã bên dưới đang hoạt động ngoại trừ việc mã không thể tìm nạp URL bằng cách sử dụng tiêu đề tùy chỉnh của tôi tôi xác định với 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() 

Bạn có thể cho tôi biết lý do tại sao không chọn cài đặt tiêu đề không?

Trả lời

4

Di chuyển setRawHeader bên trong chức năng createRequest và nó sẽ hoạt động. Bạn có thể gửi yêu cầu here để thử nghiệm.

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) 

Note Tôi cũng thay đổi User-agent-User-Agent

Các vấn đề liên quan