【2】简单防止爬虫ip被封
1. 伪装浏览器身份
防止爬虫ip被封,最简单的方案就是伪装身份,可以简单理解为请求的头信息就是HTTP请求者的身份证。要以浏览器的身份发起爬虫请求。就要伪造请求的头信息。
-
User-Agent
:就是身份证的民族+地区,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"表明HTTP请求者是Windows 64位系统下的谷歌浏览器。 -
Cookie
头信息则是表明已经登录,就好比已经得到当地的户口。那么购买学区房时,工作人员一看身份证是当地的,就有这个权限购买。网页识别请求者头信息携带Cookie,就允许请求者对需要登录权限的网页进行访问。我们在下一节讲解具体应用。 - 其他头信息:设置头信息越多,伪装的身份可信度就越高。如果设置的头信息不够多,有的网页在返回响应数据时可能为空或者不予返回。不需要设置
Host
信息,有的网站比如当当网设置Host
信息会导致访问失败。
同一网站的不同页面所需的头信息项数量存在差异,我们只要对关键的几项头信息设置就可以对多个页面进行访问了。
2. 获取伪装所需的头信息
通过查看Chrome浏览器,可以在 Network
中得到通过真正浏览器打开网页所携带的头信息,我们获取这些信息用于伪装身份。
- 源代码
const axios = require('axios');
const iconv = require('iconv-lite');
// 要访问的目标网址
const targetUrl = "http://book.dangdang.com/";
let myHeaders = {
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9",
"Connection":"keep-alive",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
}
//不断读取流数据并放入数组中,直到全部读取完就将数组中的数据转换为utf8编码的字符串
axios.get(targetUrl, { headers: myHeaders,responseType: 'stream' })
.then(function (response) {
let chunks = [];
//'data'当有数据可读时触发。
response.data.on('data', function (chunk) {
chunks.push(chunk);
});
//'end'没有更多的数据可读时触发
response.data.on('end', function () {
let buffer = Buffer.concat(chunks);
//使用iconv将'gbk'编码的buffer解码转换为'utf8'的字符串
let str = iconv.decode(buffer, 'gbk');
console.log(str)
})
})
.catch(function (error) {
console.log(error);
});