Парсинг сайтов
Для парсинга сайтов используем следующую связку (работает довольно быстро, в управлении и доработках всё просто):
- Функция curl_get_contents (учитывает cookie и минимально обходит блокировки). Её можно дополнить работой через прокси и авторизацией в особо сложных случаях.
function curl_get_contents($page_url, $base_url, $pause_time, $retry) { /* $page_url - адрес страницы-источника $base_url - адрес страницы для поля REFERER $pause_time - пауза между попытками парсинга $retry - 0 - не повторять запрос, 1 - повторить запрос при неудаче */ $error_page = array(); $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"); curl_setopt($ch, CURLOPT_COOKIEJAR, str_replace("\\", "/", getcwd()).'/gearbest.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, str_replace("\\", "/", getcwd()).'/gearbest.txt'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Автоматом идём по редиректам curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // Не проверять SSL сертификат curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); // Не проверять Host SSL сертификата curl_setopt($ch, CURLOPT_URL, $page_url); // Куда отправляем curl_setopt($ch, CURLOPT_REFERER, $base_url); // Откуда пришли curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Возвращаем, но не выводим на экран результат $response['html'] = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200 && $info['http_code'] != 404) { $error_page[] = array(1, $page_url, $info['http_code']); if($retry) { sleep($pause_time); $response['html'] = curl_exec($ch); $info = curl_getinfo($ch); if($info['http_code'] != 200 && $info['http_code'] != 404) $error_page[] = array(2, $page_url, $info['http_code']); } } $response['code'] = $info['http_code']; $response['errors'] = $error_page; curl_close($ch); return $response; }
Результат будет лежать в поле html массива $response (получаем так: $response['html'])
-
Библиотека DiDom (документация). Позволяет легко и просто парсить HTML, полученный на предыдущем шаге. Устанавливается через composer на сервер и позволяет легко получать содержимое HTML страницы, проводя поиск по DOM документа.
Базовый пример использования:use DiDom\Document; $document = new Document('http://www.news.com/', true); $posts = $document->find('.post'); foreach($posts as $post) { echo $post->text(), "\n"; }
Вот на всякий случай папка с библиотекой.
Парсинг CSV
Для парсинга данных из CSV используем штатную функцию PHP str_getcsv (документация). Она работает быстро и обычно без особых проблем. Могут возникать нюансы нехватки оперативной памяти на сервере при больших CSV (более 100 Мб), в этом случае нужно выделить скрипту до 1Гб оперативной памяти используя memory_limit:
php_admin_value memory_limit 1G
Парсинг XLSX
Для XLSX используем библиотеку PhpSpreadsheet. Офиициальная документация доступна здесь.
Устанавливается стандартно через Composer
composer require phpoffice/phpspreadsheet
Простой пример записи данных в XLSX файл. Здесь подробно про чтение и запись в XLSX.
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');
$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');
Парсинг Google таблиц
Самый простой способ парсинга гугл таблиц на PHP - получить ее в формате CSV с помощью специальной ссылки. И далее уже работать через str_getcsv как со стандартной CSV таблицей.
Алгоритм работы с Гугл таблицами на PHP
- Ссылка для формирования CSV
https://docs.google.com/spreadsheets/d/id_документа/export?format=csv&gid=id_листа
id_документа есть у каждого документа (длинный набор символов), id_листа начинается с нуля. - Мы его получаем через file_get_contents либо через curl_get_contents
- Далее читаем полученный CSV файл через str_getcsv.
Больше полезных материалов в нашем Telegram канале. Вступайте и будем на связи! https://t.me/bf_conversion