PhantomJS и pjscrape — сбой на некоторых нескольких URL-адресах

Обзор

Я пытаюсь создать очень простой скребок с фреймворком PhantomJS и pjscrape.

Мой код

pjs.config({
timeoutInterval: 6000,
timeoutLimit: 10000,
format: 'csv',
csvFields: ['productTitle','price'],
writer: 'file',
outFile: 'D:\\prod_details.csv'
});

pjs.addSuite({
title: 'ChainReactionCycles Scraper',
url: productURLs, //This is an array of URLs, two example are defined below
scrapers: [
    function() {
        var results [];
        var linkTitle = _pjs.getText('#ModelsDisplayStyle4_LblTitle');
        var linkPrice = _pjs.getText('#ModelsDisplayStyle4_LblMinPrice');
        results.push([linkTitle[0],linkPrice[0]]); 
        return results;
    }
]
});

Используется массив URL

Этот первый массив НЕ РАБОТАЕТ и дает сбой после третьего или четвертого URL.

var productURLs = ["8649","17374","7327","7325","14892","8650","8651","14893","18090","51318"];
for(var i=0;i<productURLs.length;++i){
  productURLs[i] = 'http://www.chainreactioncycles.com/Models.aspx?ModelID=' + productURLs[i];
}

Этот второй массив РАБОТАЕТ и не дает сбоев, даже если он с того же сайта.

var categoriesURLs = ["304","2420","965","518","514","1667","521","1302","1138","510"];
for(var i=0;i<categoriesURLs.length;++i){
  categoriesURLs[i] = 'http://www.chainreactioncycles.com/Categories.aspx?CategoryID=' + categoriesURLs[i];
}

Проблема

При повторении productURLs необязательный обратный вызов PhantomJS page.open автоматически предполагает сбой. Даже если страница не закончила загрузку.

Я знаю это, так как запустил скрипт во время работы отладчика HTTP, и HTTP-запрос все еще выполнялся даже после того, как PhantomJS сообщил об сбое загрузки страницы.

Однако код отлично работает при работе с categoriesURLs.

Предположения

  1. Все указанные выше URL ДЕЙСТВИТЕЛЬНЫ.
  2. У меня есть последние версии PhantomJS и pjscrape.

Возможные решения

Это решения, которые я пробовал до сих пор.

  1. Отключение загрузки изображений page.options.loadImages = false
  2. Настройки большего размера timeoutInterval в pjs.config явно бесполезны, поскольку сгенерированная ошибка относится к сбою page.open, а НЕ к сбою тайм-аута.

Любые идеи?


person Hzmy    schedule 10.03.2012    source источник
comment
Как я только что отметил на GitHub, я не могу воспроизвести проблему — я смог без проблем получить список productUrls. Я не думаю, что это проблема Pjscrape — это звучит как проблема с PhantomJS.   -  person nrabinowitz    schedule 13.03.2012


Ответы (1)


Проблема была вызвана PhantomJS. Теперь это решено.

Сейчас я использую PhantomJS v2.0.

person Hzmy    schedule 14.03.2012
comment
Исправлено как? Какую версию PhantomJs вы использовали? (Имея ту же проблему с 1.6 и последней версией, скомпилированной из исходников git) - person Mehdi Lahmam B.; 23.07.2012
comment
@Hzmy Было бы более достойно назвать ответ, если бы вы также сказали, какое решение вы использовали вместо PhantomJS. - person rineez; 15.10.2015
comment
@rineez Я только что обновил бинарный файл PhantomJS до версии 2.0, и мой код заработал. - person Hzmy; 15.10.2015
comment
Ой! Для меня PhantomJS 1.9 хорошо работает с pjscrape. 2.0 показывал слишком много проблем совместимости с текущей версией pjscrape. - person rineez; 16.10.2015
comment
В коде, который вы разместили с вопросом: эта строка var results []; мне кажется неправильной. Я никогда не видел такого синтаксиса в js. Это допустимый синтаксис? - person rineez; 16.10.2015
comment
это опечатка. Должно быть: var results = []; - person Hzmy; 19.10.2015