每日学点python之十六(各种处理器使用)

为啥我们要用处理器(Handler)呢?

        引用网友的一句话,说的蛮有道理的。urlopen()方法比作一间工厂(默认情况下它有自己的一套流程),opener就是工厂的大门,Handler就是工厂里的苦力(负责了绝大部分工作). 如果urlopen()能满足需求的话自然皆大欢喜,但是一些需要更多参数的网站比如,要你提供账号密码的或者支持代理等,就需要定制Handler。

HTTPHandler()处理器:

#!/usr/bin/python
# -*-coding:utf-8-*-

import urllib2
http_handler = urllib2.HTTPHandler(debuglevel=1)
# 通过 urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener对象
opener = urllib2.build_opener(http_handler)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"}
request = urllib2.Request("http://www.baidu.com/", headers=headers)
# 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。
response = opener.open(request)
# 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
# urllib2.install_opener(opener)
# response = urlopen(request)
print response.read()

       如果在 HTTPHandler()增加 debuglevel=1参数,还会将 Debug Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。也可以不加参数,和使用urllib2.urlopen()发送HTTP/HTTPS请求得到的结果是一样的。

ProxyHandler处理器(代理设置):

使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。那我就可以通过ProxyHandler来设置使用代理服务器。

#!/usr/bin/python
# -*-coding:utf-8-*-

import urllib2

# 构建了两个代理Handler,一个有代理IP,一个没有代理IP
httpproxy = urllib2.ProxyHandler({"http": "222.221.11.119:3128"})
nullproxy = urllib2.ProxyHandler({})
http_handler = urllib2.HTTPHandler(debuglevel=1)
proxySwitch = True  # 定义一个代理开关

# 通过 urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener对象
# 根据代理开关是否打开,使用不同的代理模式
if proxySwitch:
    opener = urllib2.build_opener(httpproxy, http_handler)
else:
    opener = urllib2.build_opener(nullproxy, http_handler)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"}
request = urllib2.Request("http://www.baidu.com/", headers=headers)
response = opener.open(request)
print response.read()

免费的代理网站举例:

       我们一次可以使用多个Handler处理器,是不是很方便。当然如果光用这个一个代理IP去爬的话,我感觉也不是很好,太不稳定了。不知道啥时候就被封了。如果代理IP足够多,就可以像随机获取User-Agent一样,随机选择一个代理去访问网站。

#!/usr/bin/python
# -*-coding:utf-8-*-

import urllib2
import random

proxy_list = [
    {"http" : "124.66.67.81:80"},
    {"http" : "192.88.67.81:80"}
]
# 随机选择一个代理
proxy = random.choice(proxy_list)
# 使用选择的代理构建代理处理器对象
httpproxy_handler = urllib2.ProxyHandler(proxy)
opener = urllib2.build_opener(httpproxy_handler)
request = urllib2.Request("http://www.baidu.com/")
response = opener.open(request)
print response.read()

  常言到“免费没好货”,一般专业的爬虫工程师会使用高品质的私密代理。

#在系统的配置文件里添加
user= “SongQiang”
export user
#生效
source 
#eg:
import os
name =os.environ.get(“user”)
print name

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib2
import os
# 获取系统环境变量的授权代理的账户和密码
user = os.environ.get("user")
proxypasswd = os.environ.get("proxypasswd")
# 授权的代理账户密码拼接
authproxy_handler = urllib2.ProxyHandler({"http" : user+":"+proxypasswd+"@114.215.104.49:16816"})
# 构建一个自定义的opener
opener = urllib2.build_opener(authproxy_handler)
# 构建请求
request = urllib2.Request("http://www.baidu.com/")
# 获取响应
response = opener.open(request)
# 打印内容
print response.read()

   直接把账户和密码写在程序里也可以,这样感觉不是很安全。

 cookielib库 和 HTTPCookieProcessor处理器:

简单介绍一下Cookie:
       Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。也就是说,下次登录不用输账户和密码。

cookielib 库:

       该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

  • CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

  • FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

  • MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

  • LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。

   其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()

   网上好多爬的都是人人网,咱们也爬一个,哈哈。

#!/usr/bin/env python
#-*- coding:utf8 -*-

##
# @file cookie_handler.py
# @brief 
# @author SongQiang
# @version 1.0
# @date 2019-01-15

import urllib2
import cookielib
import urllib
import os
#构建一个Cookielib对象实例来保存cookie
cookiejar=cookielib.CookieJar()
#使用HTTPCookieProcessor()来创建cookie处理器对象,参数为cookiejar中
handler=urllib2.HTTPCookieProcessor(cookiejar)
#通过build_opener()来构建opener
user=os.environ.get("user")
passwd=os.environ.get("passwd")
opener=urllib2.build_opener(handler)
#以get方法访问页面,访问之后会自动保存cookie到cookiejar中
#addheaders 接受一个列表,里面每个元素都是一个headers信息的元祖, opener将附带headers信息
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36")]
#需要登录的账户和密码
data = {"email":user, "password":passwd}  
#通过urlencode()转码
postdata = urllib.urlencode(data)
#构建Request请求对象,包含需要发送的用户名和密码
request = urllib2.Request("http://www.renren.com/PLogin.do", data = postdata)
#通过opener发送这个请求,并获取登录后的Cookie值,
opener.open(request)                                              
#opener包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = opener.open("http://www.renren.com/470969401/")  
#打印响应内容
print response.read()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值