Задать вопрос
@maksam07

Как использовать CURL, который вызывается таймером ( js ) несколько раз?

В общем, не знаю как правильно описать. Хочу парсить JSON данные одного сайта. Если нужно спарсить 1 запрос, то CURL парсит отлично, возвращает результат и все отображается верно. Но если запросов хотя бы 2, то есть при клике на кнопку
"Старт" (условно) запускается таймер. Первый раз результата нет, то есть какая-то ошибка, не смог спарсить данные, а на второй раз парсит нормально и результат возвращается. Так же само, если запросов 2-...много. Пускай будет 2 - 10. ajax везде вернет ошибку, но только последний запрос вернется с результатом. Я думал, что может курл не успевает парсить как-то. Ставил таймеру интервал в 5 секунд и все равно, он на всех запросах возвращал пустой результат и только на последнем работал. Ну или если это 1 запрос, то результат тоже был. Причем!!! с file_get_contents парсит все 10 запросов с результатом. Обращение к CURL и file_get_contents одинаковое.

Щас попробую чуть кода кинуть:
<button type="button" id="startPars">Парсить</button>

var timerId;
	function PPars(){
		$.ajax({url: '/ajax/query.php', type: 'POST', data: $("form#one").serialize(), dataType: "JSON",
			error: function (){ $("#result").append( "<div>Внутренняя ошибка</div>" ); },
			success: function ( a ) { 
				if ( a.s ) { 
					if ( a.log )
						$("#result").append( a.log ); 
				} else { 
					$("#result").append( a.log );
				}
				if ( a.tmr )
					timerId = setTimeout( PPars, a.tmr );
			}
		});
	}

не рабочая версия функции
$getRes = curl( "сайт какой-то" );
	$getRes = json_decode($getRes, true);
	// обрабатываем результат...
	$data = array( "s" => $s, "log" => $log, "tmr" => $tmr );
	echo json_encode($data);

	function curl($url) {
		$ch = curl_init($url);
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
		$response = curl_exec($ch);
		curl_close($ch);
		return $response;
	}

рабочая версия функции
function curl($url) {
		$ctx = stream_context_create(
			array('http'=>
				array(
					'timeout' => 1200,
				)
			)
		);
		$response = file_get_contents( $url, false, $ctx );
		return $response;
	}

часть кода, конечно же не выложена, но думаю я всю основную информацию предоставил. Почему при одном запросе курл возвращает результат, а если стоит таймер на 2 и более повторений, то только при последнем запросе возвращается результат?
  • Вопрос задан
  • 391 просмотр
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
dummyman
@dummyman
диссидент-схизматик
CasperJS
PhantomJS
SlimerJS

Вот банальный пример парсинга по 10 результатов двух запросов из Google

var links = [];
var casper = require('casper').create();

function getLinks() {
    var links = document.querySelectorAll('h3.r a');
    return Array.prototype.map.call(links, function(e) {
        return e.getAttribute('href');
    });
}

casper.start('http://google.fr/', function() {
   // Wait for the page to be loaded
   this.waitForSelector('form[action="/search"]');
});

casper.then(function() {
   // search for 'casperjs' from google form
   this.fill('form[action="/search"]', { q: 'casperjs' }, true);
});

casper.then(function() {
    // aggregate results for the 'casperjs' search
    links = this.evaluate(getLinks);
    // now search for 'phantomjs' by filling the form again
    this.fill('form[action="/search"]', { q: 'phantomjs' }, true);
});

casper.then(function() {
    // aggregate results for the 'phantomjs' search
    links = links.concat(this.evaluate(getLinks));
});

casper.run(function() {
    // echo results in some pretty fashion
    this.echo(links.length + ' links found:');
    this.echo(' - ' + links.join('\n - ')).exit();
});


Выдает

$ casperjs googlelinks.js
20 links found:
 - https://github.com/casperjs/casperjs
 - https://github.com/casperjs/casperjs/issues/2
 - https://github.com/casperjs/casperjs/tree/master/samples
 - https://github.com/casperjs/casperjs/commits/master/
 - http://www.facebook.com/people/Casper-Js/100000337260665
 - http://www.facebook.com/public/Casper-Js
 - http://hashtags.org/tag/CasperJS/
 - http://www.zerotohundred.com/newforums/members/casper-js.html
 - http://www.yellowpages.com/casper-wy/j-s-enterprises
 - http://local.trib.com/casper+wy/j+s+chinese+restaurant.zq.html
 - http://www.phantomjs.org/
 - http://code.google.com/p/phantomjs/
 - http://code.google.com/p/phantomjs/wiki/QuickStart
 - http://svay.com/blog/index/post/2011/08/31/Paris-JS-10-%3A-Introduction-%C3%A0-PhantomJS
 - https://github.com/ariya/phantomjs
 - http://dailyjs.com/2011/01/28/phantoms/
 - http://css.dzone.com/articles/phantom-js-alternative
 - http://pilvee.com/blog/tag/phantom-js/
 - http://ariya.blogspot.com/2011/01/phantomjs-minimalistic-headless-webkit.html
 - http://www.readwriteweb.com/hack/2011/03/phantomjs-the-power-of-webkit.php


То есть, ссылки вверху ответа - это скриптовые браузеры.
Не нужен никакой curl. Даешь команды
  • Перейти на URL
  • Заполнить поле для ввода
  • Ждем таймаут 5 секунд
  • Жмем кнопку ОК
  • Берем по селекторам результаты, любые разные данные

Это можно запускать даже на сервере. То есть, впролне можно использовать в продакшене.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы