Python: Speichern großer Webseiten in eine Datei

  • Lassen Sie mich mit den Worten beginnen: Ich bin nicht neu in der Programmierung, aber sehr neu in Python.

    Ich habe mit urllib2 ein Programm geschrieben, das eine Webseite anfordert, die ich dann in einer Datei speichern möchte. Die Webseite ist etwa 300 KB groß, was mir aber nicht besonders groß erscheint, aber es scheint genug zu sein, um mir Ärger zu bereiten. Ich nenne es "groß". Ich benutze einen einfachen Aufruf, um direkt von dort zu kopieren Das Objekt wurde von urlopen in die Datei zurückgegeben:

    file.write(webpage.read())

    , aber es wird nur Minuten warten und versuchen, es zu versuchen schreibe in die datei und ich erhalte schließlich folgendes:

     Traceback (most recent call last):
      File "program.py", line 51, in <module>
        main()
      File "program.py", line 43, in main
        f.write(webpage.read())
      File "/usr/lib/python2.7/socket.py", line 351, in read
        data = self._sock.recv(rbufsize)
      File "/usr/lib/python2.7/httplib.py", line 541, in read
        return self._read_chunked(amt)
      File "/usr/lib/python2.7/httplib.py", line 592, in _read_chunked
        value.append(self._safe_read(amt))
      File "/usr/lib/python2.7/httplib.py", line 649, in _safe_read
        raise IncompleteRead(''.join(s), amt)
    httplib.IncompleteRead: IncompleteRead(6384 bytes read, 1808 more expected)
     

    Ich weiß nicht, warum dies das geben soll So viel Trauer programmieren?


    BEARBEITEN |

    Hier erfahre ich die Seite

     jar = cookielib.CookieJar()
    
    cookie_processor = urllib2.HTTPCookieProcessor(jar);
    
    opener = urllib2.build_opener(cookie_processor)
    urllib2.install_opener(opener)
    
    requ_login = urllib2.Request(LOGIN_PAGE,
                                 data = urllib.urlencode( { 'destination' : "", 'username' : USERNAME, 'password' :  PASSWORD } ))
    
    requ_page = urllib2.Request(WEBPAGE)    
    try:
        #login
        urllib2.urlopen(requ_login)
    
        #get desired page
        portfolio = urllib2.urlopen(requ_page)
    except urllib2.URLError as e:
        print e.code, ": ", e.reason
     
    22 November 2011
    Justin Smith
1 answer
  • Ich würde eine praktische Funktion zum Kopieren von Dateiobjekten verwenden wird vom Modul shutil bereitgestellt. Es hat auf meinem Rechner funktioniert:)

     >>> import urllib2
    >>> import shutil
    >>> remote_fo = urllib2.urlopen('http://docs.python.org/library/shutil.html')
    >>> with open('bigfile', 'wb') as local_fo:
    ...     shutil.copyfileobj(remote_fo, local_fo)
    ... 
    >>> 
     

    UPDATE: Vielleicht möchten Sie weitergeben Das dritte Argument von copyfileobj bestimmt die Größe des internen Puffers, der zum Übertragen von Bytes verwendet wird.

    UPDATE2: An shutil.copyfileobj. ist nichts Besonderes Liest einen Teil der Bytes aus dem Quelldateiobjekt und schreibt es wiederholt in das Zieldateiobjekt, bis nichts mehr zu lesen ist. Hier ist der eigentliche Quellcode, den ich aus der Python-Standardbibliothek herausgeholt habe:

     def copyfileobj(fsrc, fdst, length=16*1024):
        """copy data from file-like object fsrc to file-like object fdst"""
        while 1:
            buf = fsrc.read(length)
            if not buf:
                break
            fdst.write(buf)
     
    04 January 2012
    Pavel Repin