2017-02-04 14 views
1

Я хочу очистить страницу «https://www.ukr.net/ua/news/sport.html» с Nodejs. I`m пытается сделать основной запрос GET с модулем НПМ «запрос», вот пример:Скребок Nodejs

const inspect = require('eyespect').inspector(); 
const request = require('request'); 
const url = 'https://www.ukr.net/news/dat/sport/2/'; 
const options = { 
    method: 'get', 
    json: true, 
    url: url 
}; 

request(options, (err, res, body) => { 
    if (err) { 
     inspect(err, 'error posting json'); 
     return 
    } 
    const headers = res.headers; 
    const statusCode = res.statusCode; 
    inspect(headers, 'headers'); 
    inspect(statusCode, 'statusCode'); 
    inspect(body, 'body'); 
}); 

Но в теле ответа я получаю только

body: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
Transitional//EN">\n<html>\n<head>\n<META HTTP-EQUIV="expires" 
CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">\n<META HTTP-EQUIV=Refresh 
CONTENT="10">\n<meta HTTP-EQUIV="Content-type" CONTENT="text/html; 
charset=utf-8">\n<title>www.ukr.net</title>\n</head>\n<body>\n 
Идет загрузка, подождите .....\n</body>\n</html>' 

Если я получить запрос от Почтальон, Я получаю то, что мне нужно:

enter image description here

Пожалуйста, помогите мне, ребята.

+0

'Идет загрузка, подождите .....' = 'загрузка, пожалуйста, подождите ....' - страница, которую вы пытаетесь скрести имеет элементы, которые загружаются динамически, так что ваши первоначальный запрос возвращается с сообщением «загрузка» - возможно, вы могли бы использовать что-то вроде фантомных js для рендеринга страницы для вас? http://stackoverflow.com/a/31059035/459517 - Почтальон, вероятно, делает что-то подобное автоматически. – Robbie

ответ

1

Возможно, вы были заблокированы защитой ботов - это можно проверить с помощью curl.

curl -vL https://www.ukr.net/news/dat/sport/2/

локон, кажется, чтобы получить результат, и если завиток работает, то есть, вероятно, что-то отсутствует в запросе от узла, решение может быть, чтобы имитировать браузер вашего выбора.

Например - Вот пример хромированные как запрос берется из-разработчика инструментов:

enter image description here

выведение следующих параметров для запроса:

const options = { 
    method: 'get', 
    json: true, 
    url: url, 
    gzip: true, 
    headers: { 
     "Host": "www.ukr.net", 
     "Pragma": "no-cache", 
     "Cache-Control": "no-cache", 
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", 
     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
     "Accept-Encoding": "gzip, deflate, sdch, br", 
     "Accept-Language": "en-US,en;q=0.8" 
    } 
}; 
+0

Большое вам спасибо! Оно работает;) –

1

Если у вас есть опыт В jquery есть библиотека для доступа к HTML, например.

пример разметки мы будем использовать:

<ul id="fruits"> 
    <li class="apple">Apple</li> 
    <li class="orange">Orange</li> 
    <li class="pear">Pear</li> 
</ul> 

Прежде всего, необходимо загрузить в HTML. Этот шаг в jQuery неявный, поскольку jQuery работает на одном, запеченном DOM. С Cheerio нам нужно передать документ HTML.

var cheerio = require('cheerio'); 

$ = cheerio.load('<ul id="fruits">...</ul>'); 

селекторы

$('ul .pear').attr('class') 

вероятно, вы можете сделать что-то вроде этого.

request(options, (err, res, body) => { 

    var $ = cheerio.load(html); 

}) 

https://github.com/cheeriojs/cheerio