Parser на Node.js
Доброго времени суток.
Решил попробовать Node.js в качестве сервера для парсинга страниц. В Node я полный ламер. Все делал из кусков свободно выложенных примеров. Пробовал написать на php станичку и с нее делать ajax запросы на "сервер-парсер". С точки зрения программирования )) тут все просто - есть поле ввода, есть кнопка. В поле ввели url, нажали кнопку по ajax отправили на сервер этот url и в ответ получили распарсеренные как json. Функция на станице должна данные добавить в div. Но особо похвастаться ничем. С первого заход стало ясно, что непонятно почему сцепка клиент-сервер делает по два запроса к url прежде чем вернуть данные на страницу. При смене url-а для запроса старый запрос еще раз выводится на страницу. Помогите разобраться что не так. Или подскажите где можно посмотреть)) Собственно это сервер )))) var express = require('express'); var http = require("http"); var url = require("url"); var request = require('request'); var cheerio = require('cheerio'); var cors = require('cors'); var app = express(); var titlejson, h1json; app.use(cors()); app.get('/', function (req, res) { var url_parts = url.parse(req.url, true); var urlpars = url_parts.query.url; console.log(urlpars); var headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36' }; var options = { url: urlpars, headers: headers }; request(options, function (err, res, body) { if (err) { console.log(err); } else { $ = cheerio.load(body); titlejson = $('title').text(); h1json = $('h1').text(); console.log('title:: ' + titlejson); console.log('h1:: ' + h1json); } }); res.json({title: titlejson, h1: h1json}); }); app.listen(8008); console.log("Server is listening") А это страница с которой отправляется по ajax-су запрос и ждется ответ. <!DOCTYPE html> <html lang="en"> <head> <title>parser</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="//fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css"> <link href="css/bootstrap.css" media="screen" rel="stylesheet" type="text/css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-3"></div> <div class="col-lg-6"> <h2>Hello, Parser!</h2> <div class="col-md-12"> <div class="well-lg" style="border: 1px #31708f solid; border-radius: 5px; height: 200px;"> <div id="pars" class="col-md-12"></div> </div> <input id="parsurl" type="text" placeholder="http://example.com" class="col-md-9" style="margin-top: 10px;"> <button id="add" class="btn btn-default btn-sm col-md-3" style="margin-top: 10px;">add</button> </div> </div> <div class="col-md-3"></div> </div> </div> <script src="js/jquery-2.1.4.min.js"></script> <script src="js/bootstrap.js"></script> <script> $(document).ready(function () { $('#add').click(function () { $.get("http://XXX.XXX.XXX.XXX:8008/?url=" + $('#parsurl').val(), function (data) { $("#pars").empty(); $("#pars").append("<h2 style='margin: -7px;'>" + data.title + "<h2/>"); if(data.h1 != 'noneh1none'){ $("#pars").append("<h4>" + data.h1 + "<h4/>"); } }); }); }); </script> </body> </html> За ранее спасибо. |
Цитата:
... if(request.url==="/favicon.ico") return ... |
Работаю под Лисой))) Столкнулся только что с непонятным траблом.
В строку 36 вставил вывод на консоль console.log(titlejson+" ||| "+h1json);и сравнил с выводом в строках 32 и 33. Так вот, в стоках 32 и 33 переменные "titlejson" и "h1json" есть, а в 36 их уже нет. Собственно наверно по этой причине нужно дважды отправлять запрос что бы получить результат. |
HunterNomnad,
Хрен знает, что там в недрах твоих либ происходит. Отправь обычный XHR и проверь. |
Цитата:
|
HunterNomnad,
И смотри в отладчике, на вкладке сеть, там должно фиксироваться кол-во запросов |
Привет всем))
За время, с момента моего последнего поста, провел несколько исследований. Менял способы организации сервера, менял парсеры. В качестве парсера остановился на x-ray, может и не самый лучший вариант, не удалось обрабатывать meta теги (если у кого есть более эффективный вариант, поделитесь), но довольно быстрый. Так вот, столкнулся с непонятной проблемой. Если запускать пример как консольное приложение, то все работает на ура. НО если все портировать в сервер, "все пропало шеф, все пропало!!!". В серверном варианте парсер не находит и половины картинок на станице. Стал задумываться над стратегией работы с websocket-ом. Т.е. поднимать приложение и со страницы обращаться к нему за парсингом и получать обратно итог. Первый опыты показали положительный результат. Но хочется услышать мнение специалистов: 1) не слишком ли будет нагруженная система 2) насколько оправдан такой подход 3) альтернативные варианты |
Прошу прощения. Ввел народ в заблуждение, websocket не работает как бы хотелось. Мне не удалось отправлять сообщения одному пользователю. ))) При при подключении новых пользователей рассылка идет всем. Да и инициировать разрыв соединения с клиентам после отправки сообщения, а затем ожидание нового подключения клиента мне не удалось.
|
Здравствуйте! Так и не удалось добиться результата?
|
Часовой пояс GMT +3, время: 05:51. |