Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 29.10.2013
Сообщений: 230

Пример парсинга записи с другого сайта

27.11.2014, 19:29. Показов 1973. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, трбуется простой пример парсинга записи с другого сайта, например новости с лента ру или что нибудь еще. Спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2014, 19:29
Ответы с готовыми решениями:

Нужен пример парсинга с гугла / рамблера / яндекса
Всем пример , плиз скиньте пример вот такой вод софтины : а именно парсинг ссылок с гугла / яндекса / рамблера опр. запроса который...

Можно пример парсинга конфигов для Flask
Есть конфиг файл, как фласком спарсить?

Защита от парсинга сайта
Уважаемые форумчане. Такой вопрос. У меня парсят сайт, ежедневно и не один раз, а по мере наполнения контента. Первый вопрос, если я в...

1
65 / 64 / 33
Регистрация: 25.02.2014
Сообщений: 229
27.11.2014, 23:07
Лучший ответ Сообщение было отмечено Ваник Хачатрян как решение

Решение

Не буду приводить весь код.
Свое решение приводить полностью не буду, так как там много всего и сложно.
Только ключевые методы.

1. чтение контента страницы
PHP
1
2
3
4
5
6
7
8
9
10
11
12
function getContent()
{
   if($this->content)
      return $this->content;
   if($this->resource = @fopen($uri->toString(), 'r'))
       $this->http_response_header = stream_get_meta_data($this->resource);
 
   while($line = fgets($this->resource, 2000))
      $this->content .= $line;
 
    return $this->content;
  }
2. Извлечение списка ссылок для парсинга
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function extract($content)
  {
    $rex = '/(<a.*?href\s*=\s*(?:"|\'|)([^"\'>\s]+)(?:"|\'|).*?>)(.*?)<\/a>/s';
    preg_match_all($rex,
                   $content,
                   $matches,
                   PREG_SET_ORDER);
 
    $uris = array();
 
    $match_number = 2;
 
    for ($i=0; $i < sizeof($matches); $i++)
    {
      try { 
        $uris[] = new lmbUri($matches[$i][$match_number]);//тут ссылка в объект обворачивается
      }
      catch(lmbException $e) {};
    }   
    return $uris;
  }
3. Полученные ссылки надо нормализовать.
Например, если ссылка /path, то привести ее к виду http://site.ru/path и т.д.
4. Пробегаемся по списку ссылок. для каждой грузим контент и вынимаем нужные данные как-то так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class ContentReader
{     
  protected $data;
  function getContent()
  {
    if($this->data)
      return $this->data;
 
    //ресурс инициализируем в конструкторе
    while($line = fgets($this->resource, 5000))
      $this->content .= $line;
    $this->data = array();
 
    //так получаем заголовок 
    $title_re='~<title>([^<|]*).*<\/title>~';
    if(preg_match_all($title_re, $this->content, $matches))
      $this->data['title']=$matches[1][0];
    //так ключевики
    $this->data['keywords']='';
    $key_re='~<meta\s*name\s*=\s*["\']keywords["\']\s*content\s*=\s*[\'"]([^\'"]+)[\'"]~';
    if(preg_match_all($key_re, $this->content, $matches))
      $this->data['keywords']=str_replace('kargopolland,','',$matches[1][0]);
 
    
    $content_re='~<div class="inner news">(.+?)<div class="clearing">~is';//регулярное выражение для извлечения области с текстом
    if(preg_match_all($content_re, $this->content, $matches))
    {
      //чистим мусор
      $content = preg_replace('~<h3>[^<]+</h3>~is','',$matches[1][0]);
      $content = preg_replace('~<span class="date">[^<]+</span>~is','',$content);
      $content = preg_replace('~<p[^>]*>\s*</p>~is','',$content);
      $content = preg_replace('~<p[^>]*>.nbsp.</p>~is','',$content);
      $this->data['content']=strip_tags(trim($content),'<p>');
 
      //в качестве описания берем первый абзац
      $annot_re='~<p[^>]*>([^<]+)</p>~';
      if(preg_match_all($annot_re, $this->data['content'], $matches))
        $this->data['annotation']=$matches[1][0];
    
      //если в тексте есть картинки, то первую берем в качестве картинки для поста
      $img_re='~<img[^\/>]+src=[\'"]([^\'"]+)[\'"]~';
      if(preg_match_all($img_re, $content, $matches))
      {
        $img = new lmbUri($matches[1][0]);
        $this->_normalizeUriUsingContext($img, $this->uri);
        $this->data['tmp_img']= $this->cacheRemoteImage($img->toString());
      }  
    }
    return $this->data;
  }
  
  function _normalizeUriUsingContext($uri, $context_uri)//получает полный урл
  {
    if(!$uri->getHost())
    {
      $uri->setHost($context_uri->getHost());
 
      if(($path = $context_uri->getPath()) && $uri->isRelative())
      {
        $path = preg_replace('~(.*)(/[^/]*)$~', '$1/', $path);
        $uri->setPath($path . $uri->getPath());
      }
    }
 
    if(!$uri->getProtocol())
      $uri->setProtocol($context_uri->getProtocol());
 
    $uri->setAnchor('');
 
    $uri->normalizePath();
  }
  
  function cacheRemoteImage($url)кеширует картинку, при сохранении текста ее надо переместить из временного хранилища
  {
 
    $contents = @file_get_contents($url);
    $filename = substr(md5(time()), 0, 5) . '_' . basename($url);
 
    $cachepath = lmbToolkit::instance()->getConf('common')->get('temp_file_storage');
    $cachepath = $cachepath['store_rules']['path'];
    
    if(is_writable($cachepath) && $contents)
    {
      file_put_contents($cachepath . '/' . $filename, $contents);
      return $cachepath . '/' . $filename; 
    }
 
    return '';
  }
 
}
Кон сильно привязан к верстке конкретной страницы, поэтому для каждого сайта эта часть кода должна быть своей. У меня реализовано нечто вроде стратегии.

5. из того,что в свойстве $this->data в п 4 формируем ваш новенький пост

Добавлено через 3 минуты
Если есть информация в структурированном виде, например погодные данные яндекса, то можно парсить так http://a-develop.ru/blog/301
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2014, 23:07
Помогаю со студенческими работами здесь

Защита сайта от парсинга
доброго времени суток! хочу пропарсить сайт кинопоиск, но он перенаправляет меня на отдельную страницу со следующим сообщением: Если...

Подскажите по методике парсинга сайта
Всем здравствуйте, вот осваиваю новую задачу, беру сайт и нужно спарсить информацию, использую для парсинга CsQuery, так как на...

Архитектура веб сайта и парсинга фотографий
Доброго времени суток! Помогите придумать архитектурное решение для веб сайта (ASP.NET MVC 4). В кратце, веб сайт отображает...

Регулярка для парсинга прокси с сайта
Учусь писать регулярки, первое знакомство, решил спарсить с сайта прокси. Удивился результату 151.200.170.146:80 01:11:14 16:00 ...

Исправить код для парсинга сайта
Здравствуйте! Извините, если я не в той ветке пишу. Не могу разобраться с библиотекой Beautiful Soup. Хочу спарсить сайт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru