请求方式
url 的构成
http/https www.baidu.com 80/443 s wd = 周杰伦
注意点:问号?后面的都是参数
http/https:协议 主机 端口号 路径 参数 锚点
www.baidu.com:主机
80/443:端口号
s:路径
wd = 周杰伦:参数
#:锚点
常见端口
http 80
https 443
mysql 3306
oracle 1521
redis 6379
mongodb 27017
请求对象定制
基本介绍
UA 介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等
获取 UA(反爬)
F12,找到网络,刷新界面,第一条就就是该网页的相关信息,双击它,滑倒最下面即可看到 user-agent
headers
headers 传入的是一个字典,键:user-agent,值:ua 的值,且都是字符串
python
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0'
}定制 request 对象
因为 urlopen 方法中不能存储字典 所以 headers 不能传递进去,需要传入一个 request 对象
python
request = urllib.request.Request(url=url,headers=headers)说明:因为 Request()有多个参数(中间有一个 data 参数),这里需要使用变量来指定(即关键字传参),否则会报错
案例:采集百度网页
python
import urllib.request
url = "https://www.baidu.com"
# 打开 F12,找到网络,复制 ua
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0'
}
# 定制 Request 对象
request = urllib.request.Request(url = url,headers=headers)
# 发送请求(Request 对象)
response = urllib.request.urlopen(request)
# 解码
content = response.read().decode()
# 打印内容
print(content)编解码
unicode 码
Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode 标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要 4 个字节)。现代操作系统和大多数编程语言都直接支持 Unicode
导入包
import urllib . parse
quote()方法
用途:将中文转为对应的 unicode 字符
案例:url 拼接
python
import urllib.parse # 用于编解码
url = 'https://www.baidu.com/s?wd='
# 解码:中文转unicode编码
name = urllib.parse.quote("周杰伦")
# 利用解码拼接url
url = url + name
print(url)urlencode()方法
用途:解决多个参数转换(中文转 unicode 编码)的问题,可以定义 data 字典,使用 encode 方法统一转换
返回形式:wd = 转换的参数
data 字典
键:传入的参数;值:需要转换的中文字符
python
# encode()方法:处理多个参数转换问题,需要定义data字典
data = {
'wd':'周杰伦',
'sex':'男',
'location':'中国台湾省'
}
a = urllib.parse.urlencode(data)
print(a)get 请求
基本介绍
所有的参数传递都会在浏览器的地址上显示出来
相关方法
quote()方法:字符串转 unicode
urlencode()方法:统一处理参数转换问题
应用场景
使用相关方法对 url 进行从新拼接
案例:网页爬取
python
url = 'https://www.baidu.com/s?'
data = {
'wd':'周杰伦',
'sex':'男',
'location':'中国台湾省'
}
# url 拼接
new_data = urllib.parse.urlencode(data)
url = url + new_data
# 获取ua
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0'
}
# 定制request对象
request = urllib.request.Request(url = url,headers=headers)
# 发送请求
response = urllib.request.urlopen(request)
# 解码
content = response.read().decode("utf-8")
# 打印内容
print(content)post 请求
基本介绍
post 请求的参数不直接在 url 上体现
相关方法
(1)编码(urlencode()方法)之后,必须调用 encode() 方法
解释:因为返回的字符串,然而请求对象定制的方法中需要传入字节形式的二进制数据
(2)参数放在请求对象定制的方法中:urllib.request.Request(url = url,data = data, headers=headers)
案例:百度翻译
python
import urllib.request
import urllib.parse
url = 'https://fanyi.baidu.com/sug'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
data = {
'kw':'spider'
}
# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')
# post的请求的参数 是不会拼接在url的后面的 而是需要放在请求对象定制的参数中
# post请求的参数 必须要进行编码
request = urllib.request.Request(url=url,data=data,headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应的数据
content = response.read().decode('utf-8')
# 字符串-->json对象
import json
obj = json.loads(content)
print(obj)字符串转 json 对象
python
import json
obj = json.loads(content)
print(obj)请求方式总结
1:get 请求方式的参数必须编码,参数是拼接到 url 后面,编码之后不需要调用 encode 方法
2:post 请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用encode 方法
