Node.js抓取带来了惊人的结果与thepiratebay

时间:2014-06-26 08:06:27

标签: javascript node.js web-scraping

我正在为我的网络抓取需求构建一个简单的Node.js服务器。问题是,当我尝试加载The Pirate Bay时,结果如下:

  

[{S6; NZ%YGbN“豪$ R- { s Nj &lt;~u yb q09 &amp;v / w&lt; ## ' q} t* | ?g g E Sg %|M L>8 9 +t 4 U y Ł N}J Tܳ( EN9nh0C \ 8 @ q] n . C ^dMYHg 4Ó ( P脱 O R 8 0 ] | J K M _ _ߜ y: | = |uīz 7:F @ wݪz|La2 p ȋ�����Н��y= �%k�^t��*�;\���6��Uď��_���l��r�� ��{��m�!vt豀�T��ۄ���hm��j���|��/a;�V}#��W�Z����lc_�HmȎ�!3���䠾�i����usp�)�������j_n=�l����%X�Ā ��������>����-= [PJc�v�V�ز]�X݅Ǎ0�*o��*|<"��+!8�_>%A G I e/ s ҝ

但更长。我尝试将元字符集设置为UTF-8,但它不起作用。这是app.js的主要部分:

app.get('/:key/:url', function(req, res) {
     // to prevent a bunch of people from overloading my server
     var key = req.params.key;
     if (key != '12345')
         res.send('error: incorrect key');

     else {
         // scraping itself

         // slashes confuse the system
         var url = ('http://' + req.params.url).replace('#', '/');
         // res.send('Successful');

         request(url, function(err, response, html) {
          // if no error occurred   
          if (!err) 
            res.render('index', { output: html });
          else
            res.send('error loading website');
        });
    }
});

命令行中没有错误。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

显然看起来像编码问题。

我的建议是首先在浏览器中加载网站(如果你不能,使用代理插件,有很多)并在浏览器内部进行调查,以确定网站上使用的编码。很可能是UTF-8,但更好的验证。

然后问题是为什么javascript中的解码不起作用,而不是它不起作用,因此有一些其他的

您也可以在服务器上使用简单的shell工具(如wget url)来查看node.js代码中的问题或服务器与站点之间的网络通信是否存在问题。

以下是使用iconv模块对网站使用编码的示例:

request({url: url, encoding: 'binary'}, function(error, response, html) {
    enc = charset(response.headers, html);
    if (!enc) {
        enc = jchardet.detect(html).encoding.toLowerCase();
    }
    if (enc != 'utf-8') {
        iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE')
        html = iconv.convert(new Buffer(html, 'binary')).toString('utf-8')
    }
    console.log(html); // For debugging
});

另外,我觉得你是在尝试制作代理服务器吗?假设你和我一样住在英国,该网站被女王陛下禁止。 :)聪明的家伙。

有更好的方法来构建代理服务器,您的方法会遇到加载补充资源(javascript,images,css)的问题。

答案 1 :(得分:0)

我好几天都有同样的问题。我注意到了一些事情:

  1. 从Node检索网站产生的结果与通过命令行从cURL检索网站的结果相同。
  2. 即使通过传递标题控制编码,网站的响应也是相同的gobbledegook。
  3. 如果您没有使用纯粹的Node路线,那么还有另一种方法可以解决问题。我最后编写了一个Python脚本来为我进行抓取,然后使用 child_process 包(特别是 exec 功能)从Node调用它。 Python文件从通过 sys.stdout.write (不使用 print 语句)抓取的网页返回内容,以便exec函数可以获取它

    我希望有所帮助。