Nodejs爬虫实战(四)

1. 淘宝天猫页面重定向
  1. 尝试抓取淘宝页面

  2. 打印res.statusCode,res.headers.location

  3. res.statusCode返回的状态码;

    res.headers.location返回的地址

  4. 发现状态码为302,百度HTTP状态码

    302 Move Temporarily

    请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

    如果这不是一个 GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。

    注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

  5. 淘宝返回给我们的只是一个临时的html页面,并不是真正的还有数据的页面。

  6. 判断是否重定向,递归寻找真页面

     if(res.statusCode == 302 || res.statusCode == 301){
     		console.log(`第${index}次重定向`,res.headers.location);
     		GetUrl(res.headers.location,success)
     	}
    
2. 转码
  1. 拿到了真实页面之后,打开发现有编码错误的问题

  2. 引用gbk模块

  3. gbk提供了编码转换的方法
    gbk.toString('utf-8',data);

  4. 结束

    完整代码
    var index = 0;
    const fs = require('fs');
    const url = require('url');
    const gbk = require('gbk');
    
    GetUrl('https://detail.tmall.com/item.htm?spm=a230r.1.14.6.68624507tWuF7E&id=560257961625&cm_id=140105335569ed55e27b&abbucket=18&sku_properties=10004:709990523',(data)=>{
    
    	var html = gbk.toString('utf-8',data);
    	console.log(html)
    	//console.log('终于我走出来了')
    	//fs.writeFile('iponex.html',data);
    	//console.log(str)
    })
    function GetUrl(sUrl,success){
    	index++;
    	var urlObj = url.parse(sUrl);
    	var http ='';
    	if(urlObj.protocol == 'http:'){
    		http = require('http');
    	}
    	else{
    		http = require('https');
    	}
    
    	let req = http.request({
    		'hostname':urlObj.hostname,
    		'path':urlObj.path
    	},res=>{
    		if(res.statusCode == 200){
    			var arr = [];
    			var str = '';
    			res.on('data',buffer=>{
    				arr.push(buffer);
    				//str +=buffer;
    			});
    			res.on('end',()=>{
    				let b = Buffer.concat(arr);
    
    				success && success(b);
    
    			})
    		}
    		else if(res.statusCode == 302 || res.statusCode == 301){
    			console.log(`第${index}次重定向`,res.headers.location);
    			GetUrl(res.headers.location,success)
    		}
    		//console.log(res.statusCode,res.headers.location)
    		
    		
    		
    	});
    
    	req.end();
    	req.on('error',()=>{
    		console.log('404了,哥们');
    	})
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值