2017-01-15 9 views
1

私は、特定のWebサイトから数千の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が印刷されます。私は100より小さいものに範囲を変更した場合、それが重複したPDFの確かまた20以上

を持って、私はこのエラーを取得する:

qpainter::begin: returned false

+0

)』?症状? – mnagel

+1

も、多分あなたはサーバー側の絞り/アンチスパムに遭遇し、それはいくつかの光をもたらします願っています。あなたがチェックしていますそれ? – mnagel

答えて

0

私はあなたが "を作るしようとしていることから考えますPyQt Application "を使用する場合は、最初に提供するものを利用する必要があります。

QNetworkAccessMAnagerあなたのすべてのリクエストとすべてのリクエストのコントロールがあるようにしてみてください。QNetworkRequestQNetworkReply

あなたのスレッドを世話し、あなたの並列性を望むようにします。ダウンロード中にアプリをフリーズすることはありません。

このコードを少し見てみましょう。それはあなたが望むものを正確には行いませんが、あなたがすべてセットアップしなければならないものについて、本当に良いフィルタリングされた例です。

# 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() 

は大きな数字では動作しないのですか? 『のメッセージを「それはときに何が起こるか

関連する問題