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