我正在为我的网络抓取需求构建一个简单的Node.js服务器。问题是,当我尝试加载The Pirate Bay时,结果如下:
[{S6; NZ%YGbN“豪$ R- { s Nj <~u yb q09 &v / w< ## ' 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');
});
}
});
命令行中没有错误。任何帮助将不胜感激。
答案 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)
我好几天都有同样的问题。我注意到了一些事情:
如果您没有使用纯粹的Node路线,那么还有另一种方法可以解决问题。我最后编写了一个Python脚本来为我进行抓取,然后使用 child_process 包(特别是 exec 功能)从Node调用它。 Python文件从通过 sys.stdout.write (不使用 print 语句)抓取的网页返回内容,以便exec函数可以获取它
我希望有所帮助。