在Python 2版本中,有urllib和urlib2两个模块可以用来实现request的发送。而在Python 3中,已经不存在urllib2这个模块了,统一为urllib。urllib模块有如下4个子模块。
(1)urllib. request:可以用来发送request和获取request的结果。
(2)urllib. error:包含了urllib.request产生的异常。
(3)urllib. parse:用来解析和处理URL。
(4)urllib. robotparse:用来解析页面的robots.txt文件。
下面来感受一下urllib的强大之处,以http://httpbin.org/anything为例,将这个网页抓取下来。
【范例2.1-1】urllib的使用(源码路径:ch02/2.1/2.1-1.py)
范例文件2.1-1.py的具体实现代码如下。
【运行结果】
【范例分析】
(1)http://httpbin. org/是一个HTTP的测试工具,http://httpbin.org/anything是返回的这一次的请求信息。
(2)urllib. request.urlopen打开一个URL,也就是发送请求,默认的请求信息如运行结果所示,这里需要注意的是,User-Agent的值默认为Python-urllib/3.5,在爬虫时这样会让对方知道这次请求是一个Python程序,可能会被封禁,所以后续需要指定User-Agent的值为真实浏览器的User-Agent。
(3)urllib. request.urlopen的返回值是一个响应对象response,可以通过read()方法获取响应的所有字节。另外,response还可以获取关于响应的一些其他信息,如响应码status、响应头信息headers。
再来看一个例子,抓取指定关键词的百度贴吧的HTML内容。
【范例2.1-2】爬百度贴吧(源码路径:ch02/2.1/2.1-2.py)
范例文件2.1-2.py的具体实现代码如下。
【运行结果】
【范例分析】
(1)中文在这里需要urllib.parse.urlencode进行URL编码。
(2)request=urllib. request.Request(newurl, headers=headers)表示构造了一个Request的对象,参数有url和headers, headers只设置了一个User-Agent,是为了伪装浏览器的身份。
(3)urllib. request.urlopen表示打开request,发送请求。
(4)response. read().decode('utf-8')表示获取响应内容并解码。
提示
urllib还有很多功能,这里不做过多讲解,直接使用更高级的requests模块。
通过上面的两个案例,已经了解了urllib模块的强大,但是它也有一个缺点,就是代码相对烦琐。能否简化呢?那就需要使用下面讲解的requests模块。