如何解决爬虫的IP地址受限问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决爬虫的IP地址受限问题相关的知识,希望对你有一定的参考价值。

1、放慢爬取速度,减小对于目标网站造成的压力。但是这样会减少单位时间类的爬取量。
第二种方法是通过设置IP等手段,突破反爬虫机制继续高频率爬取。网站的反爬机制会检查来访的IP地址,为了防止IP被封,这时就可以使用HTTP,来切换不同的IP爬取内容。使用代理IP简单的来讲就是让代理服务器去帮我们得到网页内容,然后再转发回我们的电脑。要选择高匿的ip,IPIDEA提供高匿稳定的IP同时更注重用户隐私的保护,保障用户的信息安全。
2、这样目标网站既不知道我们使用代理,更不会知道我们真实的IP地址。

3、建立IP池,池子尽可能的大,且不同IP均匀轮换。
如果你需要大量爬去数据,建议你使用HTTP代理IP,在IP被封掉之前或者封掉之后迅速换掉该IP,这里有个使用的技巧是循环使用,在一个IP没有被封之前,就换掉,过一会再换回来。这样就可以使用相对较少的IP进行大量访问。
参考技术A 爬虫的IP地址受限?其中最直接的因素的便是访问速度过快,这个别说爬取抓取了,即便用户自己点击过快也是会被提示访问频率过快的。网络爬虫的访问速度若是一直都很快,并且都使用同一个IP地址访问,这是很快IP就会被封的。
面对这个问题,网络爬虫一般是怎么处理的呢?无外乎是两种方法,第一降低访问速度,第二切换IP访问。
爬虫降低访问速度
由于上文所说的访问速度过快会引起IP被封,那么最直观的办法便是降低访问速度,如此就能防止了我们的IP被封的问题。但呢,降低速度,爬虫的效率就降低,关键还是要降低到什么程度?
在这一点上,我们首先要测试出网站设置的限制速度阈值,如此我们才能设置合理的访问速度,建议不要设固定的访问速度,能够设置在一个范围之内,防止过于规律而被系统检测到,从而导致IP被封。
爬虫切换IP访问
降低了访问速度,难以避免的影响到了爬取的抓取效率,不能高效地抓取,如此的抓取速度与人工抓取有何区别呢?都没有了使用爬虫抓取的优势了。
既然单个爬虫被控制了速度,但我们可以使用多个爬虫同时去抓取啊!是的,我们可以使用多线程,多进程,这里要配合使用代理,不同的线程使用不同的IP地址,就像是同时有不同的用户在访问,如此就能极大地提高爬虫的爬取效率了。本回答被提问者采纳
参考技术B 一些网站为控制流量和防止受到攻击,设置了单ip一分钟内允许的最大请求数是很正常的。您在网上找到的使用代理来解决ip受限的问题,在大多数情况下确实是可行的。
之所以说是大多数,是因为您使用ip代理来发出的http请求其实已经被黑客们广泛使用,当您使用成百上千个ip代理并开启大量线程向目标站点发起请求时,就是典型的ddos攻击的一种: cc攻击。对于一些大型的网站,一般都会对客户端的请求做一些检测,发现如果是使用的代理,不同网站会有不同策略,有些是降低每分钟来自该代理ip请求本站的次数,有些会直接跳转到验证页面,要求输入验证码才能继续访问站点,而有些就暴力一点,干脆不允许代理ip的访问了。当然,对于大多数网站是不会去检测用户是否使用了代理ip的,您可以尽情的使用这种方法开启多个线程来爬取目标网站的信息。前提是,您也要有足够的代理ip…
BTW,在发起使用了代理ip的http请求之前,建议精心构建好这个请求,并合理控制好每秒的请求数,防止目标站点以为受到了攻击,进而导致您的所有代理地址都被拒绝。
至于您所提的域名式的http代理,事实上他要比ip式的http代理更为稳定,例如像http://proxy1.proxysite.com这样的域名背后有可能存在多个ip绑定,很显然使用上面的域名式代理向目标站点发出请求时,1个ip不能访问了,他还会有剩下多个ip来帮你完成访问请求。所以建议您使用域名式代理来向您的目标站点发出请求,当然,这也是cc攻击的常用伎俩。祝好运
参考技术C

被限制IP最普遍的一个缘故是抓取频率过快,超出了目标网站所设置的阈值,将会被服务器禁止访问。因此,许多爬虫工作者会选择运用代理IP来辅助爬虫工作的正常的运行。

一般 ,爬虫工程师会采取这样两个手段来处理问题:

一、放慢抓取速度,降低IP或是其他资源的消耗,但这样会降低单位时间的抓取量,有可能会影响到任务是否能按时完成。

二、优化爬虫程序,减少一些不必要的程序,提供程序的工作效率,降低对IP或是其余资源的消耗,这就需要资深爬虫工程师了。

如果说这两个办法都已经做到极致了,依然难以解决问题,那么只有购买代理IP来保障爬虫工作的高效、持续、稳定地进行。

参考技术D 在数据收集方面而言,爬虫想要采集数据,前提条件要能突破网站的反爬虫机制,接着还能预防网站封IP,这样的才可以高效地进行工作。爬虫怎样防网站封IP?
1.多线程采集
采集数据,都想尽量快的采集更多的数据,要不然大量的工作还一条一条采集,太耗时间了。
比如,几秒钟采集一次,这样一分钟能够采集10次左右,一天可以采集一万多的页面。如果是小型网站还好,但大型网站上千万的网页应该怎么办,按照这个速度采集需要耗大量的时间。
建议采集大批量的数据,可以使用多线程,它可以同步进行多项任务,每个线程采集不同的任务,提高采集数量。
2.时间间隔访问
对于多少时间间隔进行采集,可以先测试目标网站所允许的最大访问频率,越贴近最大访问频率,越容易被封IP,这就需要设置一个合理的时间间隔,既能满足采集速度,也可以不被限制IP。
3.高匿名代理
需要突破网站的反爬虫机制,需要使用代理IP,使用换IP的方法进行多次访问。采用多线程,也需要大量的IP,另外使用高匿名代理,要不然会被目标网站检测到你使用了代理IP,另外透露了你的真实IP,这样的肯定会封IP。假若使用高匿名代理就可以避免被封ip。
上文介绍了需要大量采集数据的情况下,爬虫怎样防网站封IP的方法,即使用多线程采集,并用高匿名代理进行辅助,还需要调节爬虫访问的速度,这样的大幅度降低网站封IP的几率。

爬虫第五节 代理服务器设置

# 代理服务器的设置
# 有时使用同一个ip去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。那么怎样解决这个问题呢?
# 解决的思路很简单,即“瞒天过海,暗度陈仓”。
# 如果我们爬取别人网站的时候,在对方服务器上显示的是别人的ip地址,那么,即使 对方将显示出来的这个ip地址屏蔽了,也无关紧要,
# 因为我们可以换另一个ip地址继续 爬取。
# 使用代理服务器,就可以很好地解决这个问题。使用代理服务器去爬取某个网站的内容 的时候,
# 在对方网站上,显示的不是我们真实的ip地址,
# 而是代理服务器的ip地址。并且 在Python爬虫中,使用代理服务器设置起来也很简单。
# 那么这些代理服务器可以从哪里找到呢?我们可以在互联网中搜索对应的代理服务器地址,
# 当然也可以从整理好的网址http://www.xicidaili.com/nt/1中找到很多代理服务器地址。
#通过网站就可以看到,这里会更新很多代理IP地址,我们尽量找验证时间比较短的,这些成功的概率会比较大,一些验证时间较长的,可能会失效。
# 举例:我们可以选择第二个代理IP地址202.75.210.45,对应的端口号是7777,
# 所以呢 ,完整的 格式为:“网址:端口号”,即 202.75.210.45:7777。

# 用了代理IP地址之后,我们就可以进行相应程序的编写了、可以使用以下程序,实现 通过代理服务器来爬取网站内容。
# 实例如下
def use_proxy(proxy_addr, url):
import urllib.request
proxy = urllib.request.ProxyHandler({‘http‘: proxy_addr})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read().decode(‘utf-8‘)
return data


proxy_addr = "113.240.254.154:8080"
data = use_proxy(proxy_addr, "https://www.baidu.com")
print(len(data))


# 我们首先建立一个名为use_proxy的自定义函数,该函数主要实现使用代理服务器来爬取某个URL网页的功能。
# 在函数中,我们设置两个形参,第一个形参为代理服务器的地址,第二个形参代表要爬取的网页的地址。
# 然后,使用urllib.request.ProxyHandler()来设置对应的代理服务器信息,
# 设置格式为: urllib.request.ProxyHandler ( {‘http‘:代理服务器地址}),
# 接下来,使用 urllib.request.build_ opener()创建了一个自定义的opener对象,
# 其中第一个参数为代理信息,第二个参数为urllib. request.HTTPHandler类。
# 为了方便,可以使用urllib.request.install_opener()创建全局默认的opener对象,
# 那在使用urlopen()时亦会使用我们安装的opener对象,
# 所以我们下面才可以直接使用urllib. request.urlopen()打开对应网址爬取网页并读取,编码后赋给变量data,最后返回data的值给函数。
# 随后,在函数外设置好对应的代理IP地址,然后调用自定义函数use_proxy,并传递两 个实参,分别为使用的代理地址及要爬取的网址。
# 将函数的调用结果赋值给变量data,并输 出data内容的长度。当然,也可以将data的值写进某个文件当中存储起来。

# 执行下来就可以看到成功使用代理服务器爬取到了百度首页,并返回获取内容的大小。
# 如果 此时代理服务器地址失效或填写错了代理服务器,则会发生错误,
# 出现
# urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
#
# 其中还有另外一个错误的可能
# 如果出现以上错误除了找IP的问题还有就是http协议的问题
# 解决办法:
# 只是把协议改了一下就可以:
# ‘http’-》‘https’,
# 增加一点别的知识:
# https就是http和TCP之间有一层SSL层,
# 这一层的实际作用是防止钓鱼和加密。防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名。
# 另外是加密,加密需要一个密钥交换算法,双方通过交换后的密钥加解密。

以上是关于如何解决爬虫的IP地址受限问题的主要内容,如果未能解决你的问题,请参考以下文章

爬虫过程中如何有效的应对IP限制?

爬虫过程中如何有效的应对IP限制?

Eureka如何限制IP注册

如何应对网站反爬虫策略?如何高效地爬大量数据

Python Scrapy反爬虫常见解决方案(包含5种方法)

爬虫时IP被限制怎么解决?