11. requests.post()函数访问网页(小白入门)

1. 常用的http请求方法

爬虫的第一步是发送网络请求。

在第2节中我们学习了用requests.get()方法发送网络请求。

【代码示例】

# 1. 导入库
import requests

# 2. 定义url
url = 'https://www.baidu.com/'

# 3. 发送网络请求
# r是变量名,数据类型为Response对象
# requests库名
# get方法名,作用是发送网络请求
# url 要访问的网址
r = requests.get(url)  

# 访问网页后返回一个Response对象
# 变量r的数据类型为Response对象
print(type(r))

# 打印响应内容
print(r)

【终端输出】

<class 'requests.models.Response'>
<Response [200]>

<class ‘requests.models.Response’>表示返回的是一个Response对象。

返回<Response [200]>表示发送请求成功。

发送网络请求除了get方法我们还有其他的请求方法。

【requests常用的http请求方法如下】

  1. GET:获取资源,通常用于读取数据。
  2. POST:提交数据,通常用于创建或更新资源。
  3. PUT:更新资源,通常用于更新数据。
  4. DELETE:删除资源,通常用于删除数据。
  5. HEAD:获取资源的元数据,通常用于检查资源是否存在或是否被修改。
  6. OPTIONS:获取资源支持的HTTP方法和其他元数据。
  7. TRACE:回显服务器收到的请求,通常用于调试和测试。
  8. CONNECT:建立与服务器的隧道,通常用于代理服务器或SSL加密连接。

2. requests.post()语法

post和get一样,也能实现向服务器发送网络请求。

requests.post()是一个HTTP的POST请求方法,用于向指定的URL发送POST请求。

【语法】

requests.post(url, data=None, json=None, headers=None, cookies=None, auth=None, timeout=None)

【参数说明】

  • url:请求的URL地址。
  • data:请求的数据,可以是字典、元组列表、文件对象等。
  • json:请求的JSON数据。
  • headers:请求头,可以是字典类型。
  • cookies:请求的cookies,可以是字典类型。
  • auth:认证信息,可以是元组类型。
  • timeout:请求超时时间,单位为秒。

3. 确定请求网址和请求方法

以访问百度翻译网页为例。

【要访问的网址】

url = 'https://fanyi.baidu.com/'

【网页分析】

备注:这里我用的是谷歌浏览器。

  1. 输入网址打开【百度翻译】首页。

在这里插入图片描述

  1. 按【F12】进入开发者模式。

  2. 点击网络【Network】。

  3. 点击【Fetch/XHR】。

  4. 在搜索框中输入要翻译的单词【ajax】。

  5. 点击名称【Name】栏。

  6. 点击最下方的【sug】。

为什么是最下方的【sug】呢,后面有解答。

  1. 点击-【Headers】-【general】。

在这里插入图片描述

【Request URL】后面的是请求网址https://fanyi.baidu.com/sug

【Request Method】后面的是请求方法post

【温馨提示】

大家多试几个单词,会发现无论我们翻译哪个单词,这个【Request URL】都是不会变的。

当我们看到请求方法是get时,我们需要用requests.get()来访问网页。

当我们看到请求方法是post时,我们需要用requests.post()来访问网页。

【总结】

在写每一个爬虫程序之前,大家对照上面的步骤先进行网页分析。

首先确定要请求的网址和请求的方法。

4. 开发者工具中的Fetch/XHR表示什么

【Ajax】

Ajax:网页异步更新技术。

Ajax(Asynchronous JavaScript and XML),直译为“异步的JavaScript与XML技术”,是一种创建交互式网页应用的网页开发技术,用于创建快速动态网页。

与传统的Web应用相比,Ajax通过浏览器与服务器进行少量的数据交换就可以实现网页的异步更新,在不重新加载整个网页的情况下,即可对网页进行更新。

Ajax的本质是使用XMLHttpRequest(XHR)对象来请求数据,而XMLHttpRequest(XHR)对象是通过事件的模式来实现返回数据的处理。

【Fetch】

Fetch被称为下一代Ajax技术,采用Promise方式来处理数据。

用于替代XMLHttpRequest(XHR),它提供了更简单、更强大的方式来进行网络请求。

【开发者工具中的Fetch/XHR】

Fetch/XHR是指浏览器中的网络请求工具,用于向服务器发送HTTP请求并获取响应。
在开发者工具中,Fetch/XHR可以用来查看网络请求的详细信息,包括请求的URL、请求方法、请求头、请求体、响应状态码、响应头、响应体等。

5. requests.post()访问网页实操

【爬虫框架】

# 1.导入库
# 2.定义要访问的url
# 3.向服务器发送网络请求
# 4.获取数据

5.1 导入库,随机生成一个User-Agent

爬虫程序的第一部分通常都是导入我们爬虫所需要的库。

为了安全,我通常都是使用fake_useragent库随机生成一个请求头User-Agent。

【代码示例】

# 导入fake_useragent库中的UserAgent类
from fake_useragent import UserAgent

# 实例化UserAgent类创建一个UserAgent对象
# 实例化对象语法:对象 = 类名( )
# ua为对象名
# UserAgen为类名
ua = UserAgent()

# 实例化类后得到一个对象
# ua是一个UserAgent对象
print('ua是一个UserAgent对象:',ua)

# 调用ua的random方法,获取随机的User-Agent头部信息 
# 调用方法语法:对象.方法名( )
# ua对象名
# random方法名
print('ua.random随机生成一个User-Agent头部信息:',ua.random)

# 查看ua.random的数据类型
print('ua.random的数据类型为:',type(ua.random))

【终端输出】

ua是一个UserAgent对象: <fake_useragent.fake.FakeUserAgent object at 0x000001A3951655B0>
ua.random随机生成一个User-Agent头部信息: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
ua.random的数据类型为: <class 'str'>

上面的代码我做了详细的解析,方便初学者了解每个变量、每行代码的作用。

去掉注释,代码可简写如下:

【随机生成一个User-Agent】

from fake_useragent import UserAgent
# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
# 用生成的信息作为字典的值,构建一个字典
header = {'User-Agent':ua.random}
print(header)

【终端输出】

{'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.9200'}

【代码解析】

header = {'User-Agent':ua.random}

构建一个字典存储请求头信息,字典名为header。

注意这里的字典的值和键数据类型都必须是字符串类型。

字典的键为'User-Agent',注意有引号。

字典的值为ua.random,是一个随机生成的字符串。

之所以构建字典是后面访问网页传参时需要的是字典类型。

5.2 定义url

网页的请求方式为get时,我们可以使用浏览器里的url。

在这里插入图片描述

网页的请求方式为post时,我们所需的url是【Headers】下【Request URL】后面的网址。

url = 'https://fanyi.baidu.com/sug'

在这里插入图片描述

5.3 发送网络请求

# 1.导入库
import requests
from fake_useragent import UserAgent

# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
header = {'User-Agent':ua.random}

# 2. 定义请求url
url = 'https://fanyi.baidu.com/sug'

# 3. 发送网络请求
data_dict = { 'kw':'ajax'}
r= requests.post(url, headers=header, data = data_dict)
print(r)

【终端输出】

<Response [200]>

【代码解析】

data_dict = { 'kw':'ajax'}

data_dict变量名,数据类型为字典。

'ajax'字典的值,是我们需要翻译的单词。

'kw'字典的键。

【查找字典的键】

字典的键kw是怎么来的呢?

  1. 回到网页开发者模式。

  2. 点击最后一个【sug】。

  3. 点击【payload】。

下方出现的kw就是我们字典的键。

在这里插入图片描述

在【payload】界面下,大家点击一下前几个【sug】,观察【payload】下的内容,发现:

  • 第1个【sug】显示的是-kw: a
  • 第2个【sug】显示的是-kw: aj
  • 第3个【sug】显示的是-kw: aja
  • 第4个【sug】显示的是-kw: ajax

现在应该明白为什么点击最后一个【sug】了。

  1. 点击预览【preview】可以查看服务器返回的翻译结果,也就是我们要爬取的内容。

在这里插入图片描述

r = requests.post(url, headers=header, data = data_dict)
  • r是变量名,存储的是访问网页后返回的response对象。
  • requests访问网页的库。
  • post访问网页的方法。
  • url要访问的网址。
  • headers是请求头参数,这里我们将前面随机生成的请求头赋值给变量headers。
  • data是请求的数据,可以是字典、元组列表、文件对象等。这里将要翻译的单词存储到字典中赋值给参数data。

6. 开发者工具里的payload是什么?

payload:有效荷载。

payload是指在进行网络请求时,发送给服务器的数据。
在开发者工具中,可以查看请求的payload,以便开发者调试和优化代码。
Payload通常是以JSON格式发送的,包含了请求的参数和数据。
例如,在发送一个POST请求时,payload可能包含表单数据、文件数据或者其他需要传递给服务器的数据。
开发者可以在开发者工具中查看请求的payload,以便确认数据是否正确发送到服务器。

7. 获取数据

7.1 r.text返回HTTP响应的内容(字符串类型的数据)

# 1.导入库
import requests
from fake_useragent import UserAgent
# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
header = {'User-Agent':ua.random}

# 2. 定义请求url
url = 'https://fanyi.baidu.com/sug'

# 3. 发送网络请求
data_dict = { 'kw':'ajax'}
r = requests.post(url, headers=header, data = data_dict)

# 4. 获取数据
print(r.text)

【终端输出】

{"errno":0,"data":[{"k":"Ajax","v":"n. \u5168\u79f0\u4e3a\u201cAsynchronous JavaScript and XML\u201d\uff08\u5f02\u6b65JavaScri"}]}

【代码解析】

print(r.text)
  • r是访问网页后返回的response对象。
  • .text是response对象多个属性中的一个。
  • r.text输出的是网页源代码,返回的数据类型为字符串类型。

观察输出结果,发现返回的是Unicode编码数据。

7.2 将Unicode编码数据转换回原编码字符串类型数据

要将Unicode编码数据转换回原编码字符串类型数据,需要使用Python的encode()及decode()方法。

encode [ɪnˈkəʊd]:编码。

decode[ˌdiːˈkəʊd]:解码。

假设有一个Unicode编码字符串,要将其转换为原编码字符串类型数据,可以使用以下代码:

【举例说明】

unicode_str = '\u4f60\u597d'
original_str = unicode_str.encode('raw_unicode_escape').decode('unicode_escape')
print(original_str)

【终端输出】

你好

【代码解析】

unicode_str = '\u4f60\u597d'

定义一个Unicode字符串unicode_str。

Unicode编码中,\u4f60表示\u597d表示

original_str = unicode_str.encode('raw_unicode_escape').decode('unicode_escape')
  • original_str是变量名,用于存储解码后的字符。
  • unicode_str是上面定义的变量名。
  • encode是方法名,作用是编码。
  • 'raw_unicode_escape'转换方式。
  • decode是方法名,作用是解码。
  • 'unicode_escape'转换方式。
encode('raw_unicode_escape')
  • 使用encode方法将Unicode字符串转换为原始字符串,编码格式为raw_unicode_escape
  • 这个编码格式会将Unicode字符转换为类似\xhh的形式,其中hh表示字符的16进制编码。
  • 例如,\u4f60会被转换为\x4f\x60。
decode('unicode_escape')
  • 使用decode方法将编码后的字符串转换回原始字符串,编码格式为unicode_escape
  • 这个编码格式会将\xhh形式的字符转换为对应的Unicode字符。
  • 例如,\x4f\x60会被转换回\u4f60。
print(original_str)

将原始字符串打印出来,输出结果为你好

【爬虫数据转换】

# 1.导入库
import requests
from fake_useragent import UserAgent
# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
header = {'User-Agent':ua.random}

# 2. 定义请求url
url = 'https://fanyi.baidu.com/sug'

# 3. 发送网络请求
data_dict = { 'kw':'ajax'}
r = requests.post(url, headers=header, data = data_dict)

# 4. 获取数据
print('*****转换前的输出结果*****')
print(r.text)
print('*****转换后的输出结果*****')
print(r.text.encode('raw_unicode_escape').decode('unicode_escape'))

【终端输出】

*****转换前的输出结果*****
{"errno":0,"data":[{"k":"Ajax","v":"n. \u5168\u79f0\u4e3a\u201cAsynchronous JavaScript and XML\u201d\uff08\u5f02\u6b65JavaScri"}]}
*****转换后的输出结果*****
{"errno":0,"data":[{"k":"Ajax","v":"n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri"}]}

进行转换后就变成我们能看懂的数据了。

除了转换这样的方法外,我们通过json方法也能获取我们能看得懂的数据。

7.3 r.json()返回HTTP响应的内容(json数据)

对上面的代码进行修改,用r对象的json方法来获取数据。

# 1.导入库
import requests
from fake_useragent import UserAgent
# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
header = {'User-Agent':ua.random}

# 2. 定义请求url
url = 'https://fanyi.baidu.com/sug'

# 3. 发送网络请求
data_dict = { 'kw':'ajax'}
r = requests.post(url, headers=header, data = data_dict)

# 4. 获取数据
print(r.json())
print(type(r.json()))

【终端输出】

{'errno': 0, 'data': [{'k': 'Ajax', 'v': 'n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri'}]}
<class 'dict'>

【代码解析】

print(r.json())
  • r是访问网页后返回的response对象。
  • json是response对象多个方法中的一个。
  • r.json()将获取到的数据以json数据格式返回。
  • print(r.json())能输出对象的内容。

【预览服务器返回的内容】

在这里插入图片描述

【代码输出的内容如下】

{
    'errno': 0, 
    'data': [
        {
            'k': 'Ajax', 
            'v': 'n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri'}
            ]
    }

注意输出的是一个字典类型的数据。

现在输出的结果就是服务器返回的响应内容。

【提取我们所需的数据】

# 1.导入库
import requests
from fake_useragent import UserAgent
# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
header = {'User-Agent':ua.random}

# 2. 定义请求url
url = 'https://fanyi.baidu.com/sug'

# 3. 发送网络请求
data_dict = { 'kw':'ajax'}
r = requests.post(url, headers=header, data = data_dict)

# 4. 获取数据
print(r.json()['data'][0]['v'])

【终端输出】

n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri

下面的内容是print(r.json)后输出的结果,得到的是一个字典类型的数据。

{
    'errno': 0, 
    'data': [
        {
            'k': 'Ajax', 
            'v': 'n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri'}
            ]
    }

【字典取值语法回顾】

字典的值=字典名[键名]

my_dict = {'name': '安迪', 'age': 18, 'city': '云南'}
print(my_dict['name'])  # 输出:安迪
print(my_dict['age'])   # 输出:18
print(my_dict['city'])  # 输出:云南

【终端输出】

安迪
18
云南

【代码解析】

print(r.json()['data'])

【终端输出】

[{'k': 'Ajax', 'v': 'n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri'}]
  • r.json()得到的是一个字典类型的数据。
  • ['data']取到字典的键data所对应的值。
  • 所对应的值是一个列表。
print(r.json()['data'][0])

【终端输出】

{'k': 'Ajax', 'v': 'n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri'}
  • [0]取出列表的第一个元素。
  • 第1个元素是字典,字典里有2个键值对。
print(r.json()['data'][0]['v'])

【终端输出】

n. 全称为“Asynchronous JavaScript and XML”(异步JavaScri

['v']取出字典的键v所对应的值,就是我们最终要的结果。

8. 调用对象的方法和属性的语法知识回顾

8.1 调用对象的属性

【语法】

对象名.属性名

【示例】

r.text
  • r是对象名。
  • .英文小圆点。
  • text属性。

8.2 调用对象的方法

对象名.方法名(参数)

r.json( ) 
  • r是对象名。
  • .英文小圆点。
  • json对象的方法名。
  • ()英文圆括号。

【语法总结】

  • 对象 = 类名( )
  • 对象.方法()
  • 对象.属性

9. response.text和response.json()的区别

  • text是对象的属性。
  • json是对象的方法。

response.text返回的是HTTP响应的内容,是一个字符串类型的数据。

response.json返回的也是HTTP响应的内容,是一个JSON格式的数据。

通常情况下,如果响应的内容是JSON格式的数据,我们会使用response.json方法来解析响应内容,方便我们对数据进行处理和操作。

如果响应的内容不是JSON格式的数据,我们可以使用response.text方法来获取响应内容。

10. 常见的response对象的方法

  1. response.write():向客户端发送数据。

  2. response.end():结束响应过程。

  3. response.setHeader():设置响应头。

  4. response.getHeader():获取响应头。

  5. response.removeHeader():移除响应头。

  6. response.statusCode():设置响应状态码。

  7. response.statusMessage():设置响应状态消息。

  8. response.redirect():重定向到另一个URL。

  9. response.sendFile():发送文件到客户端。

  10. response.json():发送JSON数据到客户端。

  11. response.render():渲染模板并发送到客户端。

  12. response.cookie():设置cookie。

  13. response.clearCookie():清除cookie。

  14. response.download():下载文件到客户端。

11. requests.get()和requests.post()的区别

  1. 请求方式不同:requests.get()是GET请求,requests.post()是POST请求。

  2. 参数传递方式不同:requests.get()的参数是通过URL中的查询字符串传递的,而requests.post()的参数是通过请求体中的表单数据传递的。

  3. 安全性不同:由于requests.get()的参数是通过URL传递的,因此可能会被拦截或篡改,而requests.post()的参数是通过请求体传递的,相对更加安全。

  4. 适用场景不同:requests.get()适用于获取数据,而requests.post()适用于提交数据,如登录、注册等操作。

【总结】

  • 我把网页数据比作某个食品店里的食品。
  • 服务器是老板。
  • 客户端就是顾客。
  • get请求就是老板把全部食品打包给你,可以理解成给你了一个旺旺大礼包。
  • post请求是你知道店里卖什么,然后你告诉老板我只买旺旺雪饼,其他的都不要。

在这里插入图片描述

  • get请求是把所有的都给你,你拿回去挑选你所需要的,先取后选。
  • post请求是先告诉老板你想要的,只买走自己需要的,先选后取。

12. requests.post请求框架

【代码示例】

import requests
from fake_useragent import UserAgent
ua = UserAgent()
header = {'User-Agent':ua.random}

# 需要替换成你要访问的网址
url = 'https://httpbin.org/post'

# 需要替换成你要提交的数据
data = {'key1': 'value1', 'key2': 'value2'}

r = requests.post(url, data=data, headers=header)

print('*****r.text输出内容如下*****')
print(r.text)
print('*****r.json()输出内容如下*****')
print(r.json())      

【终端输出】

*****r.text输出内容如下*****
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.6) Gecko/20040206 Firefox/0.8", 
    "X-Amzn-Trace-Id": "Root=1-64999271-1bdea6c85981c4db4e76f4c4"
  }, 
  "json": null, 
  "origin": "106.61.21.12", 
  "url": "https://httpbin.org/post"
}

*****r.json()输出内容如下*****
{'args': {}, 'data': '', 'files': {}, 'form': {'key1': 'value1', 'key2': 'value2'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '23', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.6) Gecko/20040206 Firefox/0.8', 'X-Amzn-Trace-Id': 'Root=1-64999271-1bdea6c85981c4db4e76f4c4'}, 'json': None, 'origin': '106.61.21.12', 'url': 'https://httpbin.org/post'}

13. 完整代码

# 1.导入库
import requests
from fake_useragent import UserAgent
# 实例化类
ua = UserAgent()
# ua.random随机生成一个User-Agent头部信息
header = {'User-Agent':ua.random}

# 2. 定义请求url
url = 'https://fanyi.baidu.com/sug'

# 3. 发送网络请求
data_dict = { 'kw':'ajax'}
r = requests.post(url, headers=header, data = data_dict)

# 4. 获取数据
print('*****调用text属性输出结果*****')
print(r.text)

print('*****unicode编码转后的输出结果*****')
print(r.text.encode('raw_unicode_escape').decode('unicode_escape'))

print('*****调用json方法输出结果*****')
print(r.json())

print('*****提取json中的数据*****')
print(r.json()['data'][0]['v'])

有问题可私信小主!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐