Доброго время суток, уважаемые читатели!
Продолжим написание парсера работающего с OpenCart, которое мы начали здесь.
В прошлой статье мы рассмотрели как добавить один товар в базу интернет-магазина, созданного на движке OpenCart, что в реальных условиях мало применимо. Теперь давайте рассмотрим пример массового добавления.
Наш парсер будет принимать в качестве запроса ссылку на категорию сайта moyo.ua и парсить товары с первой страницы выдачи, затем добавлять их в OpenCart.
Пример ссылки:
Реализация метода который парсит moyo.ua и возращает массив продуктов.
С наименованием продукта, ценой и т.д. все понятно. Но что делать с картинками? Было решено применить следующий алгоритм действий.
Картинки скачиваются в папку results/image/ (папку image нужно создать), им будет присваиваться новое имя, с помощью метода getRandomImageName.
И затем скачанные картинки будут переноситься на сервер где установлен A-Parser в папку image/catalog/.
Вынос авторизации в отдельный метод
Теперь, чтобы не превращать метод parse в большую, плохо читабельную кучу кода, вынесем авторизацию с получением куки и токена в отдельный метод authorization, который возвращает токен или false, если запрос был неудачный. Для указания ссылки на наш интернет-магазин, чтобы парсер знал, где авторизироваться и куда добавлять товар, было создано поле Site:
Итоговый вид метода parse
Запускаем и проверяем результат:
Как видим, все, кроме картинок, добавилось без проблем. Что же не так с картинками?
Дело в том, что OpenCart при добавлении или редактировании продукта проверяет есть ли такая картинка в папке и если нет подставляет свою.
Как решить эту проблему:
Способ 1
Разбить эту задачу на 2 парсера. 1-й парсит информацию и скачивает картинки. Затем заливаем картинки на сервер и запускаем второй парсер, который уже добавит наши товары в интернет магазин.
Способ 2
Разработать парсер, который будет изменять данные продуктов о картинках. Запускать его будем после того, как отработал наш парсер, который описан в этой статье.
Более подробно оба метода будут расписаны в следующей статье.
Скачать готовый парсер вы можете по этой ссылке.
Продолжим написание парсера работающего с OpenCart, которое мы начали здесь.
В прошлой статье мы рассмотрели как добавить один товар в базу интернет-магазина, созданного на движке OpenCart, что в реальных условиях мало применимо. Теперь давайте рассмотрим пример массового добавления.
Наш парсер будет принимать в качестве запроса ссылку на категорию сайта moyo.ua и парсить товары с первой страницы выдачи, затем добавлять их в OpenCart.
Пример ссылки:
Код:
https://www.moyo.ua/telecommunication/cell_phones/
Реализация метода который парсит moyo.ua и возращает массив продуктов.
Код:
* getMoyoProduct(link) {
let moyouResponse = yield this.request('GET', link, {}, {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36',
decode: 'utf8'
});
if (moyouResponse.success) {
let rgx = /<a.+?class="goods_image" data-imageSrc="(.+?)".+?data-alt="(.+?)"[\s\S]+?<div class="goodsprice-amount">.+?>([\d\s]+)<\/span/g;
let tmp;
let products = [];
while (tmp = rgx.exec(moyouResponse.data)) {
let imageName = yield *this.downloadImage(tmp[1]);
let product = {
nameProd: tmp[2],
image: imageName,
price: tmp[3]
};
products.push(product);
}
return products;
}
}
С наименованием продукта, ценой и т.д. все понятно. Но что делать с картинками? Было решено применить следующий алгоритм действий.
Картинки скачиваются в папку results/image/ (папку image нужно создать), им будет присваиваться новое имя, с помощью метода getRandomImageName.
Код:
getRandomImageName(url) {
let name = "";
let strong = 10;
let dic = "abcdefghijklmnopqrstuvwxyz1234567890";
for (var i = 0; i < strong; i++) {
name += dic.charAt(Math.floor(Math.random() * dic.length));
}
let date = new Date();
return name + '-' + date.getFullYear() + '-' + date.getMonth() + '-' + date.getDay() + '-' + date.getTime() + '.' + this.getExtension(url);
}
И затем скачанные картинки будут переноситься на сервер где установлен A-Parser в папку image/catalog/.
Вынос авторизации в отдельный метод
Теперь, чтобы не превращать метод parse в большую, плохо читабельную кучу кода, вынесем авторизацию с получением куки и токена в отдельный метод authorization, который возвращает токен или false, если запрос был неудачный. Для указания ссылки на наш интернет-магазин, чтобы парсер знал, где авторизироваться и куда добавлять товар, было создано поле Site:
Код:
*authorization(){
let response = yield this.request('POST',this.conf.siteurl + '/admin/index.php?route=common/login', {
username: this.conf.login,
password: this.conf.pass,
route: 'common/login',
redirect: this.conf.siteurl + '/admin/index.php?route=common/login',
}, );
if(response.success){
this.cookies.setAll({});
let token = response.headers.URI.match(/.+?\&user_token=(.+)/);
let cookie_sessid = response.headers['Request-Raw'].match(/OCSESSID=([\w\d]+)/);
token = token ? token[1] : 'No token';
cookie_sessid = cookie_sessid ? cookie_sessid[1] : false;
if (token && cookie_sessid) {
this.cookies.set(this.utils.url.extractTopDomain(this.conf.siteurl), '/', 'OCSESSID', cookie_sessid);
}
return token;
}
return false;
}
Итоговый вид метода parse
Код:
*parse(set, results) {
/*Получаем список продуктов*/
let moyouResponse = yield* this.getMoyoProduct(set.query);
if(this.conf.siteurl != ''){
/*Авторизируемся*/
let token = yield* this.authorization();
if(token){
for(let i = 0; i < moyouResponse.length; i++){
let addProd = yield * this.add_product(this.getSingleProduct(moyouResponse[i]),token,this.conf.siteurl);
}
results.success = 1;
}
}
return results;
}
Запускаем и проверяем результат:
Как видим, все, кроме картинок, добавилось без проблем. Что же не так с картинками?
Дело в том, что OpenCart при добавлении или редактировании продукта проверяет есть ли такая картинка в папке и если нет подставляет свою.
Как решить эту проблему:
Способ 1
Разбить эту задачу на 2 парсера. 1-й парсит информацию и скачивает картинки. Затем заливаем картинки на сервер и запускаем второй парсер, который уже добавит наши товары в интернет магазин.
Способ 2
Разработать парсер, который будет изменять данные продуктов о картинках. Запускать его будем после того, как отработал наш парсер, который описан в этой статье.
Более подробно оба метода будут расписаны в следующей статье.
Скачать готовый парсер вы можете по этой ссылке.