Python爬虫——Get和Post请求的使用

281 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

1、Get请求

GET请求一般用于我们向服务器获取数据( urllib默认使用get请求),比如搜索:毛不易,地址栏中的 URL 信息:

其中wd 表示搜索字符串的键,而“毛不易”则代表输入的值

在这里插入图片描述

在网页地址栏中删除wd后面多余的查询条件,最后显示的 URL 如下:

https://www.baidu.com/s?wd=毛不易

但在上图Headers请求头里,发送的请求是:

https://www.baidu.com/s?wd=%E6%AF%9B%E4%B8%8D%E6%98%93&ie=utf-8&tn=15007414_2_pg

同样删除wd后面多余的查询条件,最后显示的 URL 如下:

https://www.baidu.com/s?wd=%E6%AF%9B%E4%B8%8D%E6%98%93

www.baidu.com/s? 后面出现的那个长长的字符串,就是搜索关键字“毛不易”的Unicode的编码格式。

quote()

quote(str):对字符串str进行Unicode编码,如:urllib.parse.quote('毛不易')

import urllib.request
import urllib.parse

url = 'https://www.baidu.com/s?wd='

#调用quote()对关键字进行Unicode编码
name = urllib.parse.quote('毛不易')
#打印Unicode编码后的字符串
print(name)  #%E6%AF%9B%E4%B8%8D%E6%98%93
#拼接url
url = url+name
print(url)  #https://www.baidu.com/s?wd=%E6%AF%9B%E4%B8%8D%E6%98%93
#构建请求头
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.5261 SLBChan/10'}
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

执行结果:

在这里插入图片描述

urlencode()

urlencode():对查询字符串的字典进行编码,如下:

dict = {
    'wd':'毛不易',
    'sex':'男',
    'age':30
}
urllib.parse.urlencode(dict)

使用实例:

import urllib.request
import urllib.parse

base_url = 'https://www.baidu.com/s?'
param = {
    'wd':'毛不易',
    'sex':'男',
    'age':30
}

#urlencode()对关键字进行Unicode编码
new_param = urllib.parse.urlencode(param)

#打印Unicode编码后的字符串
print(new_param)
#拼接url
url = base_url+new_param
print(url)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.5261 SLBChan/10'}
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

执行结果:

wd=%E6%AF%9B%E4%B8%8D%E6%98%93&sex=%E7%94%B7&age=30
https://www.baidu.com/s?wd=%E6%AF%9B%E4%B8%8D%E6%98%93&sex=%E7%94%B7&age=30

2、Post请求

post请求的参数不会拼接到ul后面,而是放在定制请求的第二个参数位置上

post请求的参数需要进行两次编码,第一次urlencode:对字典参数进行Unicode编码转成字符串,第二次encode:将字符串数据转换为字节类型

使用实例:

import urllib.request
import urllib.parse
import json

#百度翻译
url = 'https://fanyi.baidu.com/sug'

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.5261 SLBChan/10'}

#post请求参数
param = {
    'kw':'剪刀'
}

#post请求参数需要进行两次编码,第一次urlencode:对字典参数进行Unicode编码转成字符串,第二次encode:将字符串数据转换为字节类型
param = urllib.parse.urlencode(param).encode('utf-8')

#post定制请求可以使用位置传参
request = urllib.request.Request(url,param,headers)

response = urllib.request.urlopen(request)
print(response)

#解码读取数据
page = response.read().decode('utf-8')

#反序列化,将字节对象转成python对象
content = json.loads(page)
print(content)
print(type(content))

执行结果:

<http.client.HTTPResponse object at 0x000002CFA6D04F60>

{'errno': 0, 'data': [{'k': '剪刀', 'v': 'scissors; shears; forfex; clipper; [电影]Scissors'}, {'k': '剪刀石头布', 'v': '名. rock, paper,scissors'}, {'k': '剪刀手爱德华', 'v': '名. Edward Scissorhands'}]}

<class 'dict'>