网络爬虫之IP封禁解决以及搭建代理IP池

引言:之前就提到过常见的反爬虫机制就有IP封禁,就是当你访问频率超过一个阀值服务器就会拒绝服务。这时网页就会提示“您的IP访问频率太高”,或者跳出一个验证码让我们输入,之后才能解封,但是一会后又会出现这种情况。这时我们就可以通过代理IP来进行请求就可以完美解决这个问题。但是通常各大网站上提供的代理IP可用率都不高,我们就需要搭建自己的IP池来反复筛选剔除不可用的IP。除了这种搭建IP池的方式也还有付费代理或者ADSL混淆拨号。但是成本太高这里就介绍第一种方式。

首先先介绍一下代理设置的方法:

测试网站是:http://httpbin.org/get,我们可以根据他返回的origin字段判断代理是否设置成功。在此之前你需要在代理IP网站上找一个可用的代理IP用来测试。

import requests

proxy = ‘198.50.163.192'
proxies = {
    'http':'http://'+ip,
    'https':'https://'+ip
}
url = 'http://www.httpbin.org/get'

try:
    response = requests.get(url=url,proxies=proxies)
    print(response.text)
except requests.exceptions.ConnectionError as e:
    print('Error',e.args)

结果如下:

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Cache-Control": "max-age=259200", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-607afb83-4447c22c3cf70d892063860f"
  }, 
  "origin": "198.50.163.192", 
  "url": "http://www.httpbin.org/get"
}

可见origin字端对应的值就是刚刚我们设置的IP,但是这样手动设置明显是不好的,如果我们能动态获取IP就完美了。

这里我动态实现了一个IP池用来获取各大代理IP网站上的免费代理IP并对其自动进行测试筛选。

准备工作:确保成功安装Redis数据库并启动服务,另外还需要安装aiohttp,redis-py,pyquery,Flask库

这里提供一个超好用的开源IP代理池ProxyPool

ProxyPool下载地址:

https://github.com/Python3WebSpider/ProxyPool.git

1.ProxyPool的使用:

首先使用 git clone 将源代码拉到你本地,

2.进入proxypool目录,修改settings.py文件,PASSWORD为Redis密码,如果为空,则设置为None。(新装的redis一般没有密码。),如果不是运行在LInux系统上就需要设置REDIS_HOST也就是你的主机IP地址。端口好默认为6379。

3.开启redis服务,并关闭防火墙(如果直接运行到本地可以无视)

4.直接运行run.py 不能退出,一直让它运行!!!

5.浏览器输入http://0.0.0.0:5555/random即可随机获取一个可用的代理IP 或者(http://localhost:5555/random)

下面我们用代理IP池进行测试:

import requests

PRO_POOL_URL = 'http://localhost:5555/random'
url = 'http://httpbin.org/get'

def get_proxy(): #定义一个获取代理IP的函数
    try:
        response = requests.get(url=PRO_POOL_URL)
        if response.status_code == 200:
            return response.text
    except ConnectionError:
        return None
proxy = get_proxy()
print(proxy) #输出一下所获得的代理IP
proxies_http = {
   'http':'http://'+proxy,
}
proxies_https={
   'https':'https://'+proxy,
}

if url.split(':')[0] == 'http':
    response = requests.get(url=url,proxies=proxies_http).text
    print(response)
else:
    response = requests.get(url=url,proxies=proxies_https).text
    print(response)

结果如下:

144.217.101.245:3129
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Cache-Control": "max-age=259200", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-607b0182-5da37f946cf8ee9021f389ee"
  }, 
  "origin": "144.217.101.245", ###
  "url": "http://httpbin.org/get"
}

origin字端返回的是从http://localhost:5555/random随机获取的IP证明伪装IP成功了,这时再对网站进行高频爬取就不会被封IP了。IP封禁就解决了。但是如果需要更高效的爬取还是用付费代理或者ADSL拨号吧,花钱的毕竟更稳定更快。

原文地址:https://www.cnblogs.com/Pynu/p/14672558.html