如何利用动态ip迎合爬虫系统?

如何使用动态IP代理来迎合爬虫系统?为了避免恶意攻击,企业正在制作网站系统。写爬虫的时候,有些网站会有一些反爬虫的措施,比如限制单个ip的访问频率,突破ip限制大概有以下几种方式:
 
 
与抓取的网站合作,将自己的ip加入白名单;
 
买多台公共ip的服务器,每台都有爬虫脚本,相当于每台爬虫都有自己独立的IP;
 
买一些便宜的ip资源,用这些IP做代理(可以是低配置的服务器,每台机器多个公网IP,只负责网络代理,不跑业务)。
 
1.既然选择抓取人的数据,那么初期应该没有合作的意向和渠道。
 
2.多台服务器成本高,同一个爬虫部署在多个地方,维护成本也高(配置、部署、升级、爬虫之间的相互协调等。).
 
3,成本低,不需要在很多地方部署脚本。
 
本文将从原理到实现一步步解释模式3。
 
Http代理原则
 
当访问一个站点时,网站服务器可以获取访问者的ip。服务器可以根据ip的请求进行一些限流操作。相反,代理在访问者和网站之间添加了一个中介。向访问者中间人发送请求,中间人将请求转发给站点,最后中间人将站点的响应返回给访问者。在这个过程中,网站只能看到代理商(中间人)的ip。
 
没有代理:访问者的网站(网站看到访问者的ip)
 
有代理的情况:访问者代理站点(站点看到代理的ip)
 
有动态代理:访客[代理1,代理2,代理3,...]站点(该站点看到多个代理的随机ip)
 
尝试卷曲
 
你可以通过访问http://httpbin.org/ip:获得自己的ip
 
卷曲http://httpbin.org/ip{ "起源":" 58.243.254.31"}
 
你可以看到我的外网ip是58.243.254.31。Curl支持- proxy参数来指定代理:
 
curl-proxy http://localhost:1087 http://httpbin.org/ip{ " origin ":" 217 . 197 . 160 . 199 " }
 
使用代理后,我的ip(访问过的网站)变成了217.197.160.199。通过以上实验,你一定对代理有了一定的认知。
 
用nodejs写一个简单的爬虫
 
这个爬虫非常简单,即它请求http://httpbin.org/ip并将返回值打印到控制台。
 
#创建一个名为node-crawler mkdir node-crawler的文件夹#输入此文件夹cd node-crawler#创建一个默认包. jsonnpm init -y#安装请求取决于npm i -S请求#创建一个名为index.js TouchIndex.js的新文件。
 
index.js的内容如下:
 
const request = require(" request ");Request(,(err,res,body)=>{ //暂时忽略错误消息,直接打印body console . log(body);});
 
在控制台上执行node index.js,您将获得以下输出:
 
{ "origin": "58.243.254.31,58.243.254.31"}
 
与curl类似,我们可以为请求方法配置代理参数:
 
const request = require(" request ");request({ URL:" http://http bin . org/IP ",proxy: "http://localhost: 1087"},(err,res,body)= > {//暂时忽略错误消息,直接打印body console . log(body);});
 
再次执行node index.js,您将获得以下输出:
 
{ "origin": "217.197.160.199,217.197.160.199"}
 
至此,单个http代理已经完成。接下来,我们讨论如何在多个http代理之间动态地来回切换,以削弱被爬取的站点对访问者ip的限制。
 
第一个方案
 
从外部将ip代理参数传递给爬虫脚本,爬虫运行后自动退出,然后取另一个ip代理参数,爬虫脚本重新运行,循环往复。
 
您可以像这样编写一个shell脚本:
 
#!/usr/bin/env bash#假设有2个http代理可用=(' http://a . b . c . d:8443 ' ' http://h . I . j . k:1087 ');# while(真)一遍又一遍;Do #一次取出“$”中p的一个代理;Do echo使用代理$p #运行crawler PROXY=$p node index.js #休眠一段时间
 
其中PROXY=$p是定义环境变量的代理,其值是两个http代理中的任意一个。让我们修改index.js,使用代理环境参数作为它的代理:
 
const request = require(" request ");const proxy = process . env . proxy;request({ URL:" http://http bin . org/IP ",proxy}、(err,res,body)= > {//暂时忽略错误消息,直接打印body console . log(body);});
 
该方案使用bash脚本和js爬虫脚本。对于不了解bash的人来说,维护起来有一定的心理负担。接下来我们用纯js语言来实现。
 
第二个方案
 
将方案一中的bash转换为js,并将index.js的内容调整为:
 
const request = require(" request ");const proxy =[" http://a . b . c . d:8443 "," http://h . I . j . k:1087 "];main();// index是循环执行函数main (index = 0)的次数{ request({ URL:" http://http bin . org/IP ",//take proxy:proxy[index % proxies . length]},(err,res,body)= > {//暂时忽略错误消息。//5秒后取下一个代理,重新运行爬虫setTimeout( main,5000,index+1);});}
 
综上所述,我们实现了从不使用代理,使用单个代理,再使用多个代理的过程,让我们的爬虫尽可能少的受到服务器电流限制的影响。我们还研究了当一个需求有多种解决方案时,如何选择经济成本、开发成本和维护成本。