2017-02-04 58 views
1

我想用Nodejs刮頁「https://www.ukr.net/ua/news/sport.html」。 我真的試圖與「請求」 NPM模塊基本GET請求,這裏是例子:Scraping 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>' 

如果我讓郵差從get請求,我得到正是我需要的:

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