Как создать такой парсер?

Busgame
На сайте с 10.07.2011
Offline
24
#51

Нужен именно бесконечный, читайте выше.

L9
На сайте с 28.12.2009
Offline
53
#52
Busgame:
Нужен именно бесконечный, читайте выше.

Зачем бесконечный, в чём смысл ?

Обошёл все страници сайта, и что опять повторить цикл.

Программирую на ASP.NET, MVC, C#, ANGULAR JS
Busgame
На сайте с 10.07.2011
Offline
24
#53

Сайт постоянно обновляется, парсить нужно постоянно.

DV
На сайте с 01.05.2010
Offline
644
#54

Лучше не надо бесконечный, возможны бесконтрольные состояния.

Я такие вещи по крону запускаю.

Чтобы не было параллельных процессов, можно создавать PID файл.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
L9
На сайте с 28.12.2009
Offline
53
#55
Busgame:
Сайт постоянно обновляется, парсить нужно постоянно.

Тогда парсте сайт полностю, а потом повторяйте обход каждые X минут.

Иначе будет постоянный бесконечный цикл вокруг повторяющихся урлов и многие из них сканироватся вобще не будут(или очень редко).

В конце ваша коллекция переполница и программа повалит сервер.

Busgame
На сайте с 10.07.2011
Offline
24
#56

Хм, логично. Но лучше просто:

а) занести страницу в индекс.

б) считывать данные спарсенной страницы со страницы - оригинала.

в) пополнять индекс.

Буду реализовывать.

L9
На сайте с 28.12.2009
Offline
53
#57

то что я вам и писал:

Опредилитесь с колекциями.

1. Dictionary O(1) - отсканированые ссылки.

2. Queue (1) - содержит и пополняет себя новыми и не отсканироваными ссылками.

Busgame
На сайте с 10.07.2011
Offline
24
#58

Угу, просто немного сложно для восприятия. А так большое спасибо.

D
На сайте с 14.01.2007
Offline
153
#59
Busgame:
$mas = array(
$a = 'a';
$b = 'b';
)

ну вообще то

$mas=array("a"=>"a","b"=>"b");

для вашего случая:

$spisok=array("index");

for($i=0;~;$i++){

$url=array_shift($spisok);

$site=curl($url);

$urls=daj_mne_urls($site);

$spisok[]=$urls;

}

http://php.net/manual/en/function.array-shift.php

Busgame
На сайте с 10.07.2011
Offline
24
#60

Dinozavr, я набросал по быстрому просто, в целом все понятно.

Сейчас в качестве теста попробую:

1. Спарсить главную страницу.

2. Извлечь все ссылки.

3. Перейти по первой ссылке на страницу.

4. Вывести эту страницу на экран.

О результатах напишу.

---------- Добавлено 30.12.2012 в 20:18 ----------

Сейчас, собсно, имеем такой код:


$res - полученная курлом страница

$htmldoc = phpQuery::newDocument($res); //создали новый док

$urlosearch = $htmldoc->find('a'); //нашли все ссылки на странице

$massive = array($urlosearch); //заключили в $massive

$firstlink = array_shift($massive); //извлекли первую ссылку этого массива, но при выводе, браузер отображает все ссылки ($urlosearch в массиве $massive), а не только первую

$perehod = curl_setopt($ch, CURLOPT_URL, $firstlink); // попытка передачи урла

echo $perehod; //выводится "1" (без ковычек)

По моей логике: array_shift не может вывести элементы массива отдельно, поэтому выводит все элементы как один (т.е. в массиве всего один элемент, который содержит все ссылки). Отсюда и недоступность к переходу. Возможно, все ссылки нужно собрать в ручную, а полученный массив передать курлу?

---------- Добавлено 30.12.2012 в 20:23 ----------

Возможно, все ссылки нужно собрать в ручную, а полученный массив передать курлу?

Хотя если так сделать с главной страницей, то с внутренними будет аналогично. Тогда этот вариант не подходит.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий