nodejs爬虫 - node爬虫,爬不到数据,不知道问题出在哪

查看:368
本文介绍了nodejs爬虫 - node爬虫,爬不到数据,不知道问题出在哪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

var http = require("http");
var cheerio = require("cheerio");
var tagetUrl = "http://music.163.com/m/";
var html = "";
http.get(tagetUrl, (res) => {
    res.on("data", function(data){
        html += data;
    })
    res.on("end", ()=>{
        const $ = cheerio.load(html);
        var result = $(".tabtxt");
        console.log(result.html());
    })
})

执行的结果是null。爬不到的原因是什么

解决方案

因为这个页面被重定向了……返回的 http 状态码是 302,同时没有 body。所以 data 是空的。

如果要处理重定向,可以像下面这样做处理:

var http = require("http");
var cheerio = require("cheerio");
var myTargetUrl = "http://music.163.com/m/";
var html = "";
const request = (targetUrl) => http.get(targetUrl, (res) => {
  "use strict";
  const statusCode = res.statusCode;
  if (statusCode === 302) {
    const redirectUrl = res.headers['location'];
    request(redirectUrl);
  } else {
    res.setEncoding('utf8');
    res.on("data", function(data){
      html += data;
    })
    res.on("end", ()=>{
      const $ = cheerio.load(html);
      var result = $(".tabtxt");
      console.log(result.html());
    })
  }
})

request(myTargetUrl);

但是这里搞出来的结果还是 null。为什么呢?我看了看,这里的关键不是重定向。其实你本来就是要爬 /m 这个页面,但是因为没有设置 UserAgent 被重定向了。正确的做法是设置 UserAgent。

var http = require("http");
var cheerio = require("cheerio");
var html = "";
http.get({
  host: 'music.163.com',
  path: '/m',
  headers: {
    "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36"
  }
}, (res) => {

  res.on("data", function(data){
    html += data;
  })
  res.on("end", ()=>{
    const $ = cheerio.load(html);
    var result = $(".tabtxt");
    console.log(result.html());
  })
})

这样就能得到满意的结果了:

<span data-reactid="39">&#x63A8;&#x8350;&#x97F3;&#x4E50;</span>

这篇关于nodejs爬虫 - node爬虫,爬不到数据,不知道问题出在哪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆