Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.09.2015, 22:14
Новичок на форуме
Отправить личное сообщение для HunterNomnad Посмотреть профиль Найти все сообщения от HunterNomnad
 
Регистрация: 01.09.2015
Сообщений: 9

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>


За ранее спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 01.09.2015, 22:24
Аспирант
Посмотреть профиль Найти все сообщения от forwardonly2015
 
Регистрация: 31.08.2015
Сообщений: 90

Сообщение от HunterNomnad
С первого заход стало ясно, что непонятно почему сцепка клиент-сервер делает по два запроса к url прежде чем вернуть данные на страницу.
Скорей всего, потому что запрашивается фавикон. Это скорей всего только из хрома, файерфокс запрашивает его лишь единожды, далее кэширует. кроме того, хром может еще бросить пустой запрос, обработай хотя бы случай с фавиконом, как то

...
if(request.url==="/favicon.ico") return
...
Ответить с цитированием
  #3 (permalink)  
Старый 01.09.2015, 22:36
Новичок на форуме
Отправить личное сообщение для HunterNomnad Посмотреть профиль Найти все сообщения от HunterNomnad
 
Регистрация: 01.09.2015
Сообщений: 9

Работаю под Лисой))) Столкнулся только что с непонятным траблом.
В строку 36 вставил вывод на консоль
console.log(titlejson+" ||| "+h1json);
и сравнил с выводом в строках 32 и 33.
Так вот, в стоках 32 и 33 переменные "titlejson" и "h1json" есть, а в 36 их уже нет. Собственно наверно по этой причине нужно дважды отправлять запрос что бы получить результат.
Ответить с цитированием
  #4 (permalink)  
Старый 01.09.2015, 22:43
Аспирант
Посмотреть профиль Найти все сообщения от forwardonly2015
 
Регистрация: 31.08.2015
Сообщений: 90

HunterNomnad,
Хрен знает, что там в недрах твоих либ происходит. Отправь обычный XHR и проверь.
Ответить с цитированием
  #5 (permalink)  
Старый 01.09.2015, 22:47
Новичок на форуме
Отправить личное сообщение для HunterNomnad Посмотреть профиль Найти все сообщения от HunterNomnad
 
Регистрация: 01.09.2015
Сообщений: 9

Сообщение от forwardonly2015 Посмотреть сообщение
HunterNomnad,
Хрен знает, что там в недрах твоих либ происходит. Отправь обычный XHR и проверь.
Попробую. Спасибо
Ответить с цитированием
  #6 (permalink)  
Старый 01.09.2015, 22:53
Аспирант
Посмотреть профиль Найти все сообщения от forwardonly2015
 
Регистрация: 31.08.2015
Сообщений: 90

HunterNomnad,
И смотри в отладчике, на вкладке сеть, там должно фиксироваться кол-во запросов
Ответить с цитированием
  #7 (permalink)  
Старый 07.09.2015, 11:40
Новичок на форуме
Отправить личное сообщение для HunterNomnad Посмотреть профиль Найти все сообщения от HunterNomnad
 
Регистрация: 01.09.2015
Сообщений: 9

Привет всем))
За время, с момента моего последнего поста, провел несколько исследований. Менял способы организации сервера, менял парсеры.
В качестве парсера остановился на x-ray, может и не самый лучший вариант, не удалось обрабатывать meta теги (если у кого есть более эффективный вариант, поделитесь), но довольно быстрый.
Так вот, столкнулся с непонятной проблемой.
Если запускать пример как консольное приложение, то все работает на ура. НО если все портировать в сервер, "все пропало шеф, все пропало!!!". В серверном варианте парсер не находит и половины картинок на станице.
Стал задумываться над стратегией работы с websocket-ом. Т.е. поднимать приложение и со страницы обращаться к нему за парсингом и получать обратно итог. Первый опыты показали положительный результат. Но хочется услышать мнение специалистов:
1) не слишком ли будет нагруженная система
2) насколько оправдан такой подход
3) альтернативные варианты
Ответить с цитированием
  #8 (permalink)  
Старый 07.09.2015, 13:03
Новичок на форуме
Отправить личное сообщение для HunterNomnad Посмотреть профиль Найти все сообщения от HunterNomnad
 
Регистрация: 01.09.2015
Сообщений: 9

Прошу прощения. Ввел народ в заблуждение, websocket не работает как бы хотелось. Мне не удалось отправлять сообщения одному пользователю. ))) При при подключении новых пользователей рассылка идет всем. Да и инициировать разрыв соединения с клиентам после отправки сообщения, а затем ожидание нового подключения клиента мне не удалось.
Ответить с цитированием
  #9 (permalink)  
Старый 29.03.2016, 14:51
Новичок на форуме
Отправить личное сообщение для Андрей99952 Посмотреть профиль Найти все сообщения от Андрей99952
 
Регистрация: 29.03.2016
Сообщений: 1

Здравствуйте! Так и не удалось добиться результата?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вы пишете на сервере (node.js) dmitry111 Оффтопик 31 17.05.2014 03:47
Недопонимание философии Node.js Voronar AJAX и COMET 10 25.02.2013 13:00
Востребованность разработчиков на Node.js danik.js AJAX и COMET 7 08.12.2012 21:49
Разработчик Node.js в США (Сиэтл) Akvelon Работа 0 29.08.2012 10:47
Node.js Kolyaj Серверные языки и технологии 49 24.05.2010 22:29