在爬虫使用过程中解决ip被封锁IP限制的几种方法

方法1
使用多IP代理:
1.IP必须需要,比如ADSL。如果有条件,其实可以跟机房多申请外网IP。
2.在有外网IP的机器上,部署代理服务器。
3.你的程序,使用轮训替换代理服务器来访问想要采集的网站。
好处:
1.程序逻辑变化小,只需要代理功能。
2.根据对方网站屏蔽规则不同,你只需要添加更多的代理就行了。
3.就算具体IP被屏蔽了,你可以直接把代理服务器下线就OK,程序逻辑不需要变化。

方法2.
有小部分网站的防范措施比较弱,可以伪装下IP,修改X-Forwarded-for(貌似这么拼。。。)即可绕过。 、
大部分网站么,如果要频繁抓取,一般还是要多IP。
我比较喜欢的解决方案是国外VPS再配多IP,通过默认网关切换来实现IP切换,比HTTP代理高效得多,估计也比多数情况下的ADSL切换更高效?

方法3.
ADSL + 脚本,监测是否被封,然后不断切换 ip 设置查询频率限制
正统的做法是调用该网站提供的服务接口。?

方法4.
国内ADSL是王道,多申请些线路,分布在多个不同的电信区局,能跨省跨市更好,自己写好断线重拨组件,自己写动态IP追踪服务,远程硬件重置(主要针对ADSL猫,防止其宕机),其余的任务分配,数据回收,都不是大问题。?

方法5.
1 user agent 伪装和轮换
2 使用代理 ip 和轮换
3 cookies 的处理,有的网站对登陆用户政策宽松些
友情提示:考虑爬虫给人家网站带来的负担,be a responsible crawler :)?

方法6.
尽可能的模拟用户行为:
1、UserAgent经常换一换;
2、访问时间间隔设长一点,访问时间设置为随机数;
3、访问页面的顺序也可以随机着来 。?

方法7.
网站封的依据一般是单位时间内特定IP的访问次数.
我是将采集的任务按 目标站点的IP进行分组
通过控制每个IP 在单位时间内发出任务的个数,来避免被封.
当然,这个前题是你采集很多网站.如果只是采集一个网站,那么只能通过多外部IP的方式来实现了。?

方法8.
对爬虫抓取进行压力控制;可以考虑使用代理的方式访问目标站点。
降低抓取频率,时间设置长一些,访问时间采用随机数
频繁切换UserAgent(模拟浏览器访问)
多页面数据,随机访问然后抓取数据 -更换用户IP。?????

原文地址:http://blog.51cto.com/14065782/2325732

时间: 2024-07-29 11:28:35

在爬虫使用过程中解决ip被封锁IP限制的几种方法的相关文章

兔子IP教你解决日常使用过程中ip被封锁IP被限制的几种方法

兔子IP解决日常使用过程中ip被封锁IP被限制的几种方法 方法1使用多IP:1.IP必须需要,比如ADSL.如果有条件,其实可以跟机房多申请外网IP.2.在有外网IP的机器上,部署代理服务器.3.你的程序,使用轮训替换代理服务器来访问想要采集的网站.好处:1.程序逻辑变化小,只需要代理功能.2.根据对方网站屏蔽规则不同,你只需要添加更多的代理就行了.3.就算具体IP被屏蔽了,你可以直接把代理服务器下线就OK,程序逻辑不需要变化. 方法2.有小部分网站的防范措施比较弱,可以伪装下IP,修改X-Fo

很多编程问题是在睡觉过程中解决的

很多编程问题是在睡觉过程中解决的. 有两种方法: 首先将考虑的问题记住,然后睡觉,第二天醒来一些问题就被解决了,So Easy: 另一种方法是睡觉前在一些论坛或者用 tweet 发个帖子,第二天已经有人将解决方法发给你了. 做一名优秀程序员需要很长的时间,你需要学习很多东西,当遇到问题的时候,你需要知道向谁请教. 摘自:http://news.cnblogs.com/n/503469/

解决transition动画与display冲突的几种方法

如demo(如果没有显示,请查看源地址http://jsfiddle.net/ihardcoder/HNduT/2/)所示,基本的效果是在点击“Translate”按钮后,蓝色区域透明度变为0,然后隐藏display:none:点击Reset按钮后,首先显示蓝色区域display:block,然后透明度逐渐恢复至1,代码如下: 1 var btn1 = $("#testbtn1"); 2 var btn2 = $("#testbtn2"); 3 var contai

C语言K&R习题系列——句子中一个空格代替多个空格的四种方法

原题: Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank. 第一种: 这种最常用,设置一个inspace作为布尔变量,标志当前输入是否在字符中,或在字符外 #include <stdio.h>   int main(void) {   int c;   int inspace=0;     while((c = getcha

Struts学习笔记(三)struts2中获得request、response和session的三种方法

struts2中获得request.response和session的三种方法   (1)非IoC方式 方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象. ActionContext ctx = ActionContext.getContext(); ctx.put("liuwei", "andy"); //request.setAttribute("l

Win7系统与它的Virtualbox中安装的Ubuntu14.04共享信息的几种方法

虚拟机是每个程序员必备的工具.本文根据最新版VirtualBox用户手册的提示,通过自己的亲自实践,给出了Win7系统与运行在其中的VirtualBox 5.0.2中的Ubuntu 14.04共享信息的三种方法,而不仅仅是建立二者的共享文件夹. 在学习新的技术时,或者做不同的测试时,为了节省硬件的目的,我们常常安装虚拟机,并在其中安装不同的操作系统.我们把运行在硬件的本来的那个操作系统称为主操作系统 (host OS),而把运行在虚拟机上面的操作系统称为客操作系统 (guest OS).这时,在

解决VMware中虚拟机(centos7)无法上网的一种方法

本文记录使用VMware搭openstack环境中遇到的问题和解决方法.作为一个熟练拼写openstack和只知道怎么创建虚拟机的新手,原本搭openstack就是一个不断爬坑的过程,结果VMware上又出问题,让自己原本就饱受openstack摧残的信心渣都不剩,整个人都烦躁起来了.但各种找原因查资料解决问题之后,整个人的感觉非常棒.所以记录下来加强自己的印象和方便别人.闲话至此,上干货! 使用的软件环境:win10+VMware14 Pro+centos7 VMware中具体配置:2台虚拟机

Swift中,把NSData转换为Byte数组的三种方法

最近做IOS开发需要从一个NSData中读出数据.但是找不到相关文档.网上搜索也有人问,我看到有Objective-C的答案,但基本上没有Swift的方案. NSData的bytes是UnsafePointer<Void>类型,我不知道怎样直接获取到他的值(如果你知道,请一定要告诉我). 所以我自己摸索了一下把NSData转换为[Byte]的方法,希望起到抛砖引玉的作用. 下面直接在PlayGround中演示: 最后我采用的当然是第三种方法: import Foundation var b:[

学习爬虫过程中解决下载网页乱码的问题

这个问题肯定是字符的编码错乱导致的.网上也有很多解决方案.我看过的方案很多,最好的就是这个了. https://www.sohu.com/a/289375951_420744 原因文章说得很清楚,理论也讲得明白.解决方案我录在下面.版权归原作者. 方法一:直接指定res.encoding import requests url = "http://search.51job.com" res = requests.get(url) res.encoding = "gbk&quo