爬虫---Handler处理器和自定义opener

1.自定义opener
(1)opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener。
但是基本的urlopen()方法不支持代理、cookie等其他的HTTP/HTTPS高级功能。所以要支持这些功能:

使用相关的 Handler处理器 来创建特定功能的处理器对象;
然后通过 urllib2.build_opener()方法使用这些处理器对象,创建自定义opener对象;
使用自定义的opener对象,调用open()方法发送请求。

如果程序里所有的请求都使用自定义的opener,可以使用urllib2.install_opener() 将自定义的 opener 对象 定义为 全局opener,表示如果之后凡是调用urlopen,都将使用这个opener(根据自己的需求来选择)。
(2)定义简单的opener

# -*- coding:utf-8 -*-

import urllib2

# 构建一个HttpHandler处理器对象,支持处理Http请求

# http_Handler = urllib2.HTTPHandler()
# 在HTTPHandler增加参数‘debuglevel=1’,将自动打开debug log模式
# 程序在执行的时候会打印收发包的信息
http_Handler = urllib2.HTTPHandler(debuglevel=1)

# 调用build_opener()方法构建一个自定义的opener对象,参数是构建的处理器对象
opener = urllib2.build_opener(http_Handler)

request = urllib2.Request('http://www.baidu.com/')
response = opener.open(request)

print(response.read())

2.proxyHandler处理器(代理设置)

# -*- coding:utf-8 -*-

import urllib2
import random

proxy_list = [
    {'http':'122.224.227.202:3128'},
    {'http':'14.118.206.52:9797'},
    {'http':'222.186.45.121:52163'},
    {'http':'121.227.11.160:888'},
    {'http':'218.20.54.53:9797 '},
    {'http':'112.95.35.85:9797'},
]
# 随机选一个代理
proxy = random.choice(proxy_list)

# 代理开关,表示是否使用代理
proxyswitch = True

# 构建一个Handler处理器对象,参数是一个字典类型,包括代理类型和代理服务器IP+PORT
httpproxy_handler = urllib2.ProxyHandler(proxy)

# 构建了一个没有代理的处理器对象
nullproxy_handler = urllib2.ProxyHandler({})

if proxyswitch:
    opener = urllib2.build_opener(httpproxy_handler)
else:
    opener = urllib2.build_opener(nullproxy_handler)

# 构建了一个全局的opener,之后所有的请求都可以使用urlopen()方式去发送,也附带Handler的功能
urllib2.install_opener(opener)

request = urllib2.Request('http://www.baidu.com/')
response = urllib2.urlopen(request)
print(response.read())

3.cookielib库 和 HTTPCookieProcessor处理器

# -*- coding:utf-8 -*-
# cookie登录

import urllib
import urllib2
import cookielib

# 通过cookieJar()类构建一个cookieJar()对象,用来保持cookie的值
cookie = cookielib.CookieJar()

# 通过HTTPCookieProcessor()处理器类构建一个处理器对象,用来处理cookie
# 参数就是构建的cookieJar()对象
cookie_handler = urllib2.HTTPCookieProcessor(cookie)

opener = urllib2.build_opener(cookie_handler)

# 自定义opener的addheaders的参数,可以赋值HTTP报头参数
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')]
# 人人网的登录接口
url = 'http://www.renren.com/PLogin.do'

# 需要登录的账户密码
data = {'email':'xxxxxx', 'password':'xxxxxxx'}

# 通过urlencode()编码转换
data = urllib.urlencode(data)

request = urllib2.Request(url, data=data)

response = opener.open(request)

print(response.read())

猜你喜欢

转载自blog.csdn.net/jian15093532273/article/details/80457229