I am scraping a website and it contains many URLs from which O need to fetch data.
I used XPath and fetched all the hrefs (URLs) and saved in to a list. I looped this list and yielded a request. Below is my spider code,
class ExampledotcomSpider(BaseSpider):
name = "exampledotcom"
allowed_domains = ["www.example.com"]
start_urls = ["http://www.example.com/movies/city.html"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
cinema_links = hxs.select('//div[@class="contentArea"]/div[@class="leftNav"]/div[@class="cinema"]/div[@class="rc"]/div[@class="il"]/span[@class="bt"]/a/@href').extract()
for cinema_hall in cinema_links:
yield Request(cinema_hall, callback=self.parse_cinema)
def parse_cinema(self, response):
hxs = HtmlXPathSelector(response)
cinemahall_name = hxs.select('//div[@class="companyDetails"]/div[@itemscope=""]/span[@class="srchrslt"]/h1/span/text()').extract()
........
Here, for example, I had 60 URLs in the list, and for about 37 URLs are not downloaded: for these, an error message appeared:
2012-06-06 14:00:12+0530 [exampledotcom] ERROR: Error downloading <GET http://www.example.com/city/Cinema-Hall-70mm-%3Cnear%3E-place/040PXX40-XX40-000147377847-A6M3>: Error -3 while decompressing: invalid stored block lengths
2012-06-06 14:00:12+0530 [exampledotcom] ERROR: Error downloading <GET http://www.example.com/city/Cinema-Hall-35mm-%3Cnear%3E-place/040PXX40-XX40-000164969686-H9C5>: Error -3 while decompressing: invalid stored block lengths
Only for some URLs Scrapy is downloading, and for the remainder, I do not understand what’s happening and what’s wrong with my code.
Can anyone please suggest me how to remove these errors?
I am scraping a website and it contains many URLs from which O need to fetch data.
I used XPath and fetched all the hrefs (URLs) and saved in to a list. I looped this list and yielded a request. Below is my spider code,
class ExampledotcomSpider(BaseSpider):
name = "exampledotcom"
allowed_domains = ["www.example.com"]
start_urls = ["http://www.example.com/movies/city.html"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
cinema_links = hxs.select('//div[@class="contentArea"]/div[@class="leftNav"]/div[@class="cinema"]/div[@class="rc"]/div[@class="il"]/span[@class="bt"]/a/@href').extract()
for cinema_hall in cinema_links:
yield Request(cinema_hall, callback=self.parse_cinema)
def parse_cinema(self, response):
hxs = HtmlXPathSelector(response)
cinemahall_name = hxs.select('//div[@class="companyDetails"]/div[@itemscope=""]/span[@class="srchrslt"]/h1/span/text()').extract()
........
Here, for example, I had 60 URLs in the list, and for about 37 URLs are not downloaded: for these, an error message appeared:
2012-06-06 14:00:12+0530 [exampledotcom] ERROR: Error downloading <GET http://www.example.com/city/Cinema-Hall-70mm-%3Cnear%3E-place/040PXX40-XX40-000147377847-A6M3>: Error -3 while decompressing: invalid stored block lengths
2012-06-06 14:00:12+0530 [exampledotcom] ERROR: Error downloading <GET http://www.example.com/city/Cinema-Hall-35mm-%3Cnear%3E-place/040PXX40-XX40-000164969686-H9C5>: Error -3 while decompressing: invalid stored block lengths
Only for some URLs Scrapy is downloading, and for the remainder, I do not understand what’s happening and what’s wrong with my code.
Can anyone please suggest me how to remove these errors?
I am trying to extract a ZIP file from my current JAR using:
InputStream resource = getClass().getClassLoader().getResourceAsStream(name);
This get the correct InputStream, but it gives an error when I try to unzip it using the following code (I’m storing each file into a Hashmap<file, filename>):
public static HashMap<String, String> readZip(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
HashMap<String, String> list = new HashMap<>();
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
ZipEntry entry = zipInputStream.getNextEntry();
while (entry != null) {
if (!entry.isDirectory()) {
StringBuilder stringBuilder = new StringBuilder();
while (IOUtils.read(zipInputStream, buffer) > 0) {
stringBuilder.append(new String(buffer, "UTF-8"));
}
list.put(stringBuilder.toString(), entry.getName());
}
zipInputStream.closeEntry();
entry = zipInputStream.getNextEntry();
}
zipInputStream.closeEntry();
zipInputStream.close();
return list;
}
However when I try to do this, I get this exception (on IOUtils.read)
java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.ZipInputStream.read(Unknown Source)
Am I doing this wrong? I’ve done plenty of googling of the error, and I didn’t see anything related to my issue.
Я очищаю веб-сайт, и он содержит много URL-адресов, с которых нужно получить данные. Я использовал XPath и получил все hrefs (URL) и сохранены в списке. Я зациклил этот список и дал запрос. Ниже мой код паука,
class ExampledotcomSpider(BaseSpider):
name = "exampledotcom"
allowed_domains = ["www.example.com"]
start_urls = ["http://www.example.com/movies/city.html"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
cinema_links = hxs.select('//div[@class="contentArea"]/div[@class="leftNav"]/div[@class="cinema"]/div[@class="rc"]/div[@class="il"]/span[@class="bt"]/a/@href').extract()
for cinema_hall in cinema_links:
yield Request(cinema_hall, callback=self.parse_cinema)
def parse_cinema(self, response):
hxs = HtmlXPathSelector(response)
cinemahall_name = hxs.select('//div[@class="companyDetails"]/div[@itemscope=""]/span[@class="srchrslt"]/h1/span/text()').extract()
........
Вот, например, у меня в списке было 60 урлов, а примерно 37 урлов не скачиваются: для них появлялось сообщение об ошибке:
2012-06-06 14:00:12+0530 [exampledotcom] ERROR: Error downloading <GET http://www.example.com/city/Cinema-Hall-70mm-%3Cnear%3E-place/040PXX40-XX40-000147377847-A6M3>: Error -3 while decompressing: invalid stored block lengths
2012-06-06 14:00:12+0530 [exampledotcom] ERROR: Error downloading <GET http://www.example.com/city/Cinema-Hall-35mm-%3Cnear%3E-place/040PXX40-XX40-000164969686-H9C5>: Error -3 while decompressing: invalid stored block lengths
Только для некоторых URL-адресов Scrapy загружает, а для остальных я не понимаю, что происходит и что не так с моим кодом.
Может ли кто-нибудь предложить мне, как удалить эти ошибки?
Я пытаюсь отправить некоторые сжатые данные по сети, я думаю, что данные успешно сжаты, так как я могу повторно раздуть их из кода, который выкачивает данные (написан на C), однако, когда данные поступают на мой сервер (nodejs используя экспресс) и пытается раздуть данные, которые я получаю:
{ Error: invalid stored block lengths
at InflateRaw.zlibOnError (zlib.js:153:15) errno: -3, code: 'Z_DATA_ERROR' }
Любая помощь будет очень признательна, спасибо заранее.
Сзз.
П.Д.: Я могу предоставить вырезанный код, если он кому-нибудь пригодится.
Обновлено:
Спасибо за быстрый ответ и извините за задержку, я работал над своим кодом, теперь я отправляю исходные данные на сервер вместе со сжатыми данными. Когда исходные данные поступают на сервер, я сдуваю их, чтобы увидеть сгенерированные буферы, удивительно, что буферы сжатых данных, отправляемых по сети, и буфер, сжатый на сервере, в частности, являются одними и теми же кроме двух первых байтов:
<Buffer 78 da 15 8c c9 11 00 41 08 02 ff c6 82 55 83 b7 f9 27 b6 ee 13 68 7a a6 b0 4c b8 a7 68 ac 81 61 84 5a 8b e6 82 6b 05 bd aa 44 d9 5e a0 d7 20 6c 2f a6 ... >
<Buffer 15 8c c9 11 00 41 08 02 ff c6 82 55 83 b7 f9 27 b6 ee 13 68 7a a6 b0 4c b8 a7 68 ac 81 61 84 5a 8b e6 82 6b 05 bd aa 44 d9 5e a0 d7 20 6c 2f a6 bf 9b ... >
Итак, я думаю, что теперь мой вопрос заключается в том, могу ли я предположить, что эти первые два байта всегда будут появляться в сжатых данных из программы C? Есть ли возможность избежать этих первых двух байтов? Я делаю хорошо?
Здесь я оставляю вам функцию, которая сжимает данные в части C, нодовая часть — это просто огромный анализ пост-ввода и небольшая работа с буферами.
int compress_image (compressed_image raw, size_t size, compressed_image * out) {
z_stream strm;
int out_size = 0;
*out = (compressed_image) malloc(size);
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
int ret = deflateInit(&strm, Z_BEST_COMPRESSION); /* Max compression level, but bad speed performace */
if (ret != Z_OK)
return ret;
strm.avail_in = size;
strm.next_in = (unsigned char *)raw;
do {
strm.avail_out = size;
strm.next_out = *out;
ret = deflate(&strm, Z_FINISH); /* no bad return value */
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
out_size += (size - strm.avail_out);
} while (strm.avail_out == 0);
(void)deflateEnd(&strm);
return out_size;
}
Еще раз спасибо!
Обновлено еще раз:
Сейчас я сбрасываю свои буферы и вижу, что некоторые конечные байты тоже отличаются,
здесь у вас есть буфер, поступающий из программы C:
00000000: 78da 158c c911 0041 0802 ffc6 8255 83b7 xÚ..É..A..ÿÆ.U.·
00000010: f927 b6ee 1368 7aa6 b04c b8a7 68ac 8161 ù'¶î.hz¦°L¸§h¬.a
00000020: 845a 8be6 826b 05bd aa44 d95e a0d7 206c .Z.æ.k.½ªDÙ^.× l
00000030: 2fa6 bf9b 680e f2ce 9c67 975f 0e58 2d91 /¦¿.h.òÎ.g._.X-.
00000040: 75dc f1ed b25c 687a 43dd 42bc 1f98 e7dd uÜñí²hzCÝB¼..çÝ
00000050: 79a7 99f6 5fd3 bfcc 86f2 01b0 f51a cd y§.ö_Ó¿Ì.ò.°õ.Í
И буфер сдулся на сервере:
00000000: 158c c911 0041 0802 ffc6 8255 83b7 f927 ..É..A..ÿÆ.U.·ù'
00000010: b6ee 1368 7aa6 b04c b8a7 68ac 8161 845a ¶î.hz¦°L¸§h¬.a.Z
00000020: 8be6 826b 05bd aa44 d95e a0d7 206c 2fa6 .æ.k.½ªDÙ^.× l/¦
00000030: bf9b 680e f2ce 9c67 975f 0e58 2d91 75dc ¿.h.òÎ.g._.X-.uÜ
00000040: f1ed b25c 687a 43dd 42bc 1f98 e7dd 79a7 ñí²hzCÝB¼..çÝy§
00000050: 99f6 5fd3 bfcc 86f2 01
Однако, создав новый буфер без первых двух байтов, я могу правильно раздуть свои данные на сервере:
Моя часть node.js:
const dump = require('buffer-hexdump');
router.post('/test', function(req, res, next) {
let form = new formidable.IncomingForm();
form.uploadDir = "./uploads"
form.parse(req, function(err, fields, files) {
let deflated = zlib.deflateRawSync(fs.readFileSync(files.image_raw.path));
let image_buff = fs.readFileSync(files.image.path);
let buff = Buffer.alloc(image_buff.length - 2);
image_buff.copy(buff, 0, 2);
console.info(buff.equals(deflated)); //false
console.info(dump(deflated));
console.info(dump(image_buff));
zlib.inflateRaw(buff, (err, buffer) => {
if (err)
console.error(err);
else
console.info(buffer.toString()); //here I can see my data!!
});
res.status(200).send("POST received!");
});
});
Однако я не думаю, что это решено…
Еще раз спасибо!
Сзз.