这篇文章主要来讲解下Python自带的爬虫库urllib常见用法,主要围绕urllib定义、urllib的常用模块和urllib+lxml爬虫案例三个部分进行展开。
一、什么是urllib
它是一个http请求的Python自带的标准库,无需安装,直接可以用。并且提供了如下功能:网页请求、响应获取、代理和cookie设置、异常处理、URL解析,可以说是一个比较强大的模块。
二、urllib模块
可分为以下模块:
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse 解析模块
urllib.robotparser 解析模块
那么,我们先从第一个模块开始说起吧,首先说一下它的大致用法:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) #里面有很多方法,类似与requests模块中的renquest方法
request里包含了很多方法,如果我们要发送一个请求并读取请求内容,最简单的方法就是:
请求格式:
urllib.request.urlopen(url,data,timeout)
url :请求地址
data:请求数据
timeout:请求超时时间
![a2243578d4a0183bcaec6171d148ac6d.png](https://i-blog.csdnimg.cn/blog_migrate/9e669c796cfb0563f658f88ceb90b2a3.jpeg)
这里采用的是get请求,如果想要进行post请求,只需给data方法传参数即可,这里有个问题需要,因为传递参数必须是字节,所以得先编码成bytes才能读取。
![0521a83e8a7ea85e6bba3996473eb80a.png](https://i-blog.csdnimg.cn/blog_migrate/ce1b514981ddb20f2143cb7eb8307681.jpeg)
也可以这样写:
![497cb56f8fa0aad0b8160268dd055ad0.png](https://i-blog.csdnimg.cn/blog_migrate/d8de5bc3cfb5e8d20d981edb22728521.jpeg)
通过解析模块先将它解析为byte格式然后读取,同样行之有效,这样就完成了一次post请求。
通过上面例子我们找到了request模块的使用方法,我们使用response.read获取的是响应体的内容,我们还可以通过response.status、response.getheaders.response.getheader("server"),获取状态码以及头部信息,如果我们要给请求的网址添加头部信息的话了,就要使用urllib.request.Request方法了。
它的用法为:
urllib.request.Request(url,data,headers,timeout,method)
url:请求地址
data:请求数据
headers:请求头
timeout:请求超时时间
method:请求方法,如get post
大致了解下我们可以先来访问下起点网:
from urllib import request, parse
url = 'https://book.qidian.com/info/1014243481#Catalog'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Host': 'book.qidian.com'
}
data = {
'hw': 'hw'
}
data = bytes(parse.urlencode(data), encoding='utf8')
req = request.Request(url=url, data=data,timeout=2,headers=headers, method='POST')
response = request.urlopen(req)
print(response.read.decode('utf-8'))
可以看出这是个post请求,因为method设置为post,data传了参数。
这里补充说明下有个urlencode方法,它的作用是将字典转换为url,例子如下:
from urllib.parse import urlencode
data = {
"name":"hw