node爬蟲

node爬蟲項目的總結node

用到的包

  • request: 發送http請求;jquery

  • cheerio: 後端jquery;ajax

  • iconv: 轉變字符集格式;後端

  • cron: 定時任務;瀏覽器

爬取utf8頁面

const request = require('request');
const cheerio = require('cheerio');
request('https://www.baidu.com/', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(body);
        console.log( $('#su').val() )       // 百度一下
    }
});

爬取gbk頁面

var options = {
    url: 'http://www.163.com/',
    encoding: null
}
request(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        str = iconv.decode(body, 'gbk');
        var $ = cheerio.load(str);
        console.log( $('#_link_auto').text() ) // 汽車
    }
})

爬取時僞造瀏覽器useragent以及請求頭信息;

上面爬取網頁頁面其實會提示訪問受限制,而後跑到上面這個受限制頁面;是由於沒有僞造瀏覽器頭部信息cookie

const iconv = require('iconv-lite');
var options = {
    url: 'http://www.163.com/',
    encoding: null,
    headers: {
       'user-agent': 'xx',
    }
}
request(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        str = iconv.decode(body, 'gbk');
        console.log(str) // Show the HTML for the Google homepage.
    }
})

定時爬取

// app.js; 起服務的頁面
const fork = require('child_process').fork;
const CronJob = require('cron').CronJob;

var job = new CronJob('5,10,15,20,25,30,35,40,45,50 * * * * *', function() {
    fork('crawl.js')
});
job.start();

// crawl.js  子進程js;
const request = require('request');
const cheerio = require('cheerio');

request('https://www.baidu.com/', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(body);
        console.log( $('#su').val() )       // 百度一下
    }
});

爬取頁面須要帶cookie信息怎麼辦?

方法一: 先模擬登陸發送一個請求,從response的headers頭信息裏獲取到cookie信息,再向目標頁發送請求時帶上cookie信息便可;獲取表單提交data的key值方法:打開控制檯,勾選preserve log,填寫表單信息後,點擊提交,當頁面跳轉的時候原先頁面的網絡信息依然存在,找到對應的請求,查看請求體便可。
方法二: 利用phantomjs模擬瀏覽器登陸行爲。網絡

var options = {
        url: '登陸發送的目標請求,能夠在ajax的url裏找到,也能夠在form表單的action裏獲取到',
        form: {
            account:'xxx',
            pwd:'xxx'
        }
    };
    request.post(options,function(err,response) {
        console.log(response.headers['set-cookie']);
        var opt = {
            url: '目標請求',
            headers: {
                'cookie': response.headers['set-cookie']
            }
        }
        request(opt,function(error,res,body) {
            console.log(body.toString());
        })
    })

動態修改ip

相關文章
相關標籤/搜索