Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пробу написать парсер

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
etoYA
Отправлено: 19 Февраля, 2013 - 14:19:06
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




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

1) Curl или file_get_contents? Думаю курл, так как там можно отправлять заголовки и.т.д
2) Порядок действий?

(Отредактировано автором: 19 Февраля, 2013 - 14:23:42)

 
 Top
OrmaJever Модератор
Отправлено: 19 Февраля, 2013 - 14:25:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




1) зависит от сайта но может подойти и file_get_contents
2) зависит от задачи вобщето, но в целом: регулярки


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
etoYA
Отправлено: 19 Февраля, 2013 - 14:31:10
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




OrmaJever пишет:
2) зависит от задачи вобщето, но в целом: регулярки

Немного не это имел ввиду.

Вот, этот сайт мне попался первым, решил на нем тренироватся.
_http://facte.ru/

Что делать дальше? Верный ход?

1) Нужно получить все ссылки на статьи (в цикле переходить по страницам /page/2/) и собирать их в массив.
Как понять, что страница полностью спаршена?
2) Потом пройтись по каждой ссылке и записывать в другой массив/базу информацию?
 
 Top
IstonRU
Отправлено: 19 Февраля, 2013 - 14:32:48
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Парсер - синтаксический анализатор. Если хочешь изучить данную тему, то читай Ахо "Путь дракона". Пригодится везде. Регулярки для Непонимающих, ИМХО.
 
 Top
etoYA
Отправлено: 19 Февраля, 2013 - 14:35:09
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




IstonRU, да не, регулярки я понимаюУлыбка С ними вопросов особых наверное и не будет. Мне само строение интересно, а в гугле не смотрб, ибо не хочу сразу начать коряво и не правильно писать, чтоб потом переучиватся).
 
 Top
IstonRU
Отправлено: 19 Февраля, 2013 - 14:40:26
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




etoYA, мне когда-то нужно было писать кросс-компилятор для микроЭВМ. Прочитав "Путь дракона", я смог реализовать его, хотя до прочтения, вообще не сталкивался с парсерами. Почитай книгу, там все логично, поймешь и будет тебе счастье.
 
 Top
etoYA
Отправлено: 19 Февраля, 2013 - 14:43:36
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




IstonRU, окей)
(Добавление)
Ну, этот код с задачей справляется, переходит по страницам и собирает ссылки в массив.
А теперь касательно кода, тут все нормально?
PHP:
скопировать код в буфер обмена
  1. $url = 'http://facte.ru';
  2. $maxPages = 3;
  3. for ($i = 0; $i < $maxPages; $i++){
  4.         $result = file_get_contents($url.'/page/'.$i);
  5.         preg_match_all('#<h2><a href="(.*?)" rel="bookmark">(.*?)</a></h2>#', $result, $matches);
  6.         $links[] = $matches[1];
  7. }
  8. var_dump($links);
 
 Top
esterio
Отправлено: 19 Февраля, 2013 - 14:51:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




etoYA
Незнаю как Вы но для себя я определил следующее поведения парсера:
1. запросы делаем с помощю cURL
2. Результат обрабативаем от формата данных
- JSON - json_decode
- HTML - PhpQuery и подобные
- иногда регулярками
 
 Top
OrmaJever Модератор
Отправлено: 19 Февраля, 2013 - 15:23:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




etoYA пишет:
1) Нужно получить все ссылки на статьи (в цикле переходить по страницам /page/2/) и собирать их в массив.
Как понять, что страница полностью спаршена?
2) Потом пройтись по каждой ссылке и записывать в другой массив/базу информацию?

1) Первым делом нужно получить список страниц.
2) Получили число страниц (пусть будет $c) затем в цикле (с количеством итераций $c) проходим по каждой страницу и берём оттуда все сылки (preg_match_all).
3) В каждой итерации делаем с этими ссылками что-то. Например записываем в бд или выводим на экран.
Возможно я напишу код для этой задачи, для примера.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
etoYA
Отправлено: 19 Февраля, 2013 - 15:37:32
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




PHP:
скопировать код в буфер обмена
  1.         public $url;
  2.         public $total;
  3.         public function getLinks($filename){
  4.                 for ($i = 0; $i < $this->total; $i++){
  5.                         $result = file_get_contents($this->url.'/page/'.$i);
  6.                         preg_match_all('#<h2><a href="(.*?)" rel="bookmark">(.*?)</a></h2>#', $result, $matches);
  7.                         $links[] = $matches[1];
  8.                 }
  9.                 $fp = fopen ("$filename.txt", "w");
  10.                 if (!$fp) return false;
  11.                 foreach ($links as $page=>$val){
  12.                         foreach ($val as $link){
  13.                                 fputs ($fp, "$link\r\n");
  14.                         }
  15.                 }
  16.                 fclose($fp);
  17.         }

PHP:
скопировать код в буфер обмена
  1.  
  2. $parser = new Parser;
  3. $parser->url = 'http://facte.ru/';
  4. $parser->total = 2;
  5. $parser->getLinks('links');
  6.  


результат записывается в файл.
Получение ссылок сделал нормально?

(Отредактировано автором: 19 Февраля, 2013 - 15:38:08)

 
 Top
OrmaJever Модератор
Отправлено: 19 Февраля, 2013 - 15:44:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Вот мой вариант
PHP:
скопировать код в буфер обмена
  1. $f = file_get_contents('http://facte.ru/index.php');
  2. preg_match_all("#<a class='page-numbers' href='http://facte.ru/page/(\d+)/'>(\d+)</a>#is", $f, $p);
  3. $c = end($p[2]);
  4. echo '<table>';
  5. for($i=0; $i<$c; ++$i)
  6. {
  7.         $f = file_get_contents("http://facte.ru/page/$i/");
  8.         preg_match_all('#<a href="http://facte.ru/([a-z0-9_-]+).html" rel="bookmark">(.+?)</a>#is', $f, $p);
  9.         echo "<tr><td>page $i</td><td></td></tr>";
  10.         for($x=0; $x<count($p[1]); ++$x)
  11.         {
  12.                 echo '<tr><td>http://facte.ru/'.$p[1][$x].'.html</td><td>', $p[2][$x], '</td></tr>';
  13.         }
  14. }
  15. echo '</table>';

Блин ещё прозьба, не нужно всё без нужны запихивать в класс. Здесь реально одной функции достаточно.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
etoYA
Отправлено: 19 Февраля, 2013 - 15:51:57
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




OrmaJever, я вкурсе на счет функции, просто этот класс разбит на 2 метода.

getLink - ссылки записываются в файл
getContent - контент записывается в базу
 
 Top
OrmaJever Модератор
Отправлено: 19 Февраля, 2013 - 15:56:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




если у вас всего 2 постояные метода работы со сылками (запись в файл и в базу) то можно зделать просто аргумент true или false, например
PHP:
скопировать код в буфер обмена
  1. function parser($url, $total = 2, $file = true) {
  2. ....
  3.  
  4. if($file) {
  5.    запись в файл
  6. } else {
  7.    запись в бд.
  8. }
  9. ...

а я бы вобще наверно колбеком зделал.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
etoYA
Отправлено: 19 Февраля, 2013 - 15:59:25
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




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

Еще вопрос, вот перешел я по ссылке. Парюсь и никак не могу спарсить контент..
_http://facte.ru/pilot-samolyota-i-vtoroj-pilot-pered-rejsom-obyazany-est-raznye-blyuda.html
 
 Top
OrmaJever Модератор
Отправлено: 19 Февраля, 2013 - 16:02:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




etoYA вы не первый день на форуме и должны понимать что фраза "никак не получается" должна подкреплятся кодом котором вы это пробуете. В даном случае мне бы на регулярку глянуть.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB