Перейти к содержимому


Получение данных с сторонних сайтов

импорт данных

Сообщений в теме: 13

#1 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 02 Май 2014 - 12:10

Есть необходимость получать данные с сторонних ресурсов.
Допустим есть карточка объекта недвижимости
И мне с нее надо выдернуть какие либо печатные данные а я имею только гиперссылку
То есть мне надо чтоб по моему действию или сохранению гиперссылки в таблица обработчик заходил на сайт и забирал данные
С какой стороны подступится, ? писать свои процедуры PHP JS и привязывать к доп действию, может кто-то делал что-то подобное
ПЫСЫ - карточки объктов все одинаковые и имеют одинаковую разметку

#2 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 02 Май 2014 - 14:07

Сделал простую табличку
поле ссылка - однострочное
поле данные - многострочное
Сделал вычисление

$data['данные'] = file_get_contents($line['ссылка']);

по сохранению поле заполняется 356 символами а дальше "ёк"

Это какое то ограничение или что ? даже первая строка в виде html данной ссылки длинее

#3 wondertalik

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

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 02 Май 2014 - 15:40

Просмотр сообщенияManFree (02 Май 2014 - 14:07) писал:

Сделал простую табличку
поле ссылка - однострочное
поле данные - многострочное
Сделал вычисление
$data['данные'] = file_get_contents($line['ссылка']);
Это из разряда костыли. Вам нужен парсер писать. Если структура данных одинакова. А эти библиотеки помогут вам Simple_html_dom, phpQuery, Snoopy. Последняя уже есть в кб.

#4 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 02 Май 2014 - 17:54

А описание где пощукать по snoopy - я так понял она есть в кб, по остальным вроде как есть исчерпывающая ипнформация а по снуми что-то маловато или ищу как то не так

Вся нужная мне инфа хранится между тегов <span> </span>

И скажем если в массив загнать все содержимое между этих тегов по странице, будет мне счастье

на phpquery пробую вот такой код но до конца пока не разобрался
require('./phpQuery.php');
$url = "http://,,,,,,";
$page_content = file_get_contents($url);
$html = phpQuery::newDocument($page_content);

$posts = $html->find('span#main > span.post');
foreach($posts as $post){
$post_link = pq($post)->find('<span> > </span>');
echo $post_link->text(); // заголовок поста

}

Сообщение отредактировал ManFree: 02 Май 2014 - 17:57


#5 wondertalik

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

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 02 Май 2014 - 18:13

Забудьте про file_get...


        require_once ("include/snoopy.class.php");
....

			$url = $line['Ссылка на товар'];
			//Адрес страницы с товаром
			//Получаем содержимое страницы с помощью Snoopy()
			$snoopy = new Snoopy();
			$open_link_snoopy = $snoopy -> fetch($url);
			$html = $snoopy -> results;
			phpQuery::newDocumentHTML($html);

Сообщение отредактировал wondertalik: 02 Май 2014 - 18:14


#6 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 02 Май 2014 - 18:47

сделал вот такой код
 require_once ("include/snoopy.class.php");
$url = $line['ссылка'];
						//Адрес страницы с товаром
						//Получаем содержимое страницы с помощью Snoopy()
$snoopy = new Snoopy();
$open_link_snoopy = $snoopy -&gt; fetch($url);
$html = $snoopy -&gt; results;
$line['данные']=strlen($html);
$s1 = strpos($html, "Расположение");
$line['Номер символа']=$s1;

странно вот что
Длина $line['данные']=strlen($html); при каждом сохранении разная 35800,35790,35700 - хотя может и не странно меняется же количество посетителей и т.д. и визиты
$s1 = strpos($html, "Расположение"); вождение строки не определяет уж не знаю почему

и если попытаться загнать $html в поле данные - получаются те же яйцы что и file_get_contents($url); 356 символов и все


Пытаюсь получить содержимое вот этой страницы
http://domchel.ru/re...ail/5816961.php

Сообщение отредактировал ManFree: 02 Май 2014 - 19:20


#7 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 02 Май 2014 - 21:26

В общем после длительных мучений понял что не работает именно с сайтом http://domchel.ru,
с яндексом парсирует с майлом парсирует с другими сайтами тоже что с домчелом не так не понимаю

#8 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 03 Май 2014 - 07:12

Просмотр сообщенияManFree (02 Май 2014 - 21:26) писал:

В общем после длительных мучений понял что не работает именно с сайтом http://domchel.ru,
с яндексом парсирует с майлом парсирует с другими сайтами тоже что с домчелом не так не понимаю

В общем разобрался
Проблема в кодировке
добавил функцию преобразования кодировки

 require_once ("include/snoopy.class.php");
$url = $line['ссылка'];
					    //Адрес страницы с товаром
					    //Получаем содержимое страницы с помощью Snoopy()
$snoopy = new Snoopy();
//$open_link_snoopy = $snoopy -> fetch($url);
$snoopy->fetch($url);
$html = $snoopy -> results;
//$line['данные']=iconv( "windows-1251", "utf-8", $html);
$html=iconv( "windows-1251", "utf-8", $html); 


#9 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 05 Май 2014 - 19:01

phpQuery::newDocumentHTML($html);

А это для чего ?

Сообщение отредактировал ManFree: 05 Май 2014 - 19:01


#10 wondertalik

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

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 05 Май 2014 - 20:07

Просмотр сообщенияManFree (05 Май 2014 - 19:01) писал:

phpQuery::newDocumentHTML($html);

А это для чего ?
Это нужно для парсинга, выуживание чего-либо по тегам и структуре.

#11 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 06 Май 2014 - 12:47

Просмотр сообщенияwondertalik (05 Май 2014 - 20:07) писал:

Это нужно для парсинга, выуживание чего-либо по тегам и структуре.

Странно и без него работает
а с ним на ошибку вываливается ,что не так ?
phpQuery::newDocumentHTML($html);

С первой задачей я справился все ок! Но есть еще один момент, есть динамическая страница и есть куча чекбоксов для фильтрации контента, дак вот эти переключатели влияют на фильтр и отражаются в строке браузера в виде:

/#1.php%order=DateUpdate&dir=asc&PriceUnit=1&AreaUnit=1&expand=0&PriceUnit=1&Owner[]=0&Date=1&DateNew=1&WithPhoto=1

Но почему то парсер не считывает эту строку и парсирует страницу как будто этого ничего нет и есть только

http://domchel.ru/re...tial/secondary/

В чем может быть проблем может кто подскажет ?


Да кстати если посмотреть код страницы которая уже отфильтровала свой контент. в нем тоже нет того что нужно. Это меня в ступор ставит. Хотя если страницу сохранить на HDD файлом и открыть то там уже все есть)
Как так ?

Сообщение отредактировал ManFree: 06 Май 2014 - 12:59


#12 ManFree

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

  • Пользователи
  • PipPipPip
  • 107 сообщений

Отправлено 07 Май 2014 - 08:20

Уважаемые господа. Я победил снуппи рулит
Спасибо всем за помощь

order=DateUpdate&dir=asc&PriceUnit=1&AreaUnit=1&expand=0&PriceUnit=1&Owner[]=0&Date=1&DateNew=1&WithPhoto=1

передал в виде параметров в сунпи
и сэмулировал браузер

$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$snoopy->referer = "http://google.com/";
$snoopy->cookies["SessionID"] = '238472834723489';
$snoopy->cookies["favoriteColor"] = "blue";
$snoopy->rawheaders["Pragma"] = "no-cache";
$submit_vars["order"] = "DateUpdate";
$submit_vars["dir"] = "asc";
$submit_vars["PriceUnit"] = "1";
$submit_vars["AreaUnit"] = "1";
$submit_vars["expand"] = "0";
$submit_vars["PriceUnit"] = "1";
$submit_vars["Owner[]"] = "0";
$submit_vars["Date"] = "1";
$submit_vars["DateNew"] = "1";
$submit_vars["WithPhoto"] = "1";
$snoopy->submit($submit_url,$submit_vars);

Сообщение отредактировал ManFree: 07 Май 2014 - 08:23


#13 Riddick

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

  • Пользователи
  • PipPipPip
  • 70 сообщений

Отправлено 18 Февраль 2015 - 15:26

Господа, прошу пояснить, почему не работает такая конструкция:
$res = file_get_contents('https://api.vk.com/method/groups.getMembers?group_id=17157755');
echo $res;
$resp = json_decode($res, true);
var_dump($resp);
Эхо пустое, вардамп - нулл. Сама ссылка в браузере все, что надо выводит.
Я охотно верю, что snoopy рулит, но все же это надстройка, в которую надо вникать, а file_get... мне например предельно понятен. Что с ним не так?

Переделал через снупи...

Сообщение отредактировал Riddick: 19 Февраль 2015 - 01:14


#14 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 24 Февраль 2015 - 12:33

Функция file_get_contents по умолчанию не работает с http ссылками, только с локальными путями. Отчасти поэтому нами и используется snoopy (вторая причина - возможность задать прокси, т.е. если он стоит, file_get_contents также работать не будет, даже при включенной allow_url_fopen). Альтернатива тут только curl, но он чуть сложнее в использовании.





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных