Skip to content

请求方式


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 方法 ​