请求头是HTTP请求的重要部分,可以用“头部字典”按需定制请求头。
(笔记模板由python脚本于2024年07月12日 19:28:44创建,本篇笔记适合喜欢钻研web知识点的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/140362712
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 简析“请求头”
- 1、请求头的作用
- 2、获取请求头的方法
- 3、 自定义请求头
- 4、urllib基本用法
- 1. 网络请求
- 2. 解码响应内容
- 3. 请求头
- 4. 错误处理
- 5. URL 编码和解码
- 5、URL解码
- 6、页面解析
- 1. 使用正则表达式(`re` 模块)
- 2. 使用 BeautifulSoup
- 3. 使用 XML 解析器
- 4. 使用 JSON 解析器
- 7、“请求头”的“部件”
- 8、模拟浏览器访问url
- 1. 使用Python的`requests`库
- 2. 使用JavaScript的`fetch` API
- 3. 使用Curl命令行工具
- 4. 使用浏览器自动化工具
- 9、访问url的“实际需求”
- 信息检索
- 交互操作
- 功能测试
- 网络爬虫
- 安全检查
- 网络监控
- 个人使用
- 10、按需定制“请求头”
- 1. 用户代理(User-Agent)
- 2. 接受类型(Accept)
- 3. 接受语言(Accept-Language)
- 4. 接受编码(Accept-Encoding)
- 5. 内容类型(Content-Type)
- 6. 认证信息(Authorization)
- 7. 引用(Referer)
- 8. Cookie
- 模拟浏览器访问网页
- 发送JSON数据到API
- 发送表单数据
- 2、算法解析
◆ 简析“请求头”
请求头(HTTP Request Headers)是 HTTP
请求中的一个重要部分,它们提供了关于请求、响应以及客户端和服务器之间的通信方式的额外信息。
1、请求头的作用
以下是请求头的一些主要作用
:
- 身份验证:如
Authorization
头可以用于提供认证信息。 - 内容类型:
Content-Type
头告诉服务器请求正文的 MIME 类型。 - 编码:
Accept-Encoding
头用于指定客户端可以处理的编码类型。 - 语言:
Accept-Language
头用于指定客户端接受的语言。 - 缓存控制:
Cache-Control
头用于指定响应的缓存策略。 - 用户代理:
User-Agent
头包含了发出请求的用户代理软件信息,通常用于浏览器识别。 - 引用:
Referer
头包含了当前请求的原始地址,即从哪个页面发出的请求。
2、获取请求头的方法
在 Python 中,可以使用 urllib
模块来获取请求头。
以下是获取请求头的一个示例
:
import urllib.request
# 发送请求
response = urllib.request.urlopen('http://www.example.com')
# 获取响应头
headers = response.getheaders()
# 打印所有响应头
for header in headers:print(header)
3、 自定义请求头
在发送请求时,有时需要自定义请求头,比如模拟浏览器行为或传递特定的信息。
以下是如何在 Python 中使用 urllib 自定义请求头
:
import urllib.request
# 要发送请求的 URL
url = 'http://www.example.com'
# 自定义请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en-us,en;q=0.5',# 可以添加更多的自定义头部
}
# 创建一个请求对象,并设置自定义头部
req = urllib.request.Request(url, headers=headers)
# 发送请求
response = urllib.request.urlopen(req)
# 读取响应内容
html = response.read().decode('utf-8')
在这个例子中,我们创建了一个 Request
对象,并将自定义的头部字典传递给它。urllib
将使用这些头部信息发送请求。
需要注意的是,某些网站可能会对请求头进行校验,以确保请求来自合法的客户端。如果请求头信息不正确,服务器可能会拒绝请求或返回错误信息。因此,在自定义请求头时,应确保遵守目标网站的要求和规定。
4、urllib基本用法
urllib
是 Python 标准库中的一个模块,它用于读取来自 Web 的数据。
1. 网络请求
使用 urllib.request
可以发送网络请求。
import urllib.request
# 发送请求并读取响应
response = urllib.request.urlopen('http://www.example.com')
html = response.read()
# 打印内容
print(html)
2. 解码响应内容
响应内容通常是以字节形式返回的,可以使用 decode()
方法将其解码为字符串。
html = response.read().decode('utf-8')
3. 请求头
可以通过添加请求头来模拟浏览器行为。
url = 'http://www.example.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
4. 错误处理
使用 try-except
语句可以捕获请求过程中可能出现的异常。
from urllib.error import URLError, HTTPError
try:response = urllib.request.urlopen('http://www.example.com')
except HTTPError as e:print('HTTPError:', e.code)
except URLError as e:print('URLError:', e.reason)
else:print('请求成功')
5. URL 编码和解码
使用 urllib.parse
可以对 URL 进行编码和解码。
from urllib.parse import urlencode, urlparse, parse_qs
# 编码查询参数
params = {'key1': 'value1', 'key2': 'value2'}
encoded_params = urlencode(params)
print(encoded_params) # 输出: key1=value1&key2=value2
# 解析 URL
parsed_url = urlparse('http://www.example.com/index.html;user?id=5#comment')
print(parsed_url.scheme) # 输出: http
print(parsed_url.netloc) # 输出: www.example.com
print(parsed_url.path) # 输出: /index.html
print(parsed_url.query) # 输出: user?id=5
print(parsed_url.fragment) # 输出: comment
# 解析查询字符串
query = 'user?id=5&name=John'
parsed_query = parse_qs(query)
print(parsed_query) # 输出: {'user': [''], 'id': ['5'], 'name': ['John']}
以上是 urllib
的基本用法。在实际使用中,请根据具体需求选择合适的方法。
5、URL解码
在Python中,你可以使用urllib.parse
模块来对URL进行解码。
以下是一个如何对提供的URL进行解码的例子
:
from urllib.parse import unquote
url = 'https://blog.csdn.net/2202_76097976/article/details/140308602?app_version=6.4.0&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22140308602%22%2C%22source%22%3A%22m0_57158496%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app'
decoded_url = unquote(url)
print(decoded_url)
这段代码将输出解码后的URL,其中URL中的百分号编码(例如%7B
)会被替换成对应的字符(例如{
)。
unquote
函数会将URL字符串中的百分号编码的数据解码成原字符。如果你遇到 U R L URL URL中包含中文或其他非ASCII
字符被编码的情况,这个函数也会将这些字符正确解码。如果URL中使用了+
来表示空格(这在URL编码中是允许的),并且你希望将+
解码成空格,你可以使用unquote_plus
函数代替unquote
。
6、页面解析
urllib
本身并不提供页面解析的功能,但通常与 Python 的其他模块如 re
(正则表达式模块)或第三方库如 BeautifulSoup
配合使用来解析读取的页面数据。
以下是几种使用 urllib 读取页面数据并进行解析的方法
:
1. 使用正则表达式(re
模块)
import urllib.request
import re
# 发送请求并读取页面数据
response = urllib.request.urlopen('http://www.example.com')
html = response.read().decode('utf-8')
# 使用正则表达式查找数据
pattern = re.compile(r'<title>(.*?)</title>')
title = pattern.search(html)
if title:print('Page title:', title.group(1))
这段代码将获取页面标题title
,如果re
到文本数据,则打印输出到python终端控制台;否则不输出。
(这段代码,是不科学的。诚然,一般都是可以从url读取到title
的,但也不排除title
为空的情况。最好,加入一个if
分支else: print("页面标题获取失败。")
,以保证title
为空时有消息字符串提示。)
2. 使用 BeautifulSoup
BeautifulSoup
是一个第三方库,它提供了一个非常友好的 API 来解析 HTML 和 XML 文档。首先需要安装 BeautifulSoup 和 解析器(通常是 lxml
或 html.parser
)。
import urllib.request
from bs4 import BeautifulSoup
# 发送请求并读取页面数据
response = urllib.request.urlopen('http://www.example.com')
html = response.read().decode('utf-8')
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(html, 'html.parser')
# 获取页面标题
title = soup.title.string
print('Page title:', title)
# 获取所有链接
for link in soup.find_all('a'):print(link.get('href'))
3. 使用 XML 解析器
如果页面数据是 XML 格式,可以使用 xml.etree.ElementTree
模块进行解析。
import urllib.request
import xml.etree.ElementTree as ET
# 发送请求并读取页面数据
response = urllib.request.urlopen('http://www.example.com/some.xml')
xml_data = response.read().decode('utf-8')
# 使用 ElementTree 解析 XML
root = ET.fromstring(xml_data)
# 遍历 XML 文档
for child in root:print(child.tag, child.attrib)
4. 使用 JSON 解析器
如果页面数据是 JSON 格式,可以使用 json
模块进行解析。
import urllib.request
import json
# 发送请求并读取页面数据
response = urllib.request.urlopen('http://www.example.com/some.json')
json_data = response.read().decode('utf-8')
# 使用 json 模块解析 JSON
data = json.loads(json_data)
# 打印 JSON 数据
print(data)
根据您需要解析的页面数据类型,您可以选择上述方法中的一种。正则表达式适用于简单、有规律的文本匹配,而 BeautifulSoup
则提供了更加强大和灵活的解析能力,适用于复杂的 H T M L HTML HTML 结构。对于 XML
和 JSON
数据,使用专门的解析器可以更加高效和方便。
7、“请求头”的“部件”
在HTTP请求中,“请求头”(HTTP headers)包含了关于请求、响应或者其他的发送信息。并不是所有的字段都需要在每次请求中出现,但有一些基本的字段通常会被包括在内。
以下是一些常见的HTTP请求头字段
:
- Host: 指定请求的服务器的域名和端口号。
- User-Agent: 包含了发出请求的用户代理软件信息。
- Accept: 指定客户端能够接收的内容类型。
- Accept-Language: 指定客户端接受的语言。
- Accept-Encoding: 指定客户端能够解码的内容编码。
- Connection: 控制不同请求之间的网络连接的选项。
- Cookie: 发送服务器之前存储在客户端的cookie。
以下是一些不一定需要在每次请求中都出现的请求头字段
:- Content-Length: 请求体的长度,仅在发送请求体时需要。
- Content-Type: 请求体的类型,仅在发送请求体时需要。
- Authorization: 认证信息,仅在访问受保护的资源时需要。
- Referer: 当前请求页面的来源页面的地址,不是所有请求都需要。
根据请求的具体内容和目的,某些请求头字段可能是可选的或者根本不需要。例如,一个简单的GET请求可能不需要Content-Length
或Content-Type
头,因为没有请求体。而对于需要身份验证的请求,则必须包含Authorization
头。
总的来说,是否包含全部字段信息取决于具体请求的需求。开发者应该根据实际情况和HTTP规范来决定哪些请求头字段是必要的。
8、模拟浏览器访问url
模拟浏览器访问URL通常涉及到使用HTTP客户端来发送请求,并设置相应的请求头来模仿真实浏览器的行为。
以下是一些常见的方法来模拟浏览器访问
:
1. 使用Python的requests
库
你可以使用Python的requests
库来模拟浏览器访问,通过设置User-Agent
等请求头。
import requests
# 设置请求头,模拟Chrome浏览器的User-Agent
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送GET请求
response = requests.get('http://example.com', headers=headers)
# 打印响应内容
print(response.text)
2. 使用JavaScript的fetch
API
在JavaScript中,你可以使用fetch
API来模拟浏览器请求。
// 模拟Chrome浏览器的User-Agent
const headers = new Headers({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
});
// 发送GET请求
fetch('http://example.com', { headers: headers }).then(response => response.text()).then(data => console.log(data)).catch(error => console.error('Error:', error));
3. 使用Curl命令行工具
在命令行中,你可以使用curl
来模拟浏览器请求。
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" \http://example.com
这里-A
参数用于设置User-Agent
请求头。
4. 使用浏览器自动化工具
如果你需要更复杂的模拟,比如处理JavaScript渲染的页面,你可以使用浏览器自动化工具,如Selenium。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 设置Chrome选项以模拟浏览器
options = Options()
options.add_argument("--headless") # 无头模式
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')
# 创建WebDriver实例
driver = webdriver.Chrome(options=options)
# 访问网页
driver.get('http://example.com')
# 获取页面源代码
page_source = driver.page_source
print(page_source)
# 关闭浏览器
driver.quit()
请确保在运行Selenium代码之前已经安装了相应的WebDriver。
以上方法都可以模拟浏览器访问URL,但是如果你需要处理JavaScript渲染的页面或者与页面进行交互,那么使用Selenium等自动化工具会更加合适。
9、访问url的“实际需求”
访问URL的实际需求可以根据不同的场景和目的而有所不同。
以下是一些可能的需求
:
信息检索
- 内容获取:用户或程序需要访问网页以获取信息,如阅读新闻、查询天气、搜索学术资料等。
- 数据抓取:开发者可能需要从网页上抓取数据用于数据分析、机器学习或其他处理。
交互操作
- 用户交互:用户可能需要登录网站、填写表单、参与论坛讨论等。
- API调用:程序可能需要访问API端点以获取数据或触发某些操作,例如在社交媒体上发布消息。
功能测试
- 功能验证:开发者可能需要测试网站的功能是否正常,例如支付流程、用户注册等。
- 性能测试:需要检查网站或服务的响应时间、负载能力等性能指标。
网络爬虫
- 搜索引擎索引:搜索引擎的爬虫需要访问网页以建立索引,便于用户搜索。
- 价格监控:电商监控工具可能定期访问商品页面以监控价格变动。
安全检查
- 漏洞扫描:安全专家可能需要访问网站以检测潜在的安全漏洞。
- 合规性检查:企业可能需要检查网站内容是否符合法律法规的要求。
网络监控
- 网站可用性监控:监控服务需要定期访问网站以确保网站在线并且可以访问。
- 内容监控:可能需要监控特定网页内容的变化,例如新闻更新或政策变动。
个人使用
- 娱乐:用户访问视频、音乐、游戏网站进行娱乐活动。
- 学习:用户访问在线课程、教育资料进行自我提升。
在访问URL时,根据实际需求,可能需要考虑以下因素
:
- 用户代理:模拟不同的浏览器或设备。
- 身份验证:登录或使用API密钥进行访问。
- 数据格式:请求特定格式的数据,如JSON、XML等。
- 频率:确定访问频率,避免对服务器造成过大压力。
- 遵守规则:遵循网站的服务条款和robots.txt文件规定。
- 网络环境:考虑网络延迟、代理、VPN等因素。
根据不同的需求,访问URL的方法和使用的工具也会有所不同。例如,简单的数据抓取可能只需要使用requests
库,而复杂的交互可能需要使用Selenium或其他自动化工具。
10、按需定制“请求头”
根据不同的需求配置请求头,通常需要考虑以下几个方面
:
1. 用户代理(User-Agent)
- 模拟浏览器访问:设置与目标浏览器一致的
User-Agent
字符串。 - 避免被屏蔽:某些服务器可能会屏蔽爬虫或非主流浏览器的请求,因此可能需要伪装成主流浏览器的用户代理。
- API访问:对于API调用,可能需要提供API指定的用户代理字符串。
2. 接受类型(Accept)
- 获取网页内容:通常设置为
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
。 - API调用:可能需要设置为
application/json
或其他数据格式。
3. 接受语言(Accept-Language)
- 本地化内容:根据需求设置特定的语言,如
en-US
、zh-CN
等。
4. 接受编码(Accept-Encoding)
- 压缩内容:通常设置为
gzip, deflate
以接受压缩内容,减少数据传输量。
5. 内容类型(Content-Type)
- 发送数据:在发送POST或PUT请求时,需要根据发送的数据类型设置,如
application/json
、application/x-www-form-urlencoded
等。
6. 认证信息(Authorization)
- 需要认证的请求:设置正确的认证信息,如Bearer Token或Basic认证。
7. 引用(Referer)
- 防止盗链:某些服务器会检查请求的来源,因此需要设置正确的
Referer
字段。
8. Cookie
- 维持会话状态:在需要维持登录状态或会话信息时,需要携带正确的Cookie。
以下是根据不同需求配置请求头的示例
:
模拟浏览器访问网页
import requests
# 模拟Chrome浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en-US,en;q=0.5','Accept-Encoding': 'gzip, deflate'
}
response = requests.get('http://example.com', headers=headers)
发送JSON数据到API
import requests
# 发送JSON数据
headers = {'Content-Type': 'application/json','Authorization': 'Bearer your_token_here'
}
data = {'key': 'value'}
response = requests.post('http://api.example.com/data', headers=headers, json=data)
发送表单数据
import requests
# 发送表单数据
headers = {'Content-Type': 'application/x-www-form-urlencoded'
}
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://example.com/form', headers=headers, data=data)
在配置请求头时,应当根据具体需求以及目标服务器的预期来设置。同时,要确保遵守目标网站的使用条款和隐私政策,不要进行任何违法或侵犯他人权益的行为。
2、算法解析
上一篇: 编程学单词:delta(希腊字母Δ/δ)(希腊字母表的第四个字母,大写为Δ,小写为δ)
下一篇:
我的HOT博:
本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。
-
001
标题:让QQ群昵称色变的神奇代码
(浏览阅读 5.9w )
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:25 收藏:86 评论:17
摘要:让QQ昵称色变的神奇代码。
首发:2022-01-18 19:15:08
最后编辑:2022-01-20 07:56:47 -
002
标题:Python列表(list)反序(降序)的7种实现方式
(浏览阅读 1.1w )
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:8 收藏:35 评论:8
摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
首发:2022-12-11 23:54:15
最后编辑:2023-03-20 18:13:55 -
003
标题:pandas 数据类型之 DataFrame
(浏览阅读 9.7k )
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:7 收藏:36
摘要:pandas 数据类型之 DataFrame_panda dataframe。
首发:2022-05-01 13:20:17
最后编辑:2022-05-08 08:46:13 -
004
标题:个人信息提取(字符串)
(浏览阅读 8.2k )
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:2 收藏:15
摘要:个人信息提取(字符串)_个人信息提取python。
首发:2022-04-18 11:07:12
最后编辑:2022-04-20 13:17:54 -
005
标题:Python字符串居中显示
(浏览阅读 7.6k )
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
评论:1 -
006
标题:罗马数字转换器|罗马数字生成器
(浏览阅读 7.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
摘要:罗马数字转换器|生成器。
首发:2022-01-19 23:26:42
最后编辑:2022-01-21 18:37:46 -
007
标题:回车符、换行符和回车换行符
(浏览阅读 6.0k )
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
首发:2022-02-24 13:10:02
最后编辑:2022-02-25 20:07:40
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)