2016-03-23 19 views
1

Çalışmalarım için web sitelerini kazıyorum ve bunları gziplenmiş web arşivlerine ("warc.gz" uzantısıyla) yazdım. Python 2.7.11 ve warc 0.2.1 kütüphanesini kullanıyorum.Python, "warc.gz" dosyasını tamamen okuyamaz.

Dosyaların çoğunda bunları warc-library ile tamamen okuyamadığımı fark ettim. Örneğin, warc.gz dosyasının 517 kaydı varsa, bunlardan sadece 200'ü okuyabilirim.

Bazı araştırmalardan sonra, bu sorunun yalnızca gzipli dosyalar ile meydana geldiğini öğrendim. "Warc" uzantılı dosyalar bu soruna sahip değil.

Bunun için bazı çözümlerin (https://github.com/internetarchive/warc/issues/21) yanı sıra bunun için bir çözüm bulunmadığını öğrendim.

Python 2.7.11'de "gzip" dosyasında bir hata olabileceğini tahmin ediyorum. Birisi bununla ilgili deneyime sahip ve bu sorun hakkında neler yapılabileceğini biliyor mu?

Şimdiden teşekkürler!

Örnek:

böyle yeni warc.gz dosyaları oluşturmak:

import warc 
warc_path = "\\some_path\file_name.warc.gz" 
warc_file = warc.open(warc_path, "wb") 

kullandığım kayıtları yazmak için:

Bu mükemmel "warc.gz" yaratır Dosyalar. Onlarla problem yok. "\ R \ n" dahil olmak üzere tüm doğru. Ama bu dosyaları okuduğumda sorun başlıyor.

dosyalarını okumak için kullanıyorum:

warc_file = warc.open(warc_path, "rb") 

döngü için kayıtlar arasında kullandığım:

for record in warc_file: 
    ... 

sorun değil tüm kayıtları bu "warc.gz" dosyası için döngü sırasında bulunan olmasıdır Hepsi "warc" dosyaları için bulunurken. Her iki dosya türüyle çalışmak da warc-kütüphanesinde ele alınmaktadır.

+1

ekleyiniz bir [MCVE] (http://stackoverflow.com/help/mcve) , minimal, eksiksiz ve doğrulanabilir bir örnek. Github'daki bağlantılı sorun bile oldukça belirsiz. –

+0

Ilja, warc kütüphanesi çok küçük, örnek vermek için çok fazla kod yok. Bir warc.gz dosyası oluşturmak için 'self.warc_file = warc.open (self.warc_path," wb ")' kullanın. Kayıt yazmak için 'record = warc.WARCRecord (yük = value, headers = headers)' komutunu kullanıyorum. Kayıtları okumak için 'self.warc_file = warc.open (self.warc_path, rb") 've' self.warc_file: 'kayıtlarını kullanıyorum. Sorun, tüm kayıtların bulunmamasıdır. –

+0

Örnek bir warc.gz dosyası ekleyebilirim Burada nasıl ekleyeceğimi öğrenirim ... –

cevap

4

özel gzipwarc.utils.FilePart ile warc.gzip2.GzipFile dosya bölme taşıma ve warc.warc.WARCReader okuma (piton 2.7.9, 2.7.10 ve 2.7.11 ile test) bir bütün olarak kırılmış gibi görünüyor. receives no data instead of a new header olduğunda kısa durur.

Temel stdlib gzip kolları gibi görünüyor sadece iyi ve bu nedenle bu yanı çalışması gerekir catenated dosyalar:

import gzip 
import warc 

with gzip.open('my_test_file.warc.gz', mode='rb') as gzf: 
    for record in warc.WARCFile(fileobj=gzf): 
     print record.payload.read() 
+0

Teşekkürler! :) Benzer bir çalışma gerçekleştirdim. Soru, esas olarak gzip kitaplığındaki bir hata ise. Python geliştiricileri ekibine bildirilecek mi? –

+0

Kendi çözümünüz ve benimki gösterdiğim gibi, stdlib 'gzip' iyi çalışıyor. Eminim problem, özel 'warc.gzip2' kütüphanesinde yatıyor. Benim için 3 farklı python 2.7 sürümü ile çalışmadı. –

İlgili konular