python2内置的urllib2库,对于做网络爬虫有非常强大的功能,主要用在发送http请求,伪造头信息等方面。而urllib一般与之搭配着用,主要用于进行url解码和编码,通俗讲也就是将浏览器地址栏里面出现的中文转换为url编码再发送出去,以便服务器能识别。

导入包

import urllib
import urllib2

第一步,我们要构造基本请求,获得一个request的对象。

# GET请求
request = urllib2.Request(url,headers=headers)
# POST请求
request = urllib2.Request(url,data=data,headers=headers)

上面提到的几个参数分别是:

# url是请求的地址
url = 'http://www.baidu.com'

# headers代表头信息,也就是发送方的配置信息和发送方的要求,最具有代表性的就是浏览器代理名称。
headers = {"User-Agent" : "Mozilla/5.0...",}

# data就是post请求中发送给服务器的表单数据
data = {"email":"xxx","pswd":"xxx"}

# 使用urlencode将服务器不能识别的字符转换为url编码
postdata = urllib.urlencode(data) #  编码
             urllib.unquote(data)   # 解码

对于一个已经构建好的request对象,我们可以修改其头部信息。

request.add_header("Connection", "keep-alive")
request.get_header("User-agent") # 第一个字母大写,后面的全部小写

参数也设置好了,请求也构造好了,现在通过urlopen发送这个请求,请求成功后,会返回一个response对象附带请求到的数据。

response = urllib2.urlopen(request)

使用response.read()即可读取到接收到的数据。

使用response.code可以查看请求代码。

html = response.read()
request_status_code = response.code

基础的http请求有时候无法满足我们的要求,例如有时候我们需要处理cookie,有时候需要使用代理。

这时候,可以对urllib2进阶使用,构造 处理器对象(http_handler)。

三步走:

1. 处理器对象的用法与刚刚我们介绍的基础用法并没有太大的差异,不一样的地方只是多了一个自定义功能的步骤。

# 分别构建http和https处理器对象
http_handler = urllib2.HTTPHandler()
https_handler = urllib2.HTTPSHandler()

# 构建http处理器对象,但是设置了【开启debug信息】,本质上还是一样的,只是会把请求调试信息全部显示出来。
http_handler = urllib2.HTTPHandler(debuglevel=1)

# 构建可以使用代理的http处理器对象。下面分别是两种不同的代理使用方式(公开代理和私密代理)。
httpproxy_handler = urllib2.ProxyHandler({"http":"a.b.c.d:p"})
httpproxy_handler = urllib2.ProxyHandler({"http":"un:pw@a.b.c.d:p"})
# 当然这个处理器也可以不设置代理
nullproxy_handler = urllib2.ProxyHandler()

# 构建保存cookie信息的代理,需要导入cookielib包。
import cookielib
cookiejar = cookielib.CookieJar()
cookie_handler = handler.HTTPCookoeProcessor(cookiejar)

2. 构造完处理器,使用build_opener生成opener后就可以像基础方法一样发送http请求了。

opener = urllib2.build_opener(httpxxx_handler)
opener.addheaders = [("User-Agent","Mozilla..."),("Accept","xxx")...] # 给opener设置请求头

3. 实际上我们可以把处理器对象看作不同功能的http请求器,构造好处理器对象,构造好请求,就可以发送请求了。

request = urllib2.Request(url,data=data,headers=headers)
response = opener.open(request)

有的网站没有申请官方的ssl安全证书,urllib2会提出警告,使用如下语句就可以忽略警告。

import ssl
context = ssl._create_unverified_context()
response = urllib2.urlopen(request,context=context)

还有一种情况,访问某些网站的时候服务器需要验证我们的身份,这个时候需要在弹框内填写账号密码,可以构建密码管理器对象进行自动访问。

# 构建密码管理器对象
1. passwdmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
2. passwdmgr.add_password(None, proxyserver, user, passwd)
-->3. proxyauth_handle = urllib2.ProxyBasicAuthHandler(passwdmgr) 代理验证
-->3. httpauth_handler = urllib2.HTTPBasicAuthHandler(passwdmgr)  web验证
4. opener = urllib2.build_opener(proxyauth_handle)