这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
使用代理是对抗反爬虫机制的常用做法。很多网站会检测某一段时间某个外来 IP 地址对服务器的访问次数等信息。如果访问次数或方式不符合安全策略,就会禁止该外来 IP 对服务器的访问。所以,爬虫设计者可以用一些代理服务器,使自己真实 IP 地址被隐藏,免于被禁止。
urllib 中使用 ProxyHandler 来设置代理服务器的使用
网络上通常有两类代理:免费代理、收费代理。免费代理可以通过百度/Google 搜索,或从以下网站查找:西刺免费代理IP、快代理免费代理、Proxy360代理、全网代理IP …
- 免费开放代理一般会有好多人在使用,而且代理有寿命短、速度慢、匿名度不高、HTTP/HTTPS支持不稳定等缺点(正所谓,免费没好货)
- 专业爬虫工程师或爬虫公司会使用高质量的私密代理,这些代理通常要找专门的代理供应商购买,再通过用户名/密码授权使用(正所谓,舍不得孩子套不到狼)
可以组织一个代理列表,在一定时间策略下,随机使用,免于被 server 禁止访问。
# 使用代理
# demo 1 :使用 ProxyHandler 通过指定一个免费代理访问目标网站
import urllib.request
request = urllib.request.Request('http://www.baidu.com')
# 例子里是找的免费代理,说不准什么时候就失效了
proxy_support = urllib.request.ProxyHandler({'http':'210.1.58.212:8080'})
opener = urllib.request.build_opener(proxy_support)
response = opener.open(request)
print(response.read().decode('utf-8'))
# 使用代理
# demo 2 :使用有身份认证的代理
import urllib.request
# 这里的用户名和密码以及代理都是瞎填的,用的时候自行换能用的用
# 流程就是这么个流程,办法就是这么个办法。理解万岁。
username = 'leo'
password = 'leo'
proxydict = {'http':'106.185.26.199:25'}
proxydict['http'] = username + ':' + password + '@' + proxydict['http']
httpWithProxyHandler = urllib.request.ProxyHandler(proxydict)
opener = urllib.request.build_opener(httpWithProxyHandler)
request = urllib.request.Request('http://www.baidu.com')
resp = opener.open(request)
print(resp.read().decode('utf-8'))
# 使用代理
# demo 3 :使用 urllib 推荐的做法改进上述过程
username = 'leo'
password = 'leo'
proxyserver = {'106.185.26.199:25'}
# 1. 构建一个密码管理对象,用来保存需要处理的用户名和密码
passwordMgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
# 2. 添加用户信息,第一个参数 realm 是与远程服务器相关的域的信息,默认为None,可通过 response 头查看
# 后面的三个参数分别为:代理服务器,用户名,密码
passwordMgr.add_password(None, proxyserver, username, password)
# 3. 构建一个代理基础用户名/密码验证的 Handler 对象,参数为密码管理对象
proxyauth_handler = urllib.request.ProxyBasicAuthHandler(passwordMgr)
# 4. 通过 build_opener() 定义 opener 对象
opener = urllib.request.build_opener(proxyauth_handler)
# 5. 构造请求 request
request = urllib.request.Request('http://www.baidu.com')
# 6. 使用自定义 opener 发送请求
response = opener.open(request)
# 7. 打印响应内容
print(response.read().decode('utf-8'))
# 使用代理
# demo 4 :使用从 http://www.goubanjia.com/,www.kuaidaili.com/dps 获取的代理列表
# 可以使用快代理在线测试代理可行性
import random
# 10月18日 从快代理网站上找的免费代理。
proxylist = [
{'http':'210.1.58.212:8080'},
{'http':'106.185.26.199:25'},
{'http':'124.206.192.210:38621'},
{'http':'222.249.224.61:48114'},
{'http':'115.218.217.184:9000'},
{'http':'183.129.244.17:10010'},
{'http':'120.26.199.103:8118'},
]
def randomTryProxy(retry):
''' Function : choose a proxy from the proxy list RANDOMLY! retry : number of retry '''
# 策略 1 随机选
try:
proxy = random.choice(proxylist)
print('Try %s : %s' %(retry, proxy))
httpProxyHandler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(httpProxyHandler)
request = urllib.request.Request('http://www.baidu.com')
response = opener.open(request,timeout = 5)
print('Worked !')
except:
print('Connect error:Please retry')
if retry > 0:
randomTryProxy(retry-1)
def inorderTryProxy(proxy):
''' Function : choose a proxy from the proxy list RANDOMLY! retry : index of proxy '''
# 策略 2 :依次尝试选择
try:
print('Try %s ' %(proxy))
httpProxyHandler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(httpProxyHandler)
request = urllib.request.Request('http://www.baidu.com')
response = opener.open(request,timeout = 5)
print('Worked !')
except:
print('Connect error:Please retry')
if __name__ == '__main__':
# 随机筛选适合代理列表中大部分能用的情况
randomTryProxy(5)
print('--'*20)
# 依次尝试适合代理列表中大部分不可用的情况
for p in proxylist:
inorderTryProxy(p)
运行结果:
Try 5 : {'http': '115.218.217.184:9000'}
Connect error:Please retry
Try 4 : {'http': '115.218.217.184:9000'}
Connect error:Please retry
Try 3 : {'http': '222.249.224.61:48114'}
Connect error:Please retry
Try 2 : {'http': '210.1.58.212:8080'}
Worked !
----------------------------------------
Try {'http': '210.1.58.212:8080'}
Worked !
Try {'http': '106.185.26.199:25'}
Connect error:Please retry
Try {'http': '124.206.192.210:38621'}
Connect error:Please retry
Try {'http': '222.249.224.61:48114'}
Connect error:Please retry
Try {'http': '115.218.217.184:9000'}
Connect error:Please retry
Try {'http': '183.129.244.17:10010'}
Connect error:Please retry
Try {'http': '120.26.199.103:8118'}
Connect error:Please retry
今天的文章Python爬虫笔记:使用代理防止本机 IP 被封分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22768.html