熟悉python的人都知道为了python的正常请求,维持数据的稳定获取,都会用到代理IP。代理IP不仅可以用来规避IP在单位时间的请求次数,还可以借助代理来隐藏真实的IP,避免出现“IP请求过于频繁”,“403”等报错。今天就带大家简单了解一下Python代理IP的使用和代理池怎么设置。
一、什么是代理
代理一般指的是代理服务器Proxy Server,它的作用就是代理网络用户获取信息。就像是一个请求的中转站,代理服务器就是请求端与目标网站之间的一个中转。使用代理之后将不是直接请求目标网站,用户的Request信号会先送到代理服务器,由代理服务器来取回所需要的信息并传送给用户。此时的被请求的目标网站所识别的IP就不是用户真实的本地IP,而是代理IP地址。这就是代理的基本原理。
二、代理的作用
1、突破自身IP访问限制访问其他不能访问的站点。
2、访问一些单位或团体的内部资源,比如教育网的FTP资源。
3、提高访问速度。代理服务器通常有一个较大的硬盘缓冲区,请求信息通过后将会保存在缓冲区内。如果其他的用户访问相同的信息,这时返回的内容将从缓冲区直接返回,提高访问速度。
4、隐藏真实IP,可以利用代理服务器隐藏自己的真实IP信息。
三、 Python requests如何使用代理
python的requests请求设置代理只需要传递一个参数:proxies即可
import requests
proxies = {
'http':'http://ip:port',
'https':'http://ip:port',
}
res = requests.get("https://ipinfo.io/",proxies = proxies)
print(res.json())
返回内容如下
{
"ip": "203.160.80.166",
"city": "Hong Kong",
"region": "Central and Western",
"country": "HK",
"loc": "22.2783,114.1747",
"org": "AS10099 China Unicom Global",
"timezone": "Asia/Hong_Kong",
"readme": "https://ipinfo.io/missingauth"
}
四、代理池的设置
代理池就是将代理服务器的IP存储到临时数据库中,实现随用随取。既可以将免费的代理网站的IP及时存进去,也可以避免了收费代理api的请求限制。
1.如何设计代理池
代理池一般分为三个部分:收集代理,存储代理和使用代理,从收集到存储或者是从存储到使用,期间可以对使用的代理做检测,本文暂不提及。
收集代理:就是指从指定的目标源获取到代理服务器的IP之后存到历史数据库。
存储代理:负责存储从目标网站的代理服务器IP,通常使用redis。
使用代理:直接从临时数据库获取提取过来的IP或者以接口的形式返回。
2.收集和存储代理
本次使用的是redis的列表(List)对代理进行存储,当然对去重有要求的话可以使用redis的有序集合(sorted set)
在redis数据库中建立一个叫做“Proxy”的list,将获取到的IP进行存储:
import requests
import redis
redisHost = '127.0.0.1'
redisPort = 6379
redisPool = redis.ConnectionPool(host=redisHost, port=redisPort, password='', db=1)
redisCon = redis.Redis(connection_pool=redisPool)
def get_IP():
IpApi = "url"
res = requests.get(IpApi).json()["data"]
for ip in res:
ipInfo = f"http://{ip['ip']}:{ip['port']}"
redisCon.rpush("Proxy",ipInfo)
if __name__ == '__main__':
get_IP()
这里使用的是ipidea的代理api,将获取的服务器地址存入了redis的列表中:
3.使用代理
使用代理的话就从redis的Proxy队列,使用redis的pop方法取到服务器IP:
def GetIpFromRedis():
serverIp = redisCon.lpop("Proxy")
print(serverIp.decode())
4.可持续化代理池
为了保证代理池的IP量位置在某一水平,可以使用redis中的llen方法对队列的长度进行检测。使用while循环,如果IP量低于一定的阈值就获取代理地址并存储,否则就跳过本次while循环:
def get_IP():
while True:
if redisCon.llen("Proxy") < 100:
IpApi = "url"
res = requests.get(IpApi).json()["data"]
for ip in res:
ipInfo = f"http://{ip['ip']}:{ip['port']}"
redisCon.rpush("Proxy",ipInfo)
else:
pass
五、总结
在互联网不断发展,信息数据庞大的今天,python已经取代了过去传统的依靠人力搜集信息的方式,成为了目前最为主流的数据获取方法。使用代理IP并不是抓取数据的唯一方法,但它为python带来了诸多好处,是python最可靠的选择。