爬虫库中的urllib.request.urlopen 可以创建一个opener,但他是特殊的opener,是模块自动帮我们创建好的
为什么要自定义一个Opener呢?
urlopen() 方法不支持 代理、 Cookie、 和其他的http/https等的高级功能
代理:如果一直用一台电脑去访问某个网页,IP地址是一样的,服务器会捕获这个消息,阻挡你的访问;但添加代理后可以使用其他的IP地址来访问这个网页,没有办法通过IP地址追踪。
要支持更高级的打开功能,就要自定义一个Opener
创建方式:
from urllib import request
#构建HTTP处理器对象(专门处理HTTP请求的对象)
http_hander = request.HTTPHandler()
#创建一个自定义Opener对象
opener = request.build_opener(http_hander)
#把自定义的opener设置为全局,这样用urlopen发送的请求也会使用自定义的opener
request.install_opener(opener)
header = {
'user-Agent':'Mozilla/5.0 (Linux;\
U; Android 8.1.0; zh-cn; BLA-AL00 \
Build/HUAWEIBLA-AL00) AppleWebKit/537.36 \
(KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 \
MQQBrowser/8.9 Mobile Safari/537.36'
}
#创建自定义请求对象
REQ = request.Request('http://www.baidu.com', headers=header)
#此时使用的是自定义的全局的opener
reponse = request.urlopen(REQ).read()
print(reponse)
反爬虫机制:
1.userAgent;
2.根据IP地址
代理
免费代理IP地址:西刺代理
from urllib import request
import random
# proxyList = [{"http":"ip地址:端口号"}]
# 117.88.177.101:3000
proxyList = [{"http":"117.88.177.101:3000"},{……}]
proxy = random.choice(proxyList)
#创建代理对象
proxyHandler = request.ProxyHandler(proxy)
#创建自定义的opener对象
opener = request.build_opener(proxyHandler)
#创建请求对象
req = request.Request("http://www.google.cn")
#打开并阅读
res = opener.open(req).read()
print(res)
步骤
1、使用相关的 Handler处理器 来创建特定功能的处理器对象;
2、通过 request.build_opener()方法使用这些处理器对象,创建自定义opener对象;
3、使用自定义的opener对象,调用open()方法发送请求。
注意
如果程序里所有的请求都使用自定义的opener,可以使用request.install_opener() 将自定义的 opener 对象 定义为 全局opener,表示如果之后凡是调用urlopen,都将使用这个opener