2011-08-21 3 views
2

나는 QNetworkReply을 통해 이미지를 다운로드 pyqt4에 qtwebkit을 사용하고 있습니다 :QNetworkReply readAll()이 0 바이트를 반환하는 이유는 무엇입니까?

import os 
import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import QWebPage 

class dxBrowser(QWebPage): 
def __init__(self,url): 
    QWebPage.__init__(self) 
    self._url=url 
    self.manager=self.networkAccessManager() 
    self.connect(self.manager,SIGNAL("finished(QNetworkReply *)"),self.onFinished) 

def crawl(self): 
    self.mainFrame().load(QUrl(self._url)) 

def onFinished(self,networkReply): 
    if networkReply.rawHeader('Content-Type')=='image/png': 
     print 'find the image' 
     l=int(networkReply.rawHeader('Content-Length')) 
     print l 
     byteArray=networkReply.readAll() 
     print byteArray.size() 
     im=QImage.fromData(byteArray) 
     if not im.save('test.jpg','jpg'): 
      print 'image save error' 


def main(): 
    app=QApplication(sys.argv) 
    url='http://www.yiyaows.cn/DrsPath.do?kid=6666686E686E69673334333632303335&username=mylibddrz&spagenum=251&pages=50&fid=7534992&a=95cb07394dbf1d43c1fe61bdf6d4a36d&btime=2011-08-19&etime=2011-09-08&template=bookdsr1&firstdrs=http%3A%2F%2Fbook1.duxiu.com%2FbookDetail.jsp%3FdxNumber%3D000005609810%26d%3DA30222298F3C6715323B5476CB66D650' 
    dx=dxBrowser(url) 
    dx.crawl() 
    sys.exit(app.exec_()) 

if __name__=='__main__': 
    main()  

비록 내용 길이 제로가 아닌하지만 byteArray.size()가 0이 그래서 이미지를 저장할 수 있습니다. 왜? 누구든지 나를 도와 줄 수 있어요.

편집 : 아마도 내가 알아 냈습니다. qtwebkit은 qnetworkreply, QIODevice의 내용을 검색 할 수 있습니다.이 크기는 readall() 이후 0이 될 것입니다. 브라우저로 qtwebkit이 렌더링을 위해 읽은 것 같습니다.

+0

dxBrowser의 'reply' 속성은 어디에서 왔습니까? – Mat

+0

죄송합니다. 이전 코드가 잘못되었습니다. – Treper

답변

2

편집 : 아마도 이것을 알아 냈을 것입니다. qtwebkit은 qnetworkreply, QIODevice의 내용을 번 검색 할 수 있습니다. readall()을 수행하면 그 크기는 이됩니다. 브라우저 인 qtwebkit에서 렌더링을 읽었을 가능성이 있습니다.

예를하고 쉬운 주변의 작업이 : (QNetworkAccessManager.setCache 포함) 관리자에게 QNetworkDiskCache를 추가하고 슬롯 onFinished에 캐시에서 이미지를 가져가.

웹 사이트를 사용하지 않는 경우

: 디스크에 파일을 저장하지 않는 브라우저를 암시하는 "에서 Pragma 노 캐시"또는 "캐시 제어는"당신은 방법 prepare를 재정의해야합니다 (그리고 어쩌면 updateMetaData) QNetworkDiskCache의 오버라이드 (override) 원래 방법을 호출하기 전에 플래그 saveToDisk.

+0

캐시를 설정 한 후 QNetworkAccessManager 인스턴스가 자동으로 해당 캐시에 기록합니까? 또는 각 요청 후에 수동으로 삽입해야합니까? – izyda

+1

@izyda 일단'setCache'를 호출하면됩니다. 설정 후에는 새로운 요청에 대해 즉시 작동합니다. – alexisdm

+0

이 작업은 훌륭했지만 지금은 "Pragma : no-cache"또는 "Cache-control"문제로 돌아 왔습니다. 이 접근법에 대해 몇 가지 조언을 해 주실 수 있습니까? ''''QNetworkDiskCache'''에서 상속받은 Python 클래스를 생성하고 prepare 메소드를 덮어 씁니까? – izyda

관련 문제