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

    lastuniverse
    @lastuniverse
    felsme, в таком случае вам не поможет мой вариант. Только индивидуальный подход к каждому отдельно взятому сайту с реверсинженерингом протоколов передачи данных.
  • Как парсить сайты где всё построено на JavaScript?

    lastuniverse
    @lastuniverse
    Артём Петренков, сами по себе данные не имеют смысла, нужны данные, формализованные для применения на них имеющихся алгоритмов анализа и обработки. При этом, как я понял контекст вопроса, автору нужно распарсить не какойто конкретный сайт а некий, желательно универсальный способ сделать это с любым произвольным сайтом. Учитывая то, как безразмерно раздут зоопарк различных способов и технологий используемых для получения представления, ни о каком, по настоящему универсальном способе речи быть не может, Единтственное, относительно универсальное решение которое я вижу, это брать уже отрендереное представление и выковыривать данные уже из него. Соглашусь с вами, что в определенных ситуациях даный подход может потребовать даже больших трудозатрат чем индивидуальный, ручной подход к анализу отдельно взятого сайта. Но все это сильно зависит от того, что именно мы желаем получить на выходе, и пока автор не уточнит это, выбрать наиболее подходящий путь невозможно, и мы будем спорить до бесконечности.
  • Как парсить сайты где всё построено на 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: Постарался снабдить код исчерпывающими комментариями. В некоторых местах код избыточен, сделано это для простоты понимания.