Python自带爬虫库urllib使用大全

这篇文章主要来讲解下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=https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) #里面有很多方法,类似与requests模块中的renquest方法request里包含了很多方法,如果我们要发送一个请求并读取请求内容,最简单的方法就是:
请求格式:
urllib.request.urlopen(url,data,timeout)url :请求地址
data:请求数据
timeout:请求超时时间

Python自带爬虫库urllib使用大全

文章插图
这里采用的是get请求,如果想要进行post请求,只需给data方法传参数即可,这里有个问题需要,因为传递参数必须是字节,所以得先编码成bytes才能读取 。
Python自带爬虫库urllib使用大全

文章插图
也可以这样写:
Python自带爬虫库urllib使用大全

文章插图
通过解析模块先将它解析为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, parseurl = '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 = https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/{ 'hw': 'hw'}data = https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/bytes(parse.urlencode(data), encoding='utf8')req = request.Request(url=url, data=https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/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 urlencodedata = https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/{ "name":"hw", "age":25,}url = "https://www.baidu.com?"page_url = url+urlencode(data)print(page_url)添加请求头其实还有一种方法,请看:
from urllib import request, parseurl = 'https://book.qidian.com/info/1014243481#Catalog'data = https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/{ 'hw': 'hw'}data = https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/bytes(parse.urlencode(data), encoding='utf8')req = request.Request(url=url, data=https://www.isolves.com/it/cxkf/yy/Python/2020-12-16/data,method='POST')req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom/78.0.3904.108 Safari/537.36') #添加请求头response = request.urlopen(req)print(response.read.decode('utf-8'))这种添加方式有个好处是自己可以定义一个请求头字典,然后循环进行添加,伪造多个浏览器头 。
urllib.request 还可以设置代理,用法如下,


推荐阅读