基本使用
代理小知识
【高匿】:代表服务器追踪不到你原来的IP;
【透明】:代表服务器可以追踪到你的代理IP和原来的IP;
【普通匿名】:隐藏客户机真实IP,会改变我们的请求信息,服务器会认为我们使用代理
类型表示支持的类型:HTTP或者HTTPS
【存活的时间】:表示在这个期间可用
很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问的次数多得不像正常人,它会禁止这个IP的访问。
所以我们可以设置一些代理服务器,每个一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
1.代理的原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。
2.请求:http://httpbin.org 这个网站可以方便的查看HTTP请求的一些参数。
3.urllib中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:
-
使用
urllib.request.ProxyHandler
,传入一个代理,这个代理是一个字典,字典的key依赖于代理服务器能够接收的类型,一般是http
或者https
,值是ip:port
。 -
使用上一步创建的
handler
,以及request.bulid_opener
创建一个opener
对象。 -
使用上一步创建的
opener
,调用open
函数,发起请求。
from urllib import request
# 代码上如何使用代理
# 构建免费代理
# 免费代理
proxy = {
'http' : 'http://122.72.18.34:80',
'https' : 'http://122.72.18.34:80',
}
# 认证代理
auth_proxy = {
'http': 'http://alice:123456@120.78.166.84:6666',
'https': 'http://alice:123456@120.78.166.84:6666',
}
proxy_handler = request.ProxyHandler(auth_proxy) # 传入一个代理
opener = request.build_opener(proxy_handler)
response = opener.open('http://www.baidu.com/s?wd=ip')
print(response)
print(response.read().decode('utf-8'))
随机获取代理
from urllib import request
import random
import re
proxies = [
{
'http' : 'http://60.255.186.169:8888',
'https' : 'http://60.255.186.169:8888',
},
{
'http': 'http://alice:123456@120.78.166.84:6666',
'https': 'http://alice:123456@120.78.166.84:6666',
}
]
def getOpener():
proxy = random.choice(proxies)
proxy_handler = request.ProxyHandler(proxy)
opener = request.build_opener(proxy_handler)
return opener
base_url = 'http://www.baidu.com/s?wd=ip'
for i in range(1,10):
opener = getOpener()
try:
response = opener.open(base_url,timeout=10)
html = response.read().decode('utf-8')
ip_pat = re.compile(r'c-gap-right">(.*?)</span>')
res = ip_pat.search(html)
if res is not None:
print(res.group(1))
except Exception as e:
print(e)