这篇文章主要来讲解下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:请求超时时间
文章插图
这里采用的是get请求,如果想要进行post请求,只需给data方法传参数即可,这里有个问题需要,因为传递参数必须是字节,所以得先编码成bytes才能读取 。
文章插图
也可以这样写:
文章插图
通过解析模块先将它解析为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 = 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 urlencode
data = 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, parse
url = '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 还可以设置代理,用法如下,
推荐阅读
- JDK里面自带了这么多的exe,你都挨着试过么?
- Python流程控制语句详解
- Python线程的生命周期你知道多少,一文帮你全部搞清楚
- 使用Python+Fabric实现Linux自动化操作
- Python循环语句代码详解:while、for、break
- 凭借这5步,我30分钟学会了Python爬虫
- 真香!Python十大常用文件操作,轻松办公
- 别再用手敲了,这个工具可以自动生成python爬虫代码
- 盒马可以加工自带海鲜吗 盒马现场买了海鲜如何加工
- 使用python爬取抖音app视频