按URL获取HTML页面

时间:2015-07-30 17:31:48

标签: node.js

这是我的代码:

 utilitesRouter.route('/url')
    .post(function(request, response) {
        console.log(request.body.uri);
        var urlOpts = { host: request.body.uri, path: '/', port: '80', method: 'GET' };
        var re = /(<\s*title[^>]*>(.+?)<\s*\/\s*title)>/gi;
        http.get(urlOpts, function (response) {
            response.on('data', function (chunk) {
                var str=chunk.toString();
                console.log(str);
                var match = re.exec(str);
                if (match && match[2]) {
                    console.log(match[2]);
                }
            });    
        });

        response.json({ url: request.body.uri });    
    });

如果我使用这个JSON {"uri":"google.ru" }的POST请求,我得到:

302 Moved
google.ru
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.ru/index.html">here</A>.
</BODY></HTML>

如果我使用JSON {"uri":"http://google.ru" }进行POST请求,我会收到错误消息:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: getaddrinfo ENOTFOUND http://google.ru
    at errnoException (dns.js:44:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)

我可以在浏览器中打开http://google.ru

如何使用node.js获取HTML?

2 个答案:

答案 0 :(得分:1)

您可能希望request这样做。这很简单。

var request = require("request");

router.get('/proxy', function(req, res, next){
  request.get( req.body.uri, function(error, response, body){
    if( error )
      return next(error);

    res.send(body);
  });
});

请求也支持流媒体和其他酷炫功能。

答案 1 :(得分:0)

您收到错误,因为在您的urlOpts中,属性host必须是域名,例如google.ruwww.google.ru。当您将URL放入其中时,无法通过DNS将其解析为IP,这就是您收到错误at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)的原因。

如果您希望像处理http.get()一样使用uri,则必须从传递的google.ru中提取域名部分,即从{{1}中获取http://google.ru将其用作host