Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Помогите вывести data-url ! ОЧЕНЬ НУЖНО !!!! (https://javascript.ru/forum/node-js-io-js/74547-pomogite-vyvesti-data-url-ochen-nuzhno.html)

Floky 19.07.2018 20:35

Помогите вывести data-url ! ОЧЕНЬ НУЖНО !!!!
 
Ребят выручайте.:help: :help: :help: :help:

Делаю что-то типо парса, ниже код:


const osmosis = require('osmosis');
const fs = require('fs');
let savedData = [];
osmosis


   .get('https://##########//profi')
   .find('.user-preview')
   .set({
           'Name': '.user-preview_name',
	   'Specialization': '.user-preview_specialization',
  	   'City': '.user-preview_city',
	   'URL': '.data-url',
    })

		
	.data(function(data) {
      console.log(data);
      savedData.push(data);
   })
   .done(function() {
      fs.writeFile('data.json', JSON.stringify( savedData, null, 4), function(err) {
        if(err) console.error(err);
        else console.log('Data Saved to data.json file');
      })
   });



Беда в том что все работает нормально, но САМОЕ ГЛАВНОЕ как вытащить мне user-contacts, т.е не ПОКАЗАТЬ КОНТАКТЫ А ИМЕННУ ССЫЛКУ НА CONTACTS



<div class="user-contacts" data-component="userContacts" data-url="https://www.###########/contacts" data-component-ready="true"><a class="js-userContactsShow" href="#">Показать контакты</a></div>







И еще не главный но то же вопрос , как сделать чтобы парсер а именно ( .get('https://##########//profi') цеплял не только одну страницу а скажим /profi/2 /profi/3 /profi/4

j0hnik 19.07.2018 23:58

<div class="user-contacts" data-component="userContacts" data-url="https://www.###########/contacts" data-component-ready="true"><a class="js-userContactsShow" href="#">Показать контакты</a></div>
	<script>
console.log(document.querySelector('div').dataset.url);
	</script>

Floky 20.07.2018 07:01

Дружище, смотри
 
const osmosis = require('osmosis');
const fs = require('fs');
let savedData = [];
osmosis


   .get('https://##########//profi')
   .find('.user-preview')
   .set({
           'Name': '.user-preview_name',
	   'Specialization': '.user-preview_specialization',
  	   'City': '.user-preview_city',
	   'URL': '.data-url',
    })

		
	.data(function(data) {
      console.log(data);
	[B]   console.log(document.querySelector('div').dataset.url);[/B]
      savedData.push(data);
   })
   .done(function() {
      fs.writeFile('data.json', JSON.stringify( savedData, null, 4), function(err) {
        if(err) console.error(err);
        else console.log('Data Saved to data.json file');
      })
   });


Дружище вот вставил в код и NODE JS выдает ошибку


C:\hellop\index.js:40
console.log(document.querySelector('div').dataset. url);
^

ReferenceError: document is not defined
at Array.<anonymous> (C:\hellop\index.js:40:20)
at Command.Data [as cb] (C:\hellop\node_modules\osmosis\lib\commands\data. js:17:17)
at Command.start (C:\hellop\node_modules\osmosis\lib\Command.js:159 :21)
at C:\hellop\node_modules\osmosis\lib\Command.js:166: 18
at dataDone (C:\hellop\node_modules\osmosis\lib\commands\set.j s:97:17)
at Command.cb (C:\hellop\node_modules\osmosis\lib\commands\set.j s:140:17)
at Command.start (C:\hellop\node_modules\osmosis\lib\Command.js:159 :21)
at C:\hellop\node_modules\osmosis\lib\Command.js:166: 18
at Command.Find [as cb] (C:\hellop\node_modules\osmosis\lib\commands\find. js:54:9)
at Command.start (C:\hellop\node_modules\osmosis\lib\Command.js:159 :21)

Я же правильно понял что он вытаскивает ссылку на контакты а не "Показать контакты" ?

Audaxviator 20.07.2018 07:55

Вот правда, здорово было бы вкручивать свой javascript-код на страницы сайтов в энторнетах - я бы сейчас не нищенствовал в сраной рашке, а купил бы домишко на Гавайских островах и попивал текиллу с бурбоном.

Floky 20.07.2018 08:58

Демагогия это хорошо А по существу )?)

Floky 20.07.2018 11:47

Ребят ну как вытащить атрибут ссылки a data-url ( саму ссылку )

Alexandroppolus 20.07.2018 12:13

Floky,
ты бы хоть рассказал, что делают все эти методы в неизвестной науке, но мегакрутейшей библиотечке
osmosis
   .get('https://##########//profi')
   .find('.user-preview')
   .set({
           'Name': '.user-preview_name',
	   'Specialization': '.user-preview_specialization',
  	   'City': '.user-preview_city',
	   'URL': '.data-url',
    })

предвижу, что тут есть загрузка страницы, потом поиск в ней какого-то ".user-preview", а дальше совсем непонятно

Floky 20.07.2018 12:47

Да, потом он начинает брать данные с контейнеров div ,
После чего сохраняет в jdata
Но контейнер div user-contact ( кусочек кода я выложил )имеет данные «Показать Контакты» а мне нужно взять data-url т.е ссылку на Контакты

Floky 20.07.2018 12:49

В идеале конечно же было бы круто если бы он открыл эту ссылку и спарсил бы Контакты , или нажал бы на кнопку «показать Контакты» и спарсил бы но я криворукий новичка в JS , поэтому хотяб вытянуть ссылку друг )

Floky 20.07.2018 20:14

var request = require('request');
var cheerio = require('cheerio'); 




var URL = new Array(
"https://Страница1", 
"https://Страница2",
"https:Страница3");



var request = require('request');
var cheerio = require('cheerio');
var tress = require('tress');
var fs = require('fs');
var Json2csvParser = require('json2csv').Parser;
var needle = require('needle');

var results = [];
var urls = [];

fs.truncate('one.csv', 0, function(){console.log('done')});





var q;
q = tress(function(URL, callback){

needle.get(URL, function (err, res, body) {
		if (err) throw err;
		var $ = cheerio.load(res.body);
		
			//TODO считал количество урлов автоматом по селектору
			//var listLength = $('.user-preview_name').length;
			//var link;
			
			for (i = 0; i <=80; i++) {
					results.push({
				 		Name: $('.user-preview_name').eq( i ).text().trim(),
						City: $('.user-preview_city').eq( i ).text().trim(),
						Spezialinost: $('.user-preview_specialization').eq( i ).text().trim(),
		
						
					 });
				 	//console.log(urls[i]);
				}

		console.log(res.statusCode);
		callback();
		 });
});


q.push(URL, function(){
		console.log("watch: push ");
	});

q.drain = function(){
	console.log("success ");

		//Данные которые спарсил раскладываю по следующим столбцам
		const fields = [ 'Name', 'City', 'Spezialinost','date', 'urlp'];
		const opts = { fields , delimiter: ';'};

		try {
			// Из json данные складываются в csv файл
		  const parser = new Json2csvParser(opts);
		  const csv = parser.parse(results);

		  fs.appendFileSync('one.csv', '\ufeff'+ csv , {encoding: 'utf8'});

		} catch (err) {
		console.error(err);
		}
}



Вопрос сам код выполняет действия с одной страницой, потом с другой затирая последующие результаты в CSV (((

Как решить этот вопрос ?


Часовой пояс GMT +3, время: 22:28.