python urllib安装_Python Urllib库

一、什么是Urllib

我们首先了解一下 Urllib 库,它是 Python 内置的 HTTP 请求库,也就是说我们不需要额外安装即可使用,它包含四个模块:第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。

第二个 error 模块,即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作,保证程序不会意外终止。

第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等的方法。

第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。

在这里重点对前三个模块进行下讲解。

二、发送请求

使用 Urllib 的 request 模块我们可以方便地实现 Request 的发送并得到 Responseurlopen()

urllib.request模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理authenticaton(授权验证),redirections(重定向)cookies(浏览器Cookies)以及其它内容。

我们来感受一下它的强大之处,以 百度首页为例,我们来把这个网页抓下来:

1.发送请求(以GET方式)

2.response

通过输出结果可以发现它是一个 HTTPResposne 类型的对象,它主要包含的方法有 read()、readinto()、getheader(name)、getheaders()、fileno() 等方法和 msg、version、status、reason、debuglevel、closed 等属性。

得到这个对象之后,我们把它赋值为 response 变量,然后就可以调用这些方法和属性,得到返回结果的一系列信息了。

例如调用 read() 方法可以得到返回的网页内容,调用 status 属性就可以得到返回结果的状态码,如 200 代表请求成功,404 代表网页未找到等。

可见,三个输出分别输出了响应的状态码,响应的头信息,以及通过调用 getheader() 方法并传递一个参数 Server 获取了 headers 中的 Server 值,结果是 nginx,意思就是服务器是 nginx 搭建的。 利用以上最基本的 urlopen() 方法,我们可以完成最基本的简单网页的 GET 请求抓取。 如果我们想给链接传递一些参数该怎么实现呢?我们首先看一下 urlopen() 函数的API:

可以发现除了第一个参数可以传递 URL 之外,我们还可以传递其它的内容,比如 data(附加数据)、timeout(超时时间)等等。

下面我们详细说明下这几个参数的用法:data参数

data 参数是可选的,如果要添加 data,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 方法可以进行转化,另外如果传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST。

在这里我们传递了一个参数 word,值是 hello,它需要被转码成bytes(字节流)类型。其中转字节流采用了 bytes() 方法,第一个参数需要是 str(字符串)类型,需要用 urllib.parse 模块里的 urlencode() 方法来将参数字典转化为字符串,第二个参数指定编码格式,在这里指定为 utf8。最后通过read()方法获取响应体的内容。参数timeout(超时)的设置

timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP、HTTPS、FTP 请求。 因此我们可以通过设置这个超时时间来控制一个网页如果长时间未响应就跳过它的抓取,利用 try except 语句就可以实现这样的操作,代码如下:

其他参数

还有 context 参数,它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。

cafile 和 capath 两个参数是指定 CA 证书和它的路径,这个在请求 HTTPS 链接时会有用。

cadefault 参数现在已经弃用了,默认为 False。

以上讲解了 urlopen() 方法的用法,通过这个最基本的函数可以完成简单的请求和网页抓取,如需更加详细了解,可以参见官方文档:https://docs.python.org/3/library/urllib.request.html

3.Request

由上我们知道利用 urlopen() 方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 Headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。

首先我们用一个实例来感受一下 Request 的用法:

可以发现,我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个 URL,而是一个 Request 类型的对象,通过构造这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。

下面我们看一下 Request 都可以通过怎样的参数来构造,它的构造方法如下:

第一个 url 参数是请求 URL,这个是必传参数,其他的都是可选参数。

第二个 data 参数如果要传必须传 bytes(字节流)类型的,如果是一个字典,可以先用 urllib.parse 模块里的 urlencode() 编码。

第三个 headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request 实例的 add_header() 方法来添加, Request Headers 最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib,我们可以通过修改它来伪装浏览器。

第四个 origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。

第五个 unverifiable 参数指的是这个请求是否是无法验证的,默认是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个 HTML 文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True。

第六个 method 参数是一个字符串,它用来指示请求使用的方法,比如GET,POST,PUT等等。

写个例子:

在这里我们通过四个参数构造了一个 Request,url 即请求 URL,在headers 中指定了 User-Agent 和 Host,传递的参数 data 用了 urlencode() 和 bytes() 方法来转成字节流,另外指定了请求方式为 POST。

通过观察结果可以发现,我们成功设置了 data,headers 以及 method。

另外 headers 也可以用 add_header() 方法来添加。

这样,我们就可以更加方便地构造一个 Request,实现请求的发送啦。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值