前言:
此时同学们对“python urllib模块”大约比较注意,我们都想要学习一些“python urllib模块”的相关资讯。那么小编在网络上搜集了一些关于“python urllib模块””的相关资讯,希望姐妹们能喜欢,朋友们快快来学习一下吧!博主强烈推荐:
Java17中文文档:Overview - Java17中文文档 - API参考文档 - 全栈行动派
Linux命令在线查询工具:Linux命令查询 - 全栈工具箱 - 在线工具箱 - 免费实用工具大全
Gradle最新中文文档:Gradle用户手册 - Gradle8.1.1中文文档 - API参考文档 - 全栈行动派Gradlegithubgradle
更多好文章参见博主自己的博客系统:全栈行动派-全栈技术博客
1、概述
Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。
主要包含模块有:
模块
描述
urllib.request
模拟浏览器从服务器获取内容。
urllib.error
包含 urllib.request 抛出的异常。
urllib.parse
解析、编码URL
urllib.robotparser
解析 robots.txt 文件。
2、urllib.request
urllib.request 定义了一些打开 URL 的函数和类,包含授权验证、重定向、浏览器 cookies等。
urllib.request 可以模拟浏览器的一个请求发起过程。
实例①:获取百度首页源码(填坑)
import urllib.request# 定义URLurl = ";# 模拟浏览器向服务器发起请求获取响应response = urllib.request.urlopen(url)# 获取响应内容content = response.read()# 打印内容print(content)
注意:如果发现获取的内容开头是"b"字母,读取的是字节,需要转换为相应的编码格式,具体转换成什么编码格式,则需要看要获取的网页源码的Content-Type元素值。
改造代码,增加字节编码解析
# 获取响应内容content = response.read().decode('utf-8')2.1、response方法列表
方法
描述
read()
字节形式读取二进制
read(num)
字节形式读取二进制,读取前几个字节
readline()
读取一行数据
readlines()
一行一行读取,直到结束
getcode()
获取响应状态码
geturl()
获取请求的URL
getheaders()
获取请求头
注意:读取数据时,如果已经读取再次调用方法是不会返回数据的
2.2、请求增加header
我们将请求百度首页的URL地址由http换为https,在不增加请求头的情况下,会遇到反爬,返回内容如下:
这个时候我们就需要在headers中增加UA
获取百度首页URL的UA(其他网页地址获取UA方式一致)
改造代码:
import urllib.request# 定义URLurl = ";# headersheaders = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}# 构建requestrequest = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求获取响应response = urllib.request.urlopen(request)# 第一次获取全部内容content = response.read().decode('utf-8')# 打印内容print(content)2.3、get请求增加参数
先看下百度首页搜索的请求
改造代码:
import urllib.request# 定义URLurl = ";# headersheaders = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}url += "java"# 构建requestrequest = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求获取响应response = urllib.request.urlopen(request)# 第一次获取全部内容content = response.read().decode('utf-8')# 打印内容print(content)
因为上面查询的关键字”java“是字母,换成中文则会报错
因为请求URL只识别ascii码,这个时候就需要用到urllib.parse 模块了
3、urllib.parse
我们将2.3代码改造下
# 导入包import urllib.requestimport urllib.parse# 定义URLurl = ";# headersheaders = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}# 将中文编码为ascii码url += urllib.parse.quote("中文")# 构建requestrequest = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求获取响应response = urllib.request.urlopen(request)# 第一次获取全部内容content = response.read().decode('utf-8')# 打印内容print(content)
这种方式只能一个一个参数处理,多个参数处理方式
data = { "kw": "中文", "other": "也是中文"}# 打印结果:kw=%E4%B8%AD%E6%96%87&other=%E4%B9%9F%E6%98%AF%E4%B8%AD%E6%96%87print(urllib.parse.urlencode(data))
多参数改造:
import urllib.requestimport urllib.parse# 定义URLurl = ";# headersheaders = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}# 定义多参数data = { "kw": "中文", "other": "也是中文"}# 将参数编码,附加在URL后面url += "?" + urllib.parse.urlencode(data)# 构建requestrequest = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求获取响应response = urllib.request.urlopen(request)# 第一次获取全部内容content = response.read().decode('utf-8')# 打印内容print(content)4、urllib.error
我们将3的代码改造,将地址写错增加错误捕获
import urllib.requestimport urllib.parseimport urllib.error# 定义URLurl = ";# headersheaders = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}data = { "kw": "中文", "other": "也是中文"}url += "?" + urllib.parse.urlencode(data)# 构建requestrequest = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求获取响应try: response = urllib.request.urlopen(request) print(f"本次请求响应状态码:{response.getcode()}") # 第一次获取全部内容 content = response.read().decode('utf-8') # 打印内容 print(content)except urllib.error.HTTPError as e: if e.code == 404: print("地址未找到") else: print("其他错误")except urllib.error.URLError as e: print(f"URLError:{e.reason}")5、post请求
post请求是不能通过url传参,就得换另一种方式,咱们以百度翻译为例
改造代码,增加post请求入参
import urllib.requestimport urllib.parseurl = ";headers = { "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}data = { "kw": "python"}# 编码请求参数,注意这里还得再次encodedata = urllib.parse.urlencode(data).encode("utf-8")# 构建requestrequest = urllib.request.Request(url=url, data=data, headers=headers)# 构建responseresponse = urllib.request.urlopen(request)# 获取响应content = response.read().decode('utf-8')print(content)
但是响应结果:
说明我们的请求不符合要求,的改造请求头
这里注意:一定不能将“Accept-Encoding” 加入请求头,否则获取的数据解码失败,报错信息如下:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1:invalid start byte
改造后代码:
import urllib.requestimport urllib.parseimport jsonurl = ";headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Content-Length': '9', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': 'xxxxx', 'Host': 'fanyi.baidu.com', 'Origin': ';, 'Referer': ';, 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest',}data = { "kw": "python"}# 编码请求参数,注意这里还得再次encodedata = urllib.parse.urlencode(data).encode("utf-8")# 构建requestrequest = urllib.request.Request(url=url, data=data, headers=headers)# 构建responseresponse = urllib.request.urlopen(request)# 获取响应content = response.read().decode("utf-8")# 因为获取到的数据是JSON格式,需要将字符串转换为JSON格式obj = json.loads(content)print(obj)
响应结果:
6、网页、图片、视频下载
代码:
import urllib.request# 要下载的URLurl = ";# 请求下载,filename为要存储为文件名称urllib.request.urlretrieve(url=url, filename="baidu.html")
标签: #python urllib模块