Одной из актуальных задач на сегодняшний день является парсинг товаров с Яндекс Маркета. Мы решили не обходить эту задачу стороной и написать скрипт, который собирает заданные товары и всю информацию по ним и сохраняет её в базу данных MySQL.
Перед тем как написать скрипт мы с официального сайта скачали и установили последнюю сборку Mysql со всеми причиндалами и раскоментировали библиотеку mysql в php.ini, для того что бы можно было использовать функции работы с базами данных mysql в php.
Так как данные на сайте хранятся в utf-8 формате мы использовали для разработки скрипта Unicode версию программы Human Emulаtor. Эта версия лежит рядом с exe-шником обычной версии и называется XWeb Human Emulator MT UE.exe. Входные данные для скрипта тоже используются в unicode формате. На входе скрипт принимает файл с ключевыми словами, по которым он ищет нужные вам товары в следующем формате:
ноутбук
монитор
клавиатура
мышь
В результате работы скрипта создаётся база данных с таблицей товаров markets с
колонками Ключевое слово, Наименование товара, Средняя цена, Диапазон цен, Html код картинки, Html код кратких характеристик, Html код всех характеристик.
Можно все html результаты получать в виде текста. Для этого при разборе страниц товара вместо inner html надо использовать функции которые получают inner text.
В функции get_market_info($market_key) заменить $element->get_inner_html_by_attribute на $element->get_inner_text_by_attribute.
Результат работы скрипта в MySQL Workbench :
Настройки скрипта:
1 2 3 4 5 6 7 8 |
// файл с товарами для разбора - тут указывается файл с ключевыми словами для поиска товаров // данные должны быть в unicode $a_markets = file("data/markets.txt"); // глубина прохода в поисковые результаты // со скольких страниц собирать товары прежде чем перейти к следующему // если нужно собирать все товары надо просто задать этот параметр = -1 $cnt_pages = 15; |
Сам скрипт выглядит следующим образом:
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 92 93 |
<?php $xhe_host ="127.0.0.1:7011"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // ////////// настройки скрипта////////////////// // файл с товарами для разбора $a_markets = file("data/markets.txt"); // глубина прохода в поисковые результаты $cnt_pages = 15; // текущая страница $crnt_page =1; // режим отладки $dbg=true; // /////////////////// дополнительные модули ///////////////////// // функции require_once("functions.php"); // ///////////////////// script ///////////////////////////////////////////////////////// debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт запустили"); // соединяемся с базой $mysql_bd = @mysql_connect('localhost:3306', 'root', 'password'); // если не подключились выдать сообщение об ошибке if (!$mysql_bd) { die('ошибка соединения: ' . mysql_error()); // закончить скрипт $app->quit(); } // создадим базу данных для товаров $sql = 'CREATE DATABASE IF NOT EXISTS yandex_markets'; if (!mysql_query($sql, $mysql_bd)) debug_mess("не удалось создать базу yandex_markets: " . mysql_error()); // ждём пока обработается sleep(1); // если уже была создана выберем базу mysql_select_db("yandex_markets", $mysql_bd); // ждём пока обработается sleep(1); // создадим таблицу если ещё нету её $sql = 'CREATE TABLE IF NOT EXISTS markets (Market TEXT, Market_Name TEXT, Avg_Price TEXT, Range_Price TEXT, Image TEXT, Properties MEDIUMTEXT, All_Properties MEDIUMTEXT) ENGINE=MyISAM DEFAULT CHARSET=utf8'; // выполнить запрос //mysql_query($sql,$mysql_bd); if(!mysql_query($sql,$mysql_bd)) debug_mess("ошибка запроса : " . mysql_error()); // пройтись по всем товарам for($j=0;$j<count($a_markets);$j++) { // обнулим страницы перед поиском $crnt_page =1; // перейти в yndex market $browser->navigate("http://market.yandex.ru"); $input->set_value_by_name("text",$a_markets[$j]); $button->click_by_number(0); $button->click_by_inner_text("Подобрать",true); // ходим до тех пор пока не кончатся ссылки по цифрам while(true) { $models= $webpage->get_body_inter_prefix_all("class=b-offers__name","\">"); $a_models=explode("<br>",$models); // пройдёмся по всем ссылкам for($k=0;$k<count($a_models);$k++) { // перейти на страницу товара $str_href=get_string($a_models[$k], "modelid","&"); $anchor->click_by_href("modelid".$str_href,false); // получить информацию по товару get_market_info(trim($a_markets[$j])); // вернуться назад $browser->go_back(); } // не перешли на следующую страницу if(!next_page($crnt_page)) break; } } // закрыть базу mysql_close($mysql_bd); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу<br>"); // Quit $app->quit(); ?> |
Скрипт написан 11.09.2012 в Human Emulator 4.4.19 Advanced.
На момент публикации статьи 11.09.2012 скрипт был рабочий.