2017-01-15 3 views
1

나는 주어진 웹 사이트에서 수천 개의 PDF를 이상적으로 다운로드하려고합니다. 그러나 어떤 이유로 100 개의 PDF를 다운로드하지도 않습니다. 왜 그런지 모르겠습니다. 코드는 다음과 같습니다.Pyqt4를 사용하여 URL에서 수천 개의 PDF를 다운로드하십시오.

#!/usr/bin/env python 
import time 
from pyPdf import PdfFileWriter, PdfFileReader 
import StringIO 
from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import letter 
from xhtml2pdf import pisa 
import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import* 
from PyQt4.QtWebKit import * 

class Foo(QWidget): 
    def __init__(self, parent=None): 
     super(Foo, self).__init__(parent)  

     self.count = -1 
     text_file = open("input.txt", "r") 
     self.params = text_file.read().split('\n') 
     self.url = 'http://www.asdfasdfasdf.com/Property.aspx?mode=details&pin={0}' 

     self.gridLayout = QGridLayout(self) 
     #self.tabWidget = QTabWidget(self) 
     #self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) 

     self.mapper = QSignalMapper(self) 
     self.mapper.mapped.connect(self.on_mapper_mapped) 

     for i in range(100): 
      grabber = QWebView() 
      grabber.loadFinished.connect(self.mapper.map) 

      self.mapper.setMapping(grabber, i) 
      #self.tabWidget.addTab(grabber, "opener {0}".format(str(i))) 

      grabber.loadFinished.emit(True) 

    @pyqtSlot(int) 
    def on_mapper_mapped(self, gNumber): 
     self.count += 1 
     if self.count < len(self.params): 
      #gParam = self.params[self.count] 
      gParam = self.params[self.count] 

      opener = self.mapper.mapping(gNumber) 
      opener.load(QUrl(self.url.format(gParam))) 
      printer = QPrinter() 
      #setting format 
      printer.setPageSize(QPrinter.A4) 
      printer.setOutputFormat(QPrinter.PdfFormat) 
      #export file as c:\tem_pdf.pdf 
      PIDString = gParam[:2] + '-' + gParam[2:4] + '-' + gParam[4:7] + '-' + gParam[7:10] + '-' + gParam[10:14] 
      printer.setOutputFileName(PIDString + '.pdf') 
      def convertIt(): 
       opener.print_(printer) 

      QObject.connect(opener, SIGNAL("loadFinished(bool)"), convertIt) 
      print str(self.count) + ' of ' + str(len(self.params)) 



if __name__ == "__main__": 
    import sys 

    app = QApplication(sys.argv) 
    main = Foo() 
    #main.show() 
    app.exec_() 
    sys.exit 

이상적으로 저는 바닥 글을 추가하고 싶습니다. 그러나 시도해도 버그가 있습니다. Input.txt에는 100 개의 숫자가 있습니다 (테스트 용으로 85000에서 작동해야 함). 5 또는 10과 같은 실제 작은 숫자에서 작동하지만 100은 수행하지 않습니다. QwebView 인스턴스에 제한이 있습니까? 작동하도록하려면이를 관리해야합니까?

이 코드를 100 개의 PDF로 실행하면 20 개의 PDFS가 인쇄됩니다. i가 100보다 작은 무언가의 범위를 변경하면, 중복 된 PDF의 것입니다하지만 확실히 더 또한 20

보다,이 오류가 얻을 : 당신의 "를 만들려고 노력하기 때문에 나는 생각

qpainter::begin: returned false

+0

이 무슨 일"큰 숫자 "? 메시지? 증상이 작동하지 않습니다을 제공합니다 희망? – mnagel

+1

을 또한, 어쩌면 당신은 서버 측 조절/안티 스팸으로 실행합니다. 당신은 확인했다 그? – mnagel

답변

0

을 PyQt Application "을 사용하면 먼저 자신이 제공하는 것을 사용해야합니다.

QNetworkAccessMAnager 귀하의 모든 요청 및 그 밖의 모든 사항을 제어하려면보십시오. QNetworkRequest, QNetworkReply.

스레드를 처리하고 병렬 처리를 원하는대로 수행합니다. 앱을 다운로드하는 동안 앱을 고정하지 않습니다.

이 코드를 자세히 살펴보십시오. 그것은 당신이 원하는 것을 정확히 수행하지는 않지만, 당신이 모든 것을 셋업해야 할 필요가있는, 정말로 훌륭한 필터링 된 예제입니다.

# Subclass QNetworkAccessManager Here 
from PyQt5.QtCore import QByteArray 
from PyQt5.QtCore import QFile, pyqtSlot 
from PyQt5.QtCore import QIODevice 
from PyQt5.QtCore import QUrl 
from PyQt5.QtCore import pyqtSignal 
from PyQt5.QtNetwork import QNetworkAccessManager 
from PyQt5.QtNetwork import QNetworkRequest 


class NetworkAccessManager(QNetworkAccessManager): 

    signal_add_image = pyqtSignal() 
    dialog = None 
    download_finished = False 
    message_buffer = None 
    reply = None 

    def __init__(self): 
     QNetworkAccessManager.__init__(self) 
     self.reply = self.get(QNetworkRequest(QUrl(""))) 

    # Save image data in QByteArray buffer to the disk (google_image_logo.png 
    # in the same directory) 
    @pyqtSlot() 
    def slot_finished(self): 
     image_file = QFile("resources/browser_images/image_required_browser") 
     if image_file.open(QIODevice.ReadWrite): 
      image_file.write(self.message_buffer) 
      image_file.close() 
      self.signal_add_image.emit() 
      # QMessageBox.information(None, "Hello!", "File has been saved!") 
     else: 
      pass 
      # QMessageBox.critical(None, "Hello!", "Error saving file!") 
     self.download_finished = True 
     self.dialog.close() 

    # Append current data to the buffer every time readyRead() signal is 
    # emitted 
    @pyqtSlot() 
    def slot_read_data(self): 
     self.message_buffer += self.reply.readAll() 

    def request_image(self, url, progress_bar, dialog): 
     self.reply.deleteLater() 
     self.download_finished = False 
     self.dialog = dialog 
     self.message_buffer = QByteArray() 
     url = QUrl(url) 
     req = QNetworkRequest(url) 
     req.setRawHeader(b'User-Agent', 
            b'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36') 
     self.reply = self.get(req) 
     self.reply.readyRead.connect(self.slot_read_data) 
     self.reply.finished.connect(self.slot_finished) 
     self.reply.downloadProgress.connect(progress_bar) 

    def get_reply(self): 
     return self.reply 

    def done(self): 
     return self.download_finished 

    def set_reply(self, reply): 
     self.reply = reply 

    def del_reply(self): 
     self.reply.deleteLater() 

NETWORK_ACCESS_MANAGER = NetworkAccessManager() 

은 당신에게 약간의 빛 ")이 때