Задать вопрос
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    Артём Петренков, для начала обратимся к значению слова парсить. Как написано по ссылке, парсить - производить синтаксический анализ, анализировать, разбирать. Таким образом парсить сайт это разбирать и анализировать содержимое сайта, но не в коем случае не просто скачать сайт. Так же следует упомянуть, что у анализа должна быть определенная цель, и этой целью вряд ли являются непонятные куски непонятных данных. Наиболее вероятно, что автору необходимо либо готовое html представление сайта либо какие то осмысленные данные, отображаемые на сайте (например данные профилей пользователей и данные ими на тостере ответы, количество правильных, и т.д.). В своем вопросе автор упоминает сценарии действий и selenium, что так же наводит на мысль об автоматизации получения html представления возможно даже с последующей его обработкой (парсингом).

    А теперь покажите мне програмный код, который автоматически получит html представление конечного вида этой простой странички без использования браузеров и безголовых браузеров?

    PS: разметка интерфейса на этой страничке выглядит так:
    interface.js
    (function(exports) {
    
    "use strict";
    
    const calculatedata = {
    	staticsize: {
    		min: 150,
    		max: 200
    	},
    	staticmass: {
    		min: 9.0,
    		max: 10.0
    	},
    	dynamicsize: {
    		min: 50,
    		max: 100
    	},
    	dynamicmass: {
    		min: 0.1,
    		max: 0.5
    	},
    	step: 0.0001,
    	distancemultipler: 1,
    	showemitters: true,
    	showtailes: true,
    	showgrid: true,
    	emmitspeed: 66,
    	speedcount:0,
    	gravityconstant: 0.6674484 //0.00000000006674484
    };
    exports.data = calculatedata;
    
    exports.init = init;
    function init(data){
    	const sheet_settings = {
    		header: "Настройки листа",
    		body: {
    			rows: [
    				{ 
    					id: "sheetclick",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					label:"клик на листе ставит объекты"
    				},				
    				{ type: "section", template: "тип объектов выставляемых по клику"},
    				{ 
    					view:"segmented",
    					value:"dynamic",
    					id: "itemtype",
    					options:[
    						{ id:"static", value:"статические"},
    						{ id:"dynamic", value:"динамические"},
    						{ id:"emitter", value:"источники"}
    					], 
    					align:"center"
    				}
    			]
    		}
    	};
    	const show_settings = {
    		header: "Параметры отображения",
    		body: {
    			rows: [
    				{ 
    					id: "gridshow",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					label:"отображать сетку",
    					on:{
    						onChange: function(newv, oldv){
    							calculatedata.showgrid = newv;
    						}
    					}					
    				},			
    				{ 
    					id: "emittershow",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					//labelRight:"клик ставит объекты"
    					label:"отображать источники",
    					on:{
    						onChange: function(newv, oldv){
    							calculatedata.showemitters = newv;
    						}
    					}					
    				},
    				{ 
    					id: "tailshow",
    					view: "switch", 
    					value: 1,
    					labelWidth: 200,
    					label:"отображать шлейф",
    					on:{
    						onChange: function(newv, oldv){
    							calculatedata.showtailes = newv;
    						}
    					}					
    				}
    			]
    		}
    	};
    
    	const phisical_settings = {
    		header: "Настройки физических величин",
    		body: {
    			rows: [
    				{ 
    					view:"rangeslider",	id: "staticsize", label:"размер статичных", labelWidth: 130,
    					value:"150,200",	title: webix.template("#value#"),
    	 				min: 1, max: 500,
    					on:{
    						onChange: function(value){
    							calculatedata.staticsize.min = parseInt(value[0]);
    							calculatedata.staticsize.max = parseInt(value[1]);
    						}
    					}
    				},
    				{ 
    					view:"rangeslider", id: "dynamicsize", label:"размер динамических", labelWidth: 130,
    					value:"50,100",	title: webix.template("#value#"),
    					min: 1, max: 500,
    					on:{
    						onChange: function(value){
    							calculatedata.dynamicsize.min = parseInt(value[0]);
    							calculatedata.dynamicsize.max = parseInt(value[1]);
    						}
    					}
    				},			
    				{ 
    					view:"rangeslider",	id: "staticmass", label:"плотность статичных", labelWidth: 130,
    					value:"8.0,10.0", title: v=>{ 
    						return parseFloat(v.value).toFixed(1); 
    					},
    	 				min: 0.1, max: 10.0,  step:0.1,
    					on:{
    						onChange: function(value){
    							calculatedata.staticmass.min = parseFloat(value[0]).toFixed(1);
    							calculatedata.staticmass.max = parseFloat(value[1]).toFixed(1);
    						}
    					}
    				},
    				{ 
    					view:"rangeslider", id: "dynamicmass", label:"плотность динамических", labelWidth: 130,
    					value:"0.5,1.5", title: v=>{ 
    						return parseFloat(v.value).toFixed(1); 
    					},
    					min: 0.1, max: 10.0,  step:0.1,
    					on:{
    						onChange: function(value){
    							calculatedata.dynamicmass.min = parseFloat(value[0]).toFixed(1);
    							calculatedata.dynamicmass.max = parseFloat(value[1]).toFixed(1);
    						}
    					}
    				}
    			]
    		}
    	};
    	const preset_settings = {
    		header: "Предустановленные варианты",
    		body: {
    			rows: [
    			]
    		}
    	};
    
    	const simulate_settings = {
    		header: "Управление симуляцией",
    		body: {
    			rows: [
    				{ 
    					view:"slider", id: "step", label:"шаг симуляции", labelWidth: 130,
    					value: 10,	title: webix.template("#value#"),
    					min: 0, max: 100,
    					on:{
    						onChange: function(value){
    							calculatedata.step = 0.00001*(1+parseInt(value));
    						}
    					}
    				},			
    				{ 
    					view:"slider", id: "emitterspeed", label:"скорость источников", labelWidth: 130,
    					value: 66,	title: webix.template("#value#"),
    					min: 0, max: 100,
    					on:{
    						onChange: function(value){
    							const q = (100-parseInt(value))/100;
    							calculatedata.emmitspeed =	25+q*75;
    						}
    					}
    				},	
    				{ 
    					id: "itememitter",
    					view: "switch", 
    					value: 0,
    					labelWidth: 200,
    					label:"включить источники",
    					on:{
    						onChange: function(newv, oldv){
    							if(newv) calculatedata.isEmitt = true;
    							else calculatedata.isEmitt = false;
    						}
    					}					
    
    				},
    				{ 
    					id: "simulate",
    					view: "switch", 
    					value: 0,
    					labelWidth: 200,
    					label:"включить симуляцию",
    					on:{
    						onChange: function(newv, oldv){
    							if(!newv ){
    								calculatedata.isSimulate = false;
    								return;
    							}
    							if( calculatedata.isSimulate ) return;
    							calculatedata.isSimulate = true;
    							play();
    
    						}
    					}					
    
    				}
    
    			]
    		}		
    	};
    
    	/* панель инструментов */
    	const view_tools = {
    		id: "view_tools",
    		multi:true,
    		view:"accordion",
    		height: "100%",
    		width: 300,
    		rows:[
    			sheet_settings,
    			show_settings,
    			phisical_settings,
    			preset_settings,
    			simulate_settings,
    			{}
    		]
    	};
    
    	const header_view = {
    		id:"header_view",
    		height: 32,
    		css: "tool_bar"
    	};
    
    	const main_view = {
    		rows:[
    			header_view,
    			{ 
    				type: "space",
    				cols:[
    					{
    						view: "flow",
    						adjust:true,
    						fillspace: true,
    						drag: "target",
    						id: "view_sheet",
    						type: "line",
    						sheet: {
    							_offsetx:  -3000,
    							_offsety: -2000,
    							scale: 0.2
    						},
    						on: {
    							click: mouseclick
    						}
    					},
    					{ view: "resizer"},
    					view_tools
    				]
    			},
    			{
    				template:"footer",
    				height: 22
    			}
    		]
    	};
    
    	webix.ui(main_view);
    
    	function play(){
    		if( !calculatedata.isSimulate ) return;
    		if( calculatedata.isEmitt ) emmitItems();
    
    		calcItemStep();
    		flow.planedReDraw();
    		flow.reDraw();
    		setTimeout(play,20);
    	}
    
    
    	const flow = $$("view_sheet");
    	const tools = flow.flow.t;
     	createItem( {x: 0, y: 0}, "static");
    	flow.reDraw();
    
    ....
    
    })(this.Interface = {});
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    AWEme, DanKud, а вы не сталкивались с сайтами где по запросу приходят только данные (включая данные об интерфейсе, как например при использовании webix). Распарсить такой сайт весьма проблематично.
  • Как сделать чтоб правильно отправлялась форма?

    lastuniverse
    @lastuniverse
    almenovr, к сожаленнию в PHP не силен. Удалил ответ
  • Как сократить до десяток в JS?

    lastuniverse
    @lastuniverse
    Stalker_RED, не будь букой, лайкни мой ответ :)))
  • Как сократить до десяток в JS?

    lastuniverse
    @lastuniverse
    kiril9011, Кирилл, ваше поведение вызывает сильное желание послать вас подальше несмотря на то что по всей видимости вы еще ребенок/подросток. Подумайте над этим.

    еще раз повторюсь, не поленитесь и прочтите по ссылке:

    Метод объекта Number .toFixed() округляет до заданного числа знаков после десятичной точки.
  • Как сократить до десяток в JS?

    lastuniverse
    @lastuniverse
    kiril9011, хамить не надо, откройте ссылку и прочтите, там русским языком подробно разжевано. А то что просите вы называется не "помочь" а "сделайте за меня"
  • Как сделать смену изображений из array на js?

    lastuniverse
    @lastuniverse
    в вашем примере при каждом наведении будет запускаться новый сет интервал, но удаляете ли вы уже запущенный при уходе курсора с карточки товара? Если нет, ждите проблем в дальнейшем)
  • Почему рекапча выдает ошибку - неверный ключ?

    lastuniverse
    @lastuniverse
    Sam67, Извините за офтоп, прочел ваш вопрос:

    Как использовать R скрипт на сайте?
    Здравствуйте! Собственно, у меня есть скрипт написанный в R для обработки некоторых данных. Как можно(и можно ли) использовать его для обработки некоторых данных получаемых моим сайтом?
    Или же искать хостинг с поддержкой R или покупать VPS?
    P.S. Скрипт нужен именно R(питон или пыха не подходят)
    Заранее всем спасибо))


    Но пока писал ответ, вы его удалили, поэтому пишу ответ сюда:

    Вы можете это сделать благодаря таким сервисам как rextester.com. Для этого вам придется разобраться как подавать запрос и получать результат.
    на хостинге (node.js)
    const request = require('request');
    
    const url = "https://rextester.com/rundotnet/Run";
    const code = "print(\"Hello, world 1234!\")\n";
    
    const sendData = {
      "LanguageChoiceWrapper": 31,
      "EditorChoiceWrapper": 1,
      "LayoutChoiceWrapper": 1,
      "Program": code,
      "IsInEditMode": "False",
      "IsLive": "False"
    };
    
    request.post({
      url: url,
      headers: {
        "X-Auth-Token":'123',
        "Accept":" text/plain",
        "Referer": "https://rextester.com/l/r_online_compiler",
        "Access-Control-Allow-Origin": "https://rextester.com"
      },
      form: sendData
    },
    function (err, httpResponse, body) {
      if (err) {
        return console.error('upload failed:', err);
      }
      console.log('Upload successful!  Server responded with:', body);
    });


    ну и соответственно результат:
    Upload successful!  Server responded with: {"Warnings":null,"Errors":null,"Result":"[1] \"Hello, world 1234!\"\n","Stats":"Absolute running time: 0.27 sec, cpu time: 0.44 sec, memory peak: 30 Mb, absolute service time: 0,28 sec","Files":null}


    "Result":"[1] \"Hello, world 1234!\"\n"
  • Как сделать динамически массив объектов?

    lastuniverse
    @lastuniverse
    Sport-code, да не за что. Всегда рад помочь, обращайтесь. И не забудьте сказать спасибо тем кто отметился в комментариях, без их вопросов я бы тоже гадал что именно вы хотите получить)
  • Как реализовать формулу кодом?

    lastuniverse
    @lastuniverse
    Vitalii Bryl, а собственно в чем ошибка то? Вам не нравится то что дробная часть на несколько миллиардных долей отличается от ожидаемого результата? Если да, то читайте про Неточные вычисления
  • Как посчитать среднее взвешенное значение для циклического ряда?

    lastuniverse
    @lastuniverse
    polikarpovst, вот обещанный вариант со сложением векторов.


    PS: Постарался снабдить код исчерпывающими комментариями. В некоторых местах код избыточен, сделано это для простоты понимания.
  • Как найти json обьект среди других данных?

    lastuniverse
    @lastuniverse
    flashdix, при такой постановке вопроса могу дать только общий ответ. Валидируете HTML и все места в которых выдает ошибку обрабатываете через JSON.parse, увеличивая вырезаемый кусок до тех пор пока не достигнете конца файла или пока JSON.parse не сработает успешно

    вот пример, но без валидации:



    PS: о минусах такого подхода я тут рассказывать не буду)

    PPS: python-а не знаю, потому демонстрация на js. На python-е подход тот же, но вместо JSON.parse используйте питонячий аналог)
  • Как сделать что бы по клику кнопки в поле для ввода добавлялся текст?

    lastuniverse
    @lastuniverse
    Вариант без использования сторонних библиотек (нативный js)
  • Как разбить массив на части?

    lastuniverse
    @lastuniverse
    вариант с использованием метода .reduce


    вариант без метода .reduce но с разрушением исходного массива и циклом while:


    PS: на мой взгляд spread для решения данной задачи совсем не нужен.