Python爬虫实战:使用代理(urllib模块)
1. 前言
第二个方案是使用代理,代理就是“嘿,哥哥,弟弟我访问这个网址有点困难,帮忙解决一下呗”。
然后将 需要访问的网址告诉代理,代理替你访问,然后把看到的内容都转发给你,这就是代理的工作。因此服务器看到的是代理的IP地址,而不是你的IP地址
2. 使用代理
使用代理的步骤:
(1)proxy_support = urllib.request.ProxyHandler({})
参数是一个字典,字典的键时代理的类型,例如 http,ftp或https,字典的值就是代理的IP地址和对应的端口号
例如:
proxy = '58.240.53.196:8080'
proxy_support = urllib.request.ProxyHandler({'http':'http://'+proxy,
'https':'https://'+proxy})
注意:
这里代理前需要加上协议,即http或者https,当请求链接是http协议时,ProxyHandler会调用http代理,当请求链接是https协议时,会调用https代理
(2)opener = urllib.request.build_opener(proxy_support)
什么是opener?
opener 可以看做是一个私人订制,但是这个opener是可以定制的,例如,给它定制特殊的headers,或者给它定制指定的代理IP
这里可以使用build_opener()函数创建一个属于我们自己私人定制的opener
这样就相当于此opener已经设置好代理了,接下来可以直接调用opener对象的open() 方法,即可访问我们所想要的链接
此处不能使用urlopen()函数打开网页,需要使用open()函数打开网页才可
(3)urllib.request.install_opener(opener)
这里是将定制好的opener安装到系统中,是一个一劳永逸的做法
因为在此之后,你只要使用普通的urlopen()函数,就是以定制好的opener进行工作
当然如果你不想替换掉默认的opener,你也可以在每次特殊需要的时候,用opener.open()的方法来打开网页
3. 示例
- 简单示例
import urllib.request
url = 'http://ip.tool.chinaz.com/'
headers = {
'Host': "ip.tool.chinaz.com",
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
proxy_support = urllib.request.ProxyHandler({'http':'58.240.53.196:8080',
'https':'58.240.53.196:8080'})
# 接着创建一个包含代理IP的opener
opener = urllib.request.build_opener(proxy_support)
# 查看IP地址是否改变
response = opener.open(url)
html = response.read().decode('utf-8')
print(html)
使用urllib.request.install_opener(opener)
将定制好的opener安装到系统中,是一个一劳永逸的做法
import urllib.request
url = 'http://ip.tool.chinaz.com/'
headers = {
'Host': "ip.tool.chinaz.com",
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
proxy = '58.240.53.196:8080'
proxy_support = urllib.request.ProxyHandler({'http':'http://'+proxy,
'https':'https://'+proxy})
# 接着创建一个包含代理IP的openert
opener = urllib.request.build_opener(proxy_support)
# 安装进默认的环境
urllib.request.install_opener(opener)
# 查看IP地址是否改变
# response = opener.open(url)
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
- 通过设置一个inlist,多填写几个IP进去,每次随机使用一个IP来访问
import urllib.request
import random
url = 'http://ip.tool.chinaz.com/'
headers = {
'Host': "ip.tool.chinaz.com",
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
# 添加多个代理IP,多个IP地址之间使用英文的分号隔开
inlist = input("please enter: ").split(sep=';')
while True:
proxy = random.choice(inlist)
proxy_support = urllib.request.ProxyHandler({'http':'http://'+proxy,
'https':'https://'+proxy})
# 接着创建一个包含代理IP的openert
opener = urllib.request.build_opener(proxy_support)
try:
print("正在尝试使用%s 访问...." % proxy)
# 查看IP地址是否改变
response = opener.open(url,None,headers)
html = response.read().decode('utf-8')
print(html)
except urllib.error.URLError:
print("error!")
else:
print("success")
if input("Y/N") == 'N':
break
- 遇到需要认证的代理
proxy = 'username:[email protected]:8080'
这里只需要改变proxy变量,只需要加入代理认证的用户名密码即可。