[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер картинок с двух сайтов
Dark_Strannik
Здравствуйте форумчане.
Необходимо парсить картинки с двух сайтов. Берем из БД все что необходимо и через цикл WHILE запускаю парсер. Но он парсит несколько имен и останавливает. Поэтому ставлю в запросе LIMIT и парсю по 50 имен. Жду когда отработает скрипт, изменяю с какого числа парсить и снова запускаю. В чем проблема, что не так, почему после перезагрузки скрипта парсер снова загружает картинки?
Работать работает, но криво, так как в базе 300 000 с лишним имен.
Часть кода:

$sth = $dbh->query("SELECT `nameArtist` FROM `parserpicture` LIMIT $start, $limit");
$sth->setFetchMode(PDO::FETCH_ASSOC);

while($row = $sth->fetch()){
$nameArtist = $row['nameArtist'];

$url = 'сайт_номер_1/?q='.$nameArtist;
$links = firstLink($url);
secondLink($links, $nameArtist);

$url = 'сайт_номер_2/'.$nameArtist;
$first = firstNastol($url);
secondNastol($first, $nameArtist);
}
Игорь_Vasinsky
Цитата
почему после перезагрузки скрипта парсер снова загружает картинки?

покажи где у тебя в скрипте алгоритм проверки уже загруженных картинок?

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dark_Strannik
такого нет, и не знаю что это, проверяю визуально, открываю - смотрю
Игорь_Vasinsky
вот по этому и загружает по новой - т.к. алгоритм заного начинает работать, а проверки нет.

или ты имеешь ввиду, что когда меняются значения

Цитата
LIMIT $start, $limit"
?

значит проверяй свой пагинатор

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dark_Strannik
парсер картинки загружает
если возьму из базы 100 000 картинок, он загрузит 20-30 и останавливается
поэтому загружаю понемногу
что обозначает "пагинатор"?
Игорь_Vasinsky
Цитата
что обозначает "пагинатор"?

pagination

не бери в голову.

ты пытаешься касками из БД брать строки - так? так
на каждую строку запускаешь парсер и получаешь картинку - так? так

у тебя когда повторы картинок идут?

когда как ты запускаешь парсер? по новой? или с другим LIMIT ?

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dark_Strannik
не повторы
парсер не парсит все записи
загрузит 20-30 картинок и все - останавливается словно ограничение на сайтах стоит, нельзя скачивать больше n-го количества
но если я изменю/не изменю значение LIMIT он снова буде загружать будто и нет никакого ограничения
Игорь_Vasinsky
интервалы делай между парсингом, секунды 2-4

или используй прокси

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dark_Strannik
интервалы - sleep(5) раньше был в самом начале цикла WHILE, не помогало
WHILE(...){
sleep(5);
...

}


я конечно погуглю, но что такое "прокси"?
Игорь_Vasinsky
прокси сервера + curl

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dark_Strannik
благодарю, сейчас стало лучше работать, хотя барахлит парой

// массив с российскими прокси серверами
$arrayProxy = array('...');

// перемешиваю массив
shuffle($arrayProxy);

// беру первое случайное значение сервера
$proxy = $arrayProxy [0]

// функция для получения страницы по ссылке
function get($url, $proxy)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
curl_setopt($ch, CURLOPT_PROXY, "$proxy");// прокси
$ss=curl_exec($ch);
curl_close($ch);
return $ss;
}

// остальное почти не изменилось


возможно я сделал что-то не так
Игорь_Vasinsky
бесплатные прокси могут неожиданно умирать(проверять ответ и если что брать следующий или другой), такое бывает, + multicurl

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Dark_Strannik
спасибо за совет, теперь работает без сбоев, но в разы медленнее


// функцию нашел в инете и добавил часть кода к своей
// функция возвратит код искомой страницы в виде строки

function getPage($url, $proxy){

$headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
$headers[] = 'Connection: Keep-Alive';
$headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
$userAgent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (NET CLR 3.5.307029)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, true);// true != 1 ???

curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);// чтобы сайт принял нас за браузер
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// ответ сервера будем записывать в переменную
curl_setopt($ch, CURLOPT_TIMEOUT, 30);// максимальное время нашего сеанса в секундах
curl_setopt($ch, CURLOPT_URL, $url);// задаём url
curl_setopt($ch, CURLOPT_PROXY, $proxy);// прокси

$result = curl_exec($ch);

if(curl_error($ch)){
global $file;
shuffle($file);
$proxy = $file[0];
getPage($url, $proxy);
}
curl_close($ch);
return $result;
}


// немного не понятный кусок, зачем так?
// curl_setopt($ch, CURLOPT_HEADER, 1);
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// curl_setopt($ch, CURLOPT_HEADER, 0);


$end = n;
for($start=n; $start<=$end; $start++){

$proxyList = 'proxy.txt';// файл с прокси
$file = file($proxyList);// массив с прокси


$limit = 1;// беру по одному значению из таблицы - может по этому тормозит
$sth = $dbh->query("SELECT `id`, `nameArtist` FROM `parserpicture` LIMIT $start, $limit");
$sth->setFetchMode(PDO::FETCH_ASSOC);
$row = $sth->fetch();

shuffle($file);
$proxy = $file[0];
// далее идут функции которые используют ф-цию getPage()



Возможно, что снова накосячил.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.