我们在网页中输入网址后发生了什么呢? 1.浏览器获取域名 2.通过DNS协议获取域名对应服务器的ip地址 3.浏览器和对应的服务器通过三次握手建立TCP连接 4.浏览器通过HTTP协议向服务器发送数据请求 5.服务器将查询结果返回给浏览器 6.四次挥手释放TCP连接 7.浏览器渲染结果
其中涉及到了: 应用层:HTTP和DNS 传输层:TCP UDP 网络层:IP ICMP ARP
那为什么需要到用代理呢? 因为在做爬虫的过程中经常会遇到这样的情况: 最初爬虫正常运行,正常抓取数据,一切看起来都很不错,然而喝口茶的功夫可能就会出现错误,比如403 Forbidden 这时候打开网页一看,可能会看到“您的IP访问频率太高”这样的提示。 出现这种现象的原因是网站采取了一些反爬虫措施。 比如,服务器会检测某个IP在单位时间内的请求次数,如果超过了这个阈值,就会直接拒绝服务,返回一些错误信息,这种情况可以称为封IP。 而代理ip就避免了这个问题。
代理ip的获取 一、原始方法注入数据
1 // 初始化方法 2 constructor () { 3 // token 4 this.token = "Z1QljZOZiT4NTG" 5 6 // 请求地址 7 this.req_url = 'http://api.txapi.cn/v1/proxies_ip' 8 }
二、开始代理IP
注意:agr 参数是必传;1:HTTP 2:HTTPS 3:SOCKS5
1 agent_IP (url, token) { 2 let p = new Promise(function (resolve, reject) { 3 axios({ 4 url: url, 5 method: 'GET', 6 params: { 7 token: token, 8 agr: 1 9 } 10 }).then(resp => { 11 if(resp.data.code !== 200){ 12 console.log("查询失败") 13 } else { 14 resolve(resp.data) 15 } 16 }) 17 }) 18 return p 19 }
三、封装run函数
1 // run函数 2 run () { 3 this.agent_IP(this.req_url, this.token).then(res => { 4 console.log(res); // 查询结果 5 }) 6 }
四、完整代码
1 const axios = require('axios') 2 3class Parse { 4 // 初始化方法 5 constructor () { 6 // token 7 this.token = "Z1QljZOZiT4NTG" 8 9 // 请求地址 10 this.req_url = 'http://api.txapi.cn/v1/proxies_ip' 11 } 12 13 // 代理IP 14 agent_IP (url, token) { 15 let p = new Promise(function (resolve, reject) { 16 axios({ 17 url: url, 18 method: 'GET', 19 params: { 20 token: token, 21 agr: 1 22 } 23 }).then(resp => { 24 if(resp.data.code !== 200){ 25 console.log("查询失败") 26 } else { 27 resolve(resp.data) 28 } 29 }) 30 }) 31 return p 32 } 33 34 // run函数 35 run () { 36 this.agent_IP(this.req_url, this.token).then(res => { 37 console.log(res); // 查询结果 38 }) 39 } 40} 41 42if(__filename === process.mainModule.filename) { 43 // new一个Parse对象 44 const p = new Parse() 45 46 // 调用run方法 47 p.run() 48}