写爬虫是一个攻防战,爬、反爬、反反爬、反反反爬……斗智斗勇,可是无论是JavaScript加密算法还是app逆向,都是在客户端因此都是有可解决的渠道的,可是封IP就不一样了,封IP相当于是直接把客户端禁止访问服务器了,因此,代理是必不可少的,在爬虫的时候,不应当只有被封IP的时候才用代理, 在爬虫的初始时刻,我们就应该想到这一关联,使用代理,代理一般有开放代理,独享代理,私密代理,隧道代理等。
隧道代理:
- 基于高性能主机构建的动态IP代理服务器,通过将换IP操作放到云端
- 用户无须更换IP,隧道代理会将请求转发到不同的代理IP,转发周期可按需指定
- 隧道代理同时支持HTTP/HTTPS和Socks协议,并采用弹性并发数控制
代理IP的匿名度 透明代理:目标服务器知道我们本次请求使用了代理IP,而且知道我们自己个人的当前IP地址 匿名代理:目标服务器知道我们本次请求使用了代理IP,但不会知道我们自己个人的当前IP地址 高匿名:目标服务器不知道我们本次请求使用了代理IP,也不会知道我们自己个人的当前IP地址
使用模板
def proxyPool(url: str = None, payload: dict = None) -> Optional[Response]:
"""
构建IP代理池,作为拓展使用
:param url 要爬取的网页
:param payload post请求参数
:return: None
"""
if payload is None:
payload = {}
ip = ""
port = ""
ip_port = ip + ":" + port
proxy = {
"http": "http://" + ip_port,
"https": "https://" + ip_port
}
username = ""
password = ""
auth = base64.b64encode((username + ":" + password).encode('utf-8'))
headers = {
"Proxy-Authorization": auth,
"Accept-Encoding": gzip,
}
try:
resp = requests.post(url=url, headers=headers, json=payload,
proxies=proxy, verify=False, allow_redirects=False, timeout=10)
if resp.status_code != 200:
return proxyPool(url, payload)
else:
return resp
except Exception as e:
print(e)
return proxyPool(url, payload)
|