爬虫和反爬虫的对抗并不激烈。今天我们主要讨论一个非常重要的对付反爬虫的手段,那就是IP代理。
通常,我们会访问如下网址:
动态IP模拟器
当客户端向URL所在的服务器发起请求时,会携带自己的IP地址,这样服务器就可以获得我们的IP地址。当这个IP地址在某段时间内过于频繁地发起请求时,它可能会在某段时间内限制其访问。
在编写爬虫程序的过程中,为了防止这种情况发生,有必要使用IP代理。IP代理的原理如下:
第一步:我们将向代理服务器发送请求,并告诉代理服务器我们想要访问https://www.zhihu.com。
第二步:代理服务器将代替我们向https://www.zhihu.com发送请求。
第三步:服务器收到代理服务器的请求后,将数据返回给代理服务器。
第四步:代理服务器收到服务器返回的数据后,将数据发送给客户端。
这样,通过代理服务器向网址所在的服务器发送请求,我们就可以完美地隐藏自己的IP,这样我们的IP就不会被限制访问。
不过,肯定会有代价的。我们需要通过IP代理转发我们想要的数据,这自然会导致爬行速度变慢。只有使用原生IP发起请求是最快的。
接下来,像往常一样,我们使用代码来演示如何通过IP代理发起请求:
导入请求
#自由代理可以从https://www.xicidaili.com/,获得,但自由ip代理的存活率很低。
代理= { 0
http:“”183 . 148 . 158 . 64:9999
}
RES = requests . get(' https://www . Baidu . com ',proxies = proxy)
打印(参考文本)
#如果可以正确返回结果,那么当前的ip代理是活动的、可用的,否则当前的ip代理无效。
仅有一个代理ip是不够的。我们应该维护自己的ip代理池。当ip代理失败时,它将被消除。那么如何维护一个可用的ip代理池呢?
#第一步:通过https://www.xicidaili.com/wt/.获取ip_list
导入请求
来自bs4导入美丽组
随机导入
def get_ip_list(url):
标题= { 0
用户代理“:”Mozilla/5.0(Windows NT 10.0;WOW64)applebwebkit/537.36(KHTML,像Gecko)Chrome/66 . 0 . 3359 . 139 Safari/537.36’
}
res = requests.get(url,headers = headers)
res =美化组(res.text,' html.parser ')
结果= RES . select(# IP _ list tr)
对于结果[1:]中的结果:
ip = result.select('td')[1]。文本
port = result.select('td')[2]。文本
法官(ip,端口)
#获取ip后,无法直接保存。首先,你应该判断它是否可用。
#第二步:确定获取的ip是否有效。
ip_list = []
def判断(ip、端口):
代理= { ' http ':IP+':'+端口}
尝试:
RES = requests . get(' https://www . Baidu . com ',proxies = proxy)
例外:
打印(此IP:“+IP+”无效)
返回False
否则:
if 200