Парсинг сайтов в сети TOR

Author Автор: Роман Чернышов    Опубликовано: 15 октября 2017

парсинг сайтов в tor сетиДоброго времени! Ранее я писал про услугу парсинга сайтов различной структуры, будь то каталоги, форумы, информационные сайты и т.д. Получение данных с сайта в удобном формате для последующей обработки (разумеется с соблюдением авторских прав), зачастую необходимая вещь. Сегодня я хочу рассказать про возможность парсинга сайтов в зоне .onion — расположенных в сети TOR (анонимная сеть с передачей данных в зашифрованном виде), а также поделиться технической стороной устройства моего парсера.

Чем интересны сайты в сети TOR

Как известно, сайты размещенные в луковой-сети не индексируются обычными поисковыми системами и доступны только через специальные поисковые сервисы, которые в свою очередь весьма не стабильны, медленно индексируют сайты, а то и вовсе прекращают свое существование. Таким образом большинство сайтов в сети TOR имеют уникальный контент с точки зрения обычных поисковых систем, их сложно найти и легко потерять.

Кроме того, так как доступ к ресурсам в сети TOR осуществляется по средствам цепочки прокси серверов, пропускная способность соединения очень низкая, как следствие сайты открываются очень медленно. Что делает работу с такими ресурсами достаточно не эффективной.

Также замечено, что некоторые сайты периодически меняют свой адрес или перестают существовать, в результате чего утрачивается доступ к уникальной, а порой и эксклюзивной информации.

В виду выше сказанного, задача по получению данных с сайта в удобном формате для последующей работы с ними на персональном компьютере, становиться очень актуальной.

Как устроен парсер данных с сайтов из сети TOR

Принцип работы парсера следующий — Задается целевая страница, точка входа, откуда парсер начинает свою работу, обычно это главная страница сайта. Парсер заходит на неё и собирает все ссылки на нужные ему разделы и страницы сайта, добавляет ссылки в базу данных, затем поочередно проходится по всем страницам, собирая по пути нужный контент и новые найденные ссылки на другие страницы сайта.

При этом отдельно обрабатываются ссылки на разделы, на страницы с контентом и ссылки постраничной навигации. Внешние ссылки игнорируются. Парсер обходит все страницы сайта и собирает нужную информацию, такую как: заголовки страниц, мета теги, текстовый контент, картинки, емеил адреса, даты, общедоступные данные пользователей и многое другое. Все данные сохраняются в БД после чего выгружаются в удобном формате для работы с ними, будь то таблица Excel (XLS, CSV), дамп БД MySQL, в виде HTML страниц или же данным могут импортироваться в БД действующего сайта.

Техническая сторона

Парсер написан на PHP 5.6, использует базу данных MySQL 4>. Для работы с удаленными ресурсами используется Curl, для разбора HTML страниц используется библиотека domDocument, для поиска нужных элементов на странице и получения информации используется библиотека DomXPath или RegExp там где необходимо. Для работы с TOR на сервер устанавливается Tor и Proxychains.

Установка TOR и Proxychains в Debian

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

$ gpg --keyserver keys.gnupg.net --recv 886DDD89
$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89|sudo apt-key add -

Обновите источники приложений:

$ sudo apt-get update

Установите следующий пакет, который будет обновлять ключ до последней версии:

$ sudo apt-get install deb.torproject.org-keyring

Установите Tor и ProxyChains:

$ sudo apt-get install tor proxychains

ProxyChains по умолчанию уже настроен на работу с Tor.

Пример получения главной страницы сайта в зоне .onion с помощью PHP

<?php $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://ссфлка_на_сайт.onion'); // ссылка на сайт в TOR
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Получение результата в переменную
curl_setopt($ch, CURLOPT_TIMEOUT, 0); // Задает максимальное время выполнения операции в <wbr />секундах
curl_setopt($ch, CURLOPT_HEADER,  false); // Выводить или нет заголовки ответы
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Следовать или нет по ссылки из заголовка Location
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); // передает User Agent
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:9050'); // Прокси сервер Tor
curl_setopt($ch, CURLOPT_PROXYTYPE, 7); // Тип прокси
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://реферер'); // Реферер
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // Файл для хранения данных Cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POST, 1); // Отправлять данные POST
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data1=value1');  // POST данные
$response= curl_exec($ch); // Ответ
curl_close($ch); ?>

Работа с XPath

Получить текст заголовка h1
//h1/text()

Получить текст заголовка с классом article
//h1[@class=»article»]/text()

Получить значение определенного span по классу
//span[@class=»date»]

Получить значение атрибута href у кнопки с классом page
//input[@class=»page»]/@href

Структура базы данных

В базе данных хранятся ссылки на страницы которые были пройдены и по котором еще предстоит пройти, каждая ссылка отмечается к какому типу она относится: Раздел, тема, страница, постраничная навигация и т.д.
Структура базы данных

CREATE TABLE `parse_url` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` int(11) NOT NULL,
  `count` int(11) NOT NULL,
  `url` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Какие проблемы могут возникать при парсинге?

  • Сложности настройки RegExp и XPath;
  • Не все HTML шаблоны страниц сайта могут быть идентичны, несмотря на идентичный тип страниц, что требует гибкой настройки XPath;
  • HTML шаблоны страниц могут меняться время от времени, что требует перенастройки RegExp и XPath;
  • HTML шаблоны страниц могут содержать критические ошибки из-за чего метод loadHTML() класса domDocument может выдавать ошибку;
  • Сайт донор может воспринимать парсер как попытку DDOS атаки, из-за большого кол-ва запросов;
  • Сайт донор может запрещать доступ к страницам парсеру, по IP;
  • Могут возникать проблемы доступа к закрытым разделам сайта, требующим авторизации;
  • Могут возникать проблемы с сайтами где контент генерируется с помощью JavaScript;
  • Сайт донор может блокировать аккаунт из под которого работает парсер;
  • В случае работы с TOR могут возникать длительные задержки при установлении связи;
  • При работе с SOCKS 4/5 также могут возникать задержки соединения или SOCKS могут умирать;
  • Парсер создает нагрузку на сервер на котором работает, из-за чего могут возникать проблемы с хост-провайдером (в случае использования шаред-хостинга или VDS с OpenVZ виртуализацией);
  • В случае загрузки картинок следует учитывать место под них на HDD;
  • Стоит помнить о законодательстве и авторских правах.

Оставить комментарий

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка