基本库的使用-urllib

urllib库,是python内置的HTTP请求库

它包含四个模块:

request:最基本的HTTP请求模块,可以用来模拟发送请求
error:异常处理模块
parse:一个工具模块,提供了许多URL处理方法
robotparser:用来识别网站的robots.txt文件

request模块

urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起的过程

urlopen()函数

使用urlopen()方法,可以完成最基本的简单网页的GET请求抓取
第一个参数为URL,还可以添加其它参数如data、timeout等

下列代码完成了python官网的抓取,输出了网页源代码

import urllib.request

response = urllib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))

调用read打印出来的是bytes类型,需要进行解码成str类型操作

利用type()方法,输出响应的类型

import urllib.request

response = urllib.request.urlopen('https://www.python.org')
print(type(response))

输出为
<class 'http.client.HTTPResponse'>

这是一个HTTPResponse类型的对象,主要包含read、getheader(name)、getheaders()等方法,以及status等属性

得到了这个对象,就可以把它赋值给response变量,就可以调用这些方法和属性

1.调用status属性可以得到返回结果的状态码,200表示请求成功,404表示网页没找到等;
  调用getcode()方法也可以得到

2.调用getheaders()方法得到了响应的头消息;
  同样,调用info()可得到HTTPMessage对象,打印出来内容为服务器返回的head信息

3.调用geturl()可得到访问的地址

4.调用info()可得到HTTPMessage对象,打印出来内容为服务器返回的head信息

在python的IDLE中运行后,即可在输出栏方便调用response的方法或属性

使用data参数

urlopen有个参数‘data’,在不调用这个参数时,请求方法是GET,调用这个参数后,请求方法为POST

我们想请求的数据可以放在data参数里;data是以字典的形式保存数据的;而且还应转化为相应格式

官方文档:
For an HTTP POST request method, data should be a buffer in the standard application/x-www-form-urlencoded format. The urllib.parse.urlencode() function takes a mapping or sequence of 2-tuples and returns an ASCII string in this format. It should be encoded to bytes before being used as the data parameter.

因此,需要使用parse模块里的urlencode()函数将其编码;还需要将其编码为字节

有两种处理形式:

urllib.parse.urlencode(data).encode('utf-8')

bytes(urllib.parse.urlencode(data), encoding='utf-8')

bytes类型

Python3对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。在bytes和str的互相转换过程中,实际就是编码解码的过程,必须显式地指定编码格式。
bytes对象只负责以二进制字节序列的形式记录所需记录的对象

urlretrieve()函数

直接将远程数据下载到本地
第一个参数为url,第二个参数为要保存的文件名

Request

如果请求中需要加入Headers等信息,可以利用更加强大的Request类构建

Request构造方法:第一个参数为URL,还可添加其它参数如data、headers等

使用方法:依然用urlopen的方法发送请求,只不过这个方法这次参数不再是URL,而是一个Request类型的对象

参数headers是一个字典,可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加

添加请求头最常用的用法就是通过修改user-agent来伪装浏览器

parse模块

定义了处理URL的标准接口

urlparse

可以对url中的各个组成部分进行分割

import urllib.parse

url = 'http://www.baidu.com'
print(urllib.parse.urlparse(url))

#结果

ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='')

urlparse方法将url拆分成了6部分

://前面的是scheme,代表协议;第一个/前面是netloc,即域名,后面是path,即访问路径;分号;前面是params,代表参数;问好?后面是查询条件query,一般用作GET类型的URL;井号#后面是锚点,用于直接定位页面内部的下拉位置

urlsplit

与urlparse几乎一样,不过唯一区别为没有params(参数)

urljoin

可以完成链接的合并:提供一个基础链接作为第一个参数,将新的链接作为第二个参数,此方法会分析基础链接的scheme、netloc和path这三个内容,并对新链接缺失的部分进行补充

import urllib.parse

url = 'http://www.zzti.edu.cn/index/xwdt/310.htm'
print(urllib.parse.urljoin(url,'309.htm'))

#结果
http://www.zzti.edu.cn/index/xwdt/309.htm

urlencode函数

用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动给我们编码。而如果使用代码发送请求,那么就必须手动进行编码,这时候就应该使用urlencode函数来实现。为了更加方便地构造参数,先用字典来表示,转化为URL参数时,只需调用此方法即可

parse_qs函数

与urlencode作用相反,将参数转化为字典

quote

将内容转化为url编码的格式。url带有中文参数时,可能会导致乱码问题,用此方法可将中文字符转化为url编码

unquote

进行url解码