简析“请求头”——可以用“头部字典”按需定制请求头

请求头是HTTP请求的重要部分,可以用“头部字典”按需定制请求头。


(笔记模板由python脚本于2024年07月12日 19:28:44创建,本篇笔记适合喜欢钻研web知识点的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


请求头是HTTP请求的重要部分
简析“请求头”
(可以用“头部字典”按需定制请求头)


本文质量分:

96 96 96

本文地址: 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、请求头的作用


  • 以下是请求头的一些主要作用
  1. 身份验证:如 Authorization 头可以用于提供认证信息。
  2. 内容类型Content-Type 头告诉服务器请求正文的 MIME 类型。
  3. 编码Accept-Encoding 头用于指定客户端可以处理的编码类型。
  4. 语言Accept-Language 头用于指定客户端接受的语言。
  5. 缓存控制Cache-Control 头用于指定响应的缓存策略。
  6. 用户代理User-Agent 头包含了发出请求的用户代理软件信息,通常用于浏览器识别。
  7. 引用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 和 解析器(通常是 lxmlhtml.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 结构。对于 XMLJSON 数据,使用专门的解析器可以更加高效和方便。



回页目录


7、“请求头”的“部件”


  在HTTP请求中,“请求头”(HTTP headers)包含了关于请求、响应或者其他的发送信息。并不是所有的字段都需要在每次请求中出现,但有一些基本的字段通常会被包括在内。


  • 以下是一些常见的HTTP请求头字段
  1. Host: 指定请求的服务器的域名和端口号。
  2. User-Agent: 包含了发出请求的用户代理软件信息。
  3. Accept: 指定客户端能够接收的内容类型。
  4. Accept-Language: 指定客户端接受的语言。
  5. Accept-Encoding: 指定客户端能够解码的内容编码。
  6. Connection: 控制不同请求之间的网络连接的选项。
  7. Cookie: 发送服务器之前存储在客户端的cookie。

  • 以下是一些不一定需要在每次请求中都出现的请求头字段
    • Content-Length: 请求体的长度,仅在发送请求体时需要。
    • Content-Type: 请求体的类型,仅在发送请求体时需要。
    • Authorization: 认证信息,仅在访问受保护的资源时需要。
    • Referer: 当前请求页面的来源页面的地址,不是所有请求都需要。


  根据请求的具体内容和目的,某些请求头字段可能是可选的或者根本不需要。例如,一个简单的GET请求可能不需要Content-LengthContent-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的实际需求可以根据不同的场景和目的而有所不同。


以下是一些可能的需求


信息检索

  1. 内容获取:用户或程序需要访问网页以获取信息,如阅读新闻、查询天气、搜索学术资料等。
  2. 数据抓取:开发者可能需要从网页上抓取数据用于数据分析、机器学习或其他处理。

交互操作

  1. 用户交互:用户可能需要登录网站、填写表单、参与论坛讨论等。
  2. API调用:程序可能需要访问API端点以获取数据或触发某些操作,例如在社交媒体上发布消息。

功能测试

  1. 功能验证:开发者可能需要测试网站的功能是否正常,例如支付流程、用户注册等。
  2. 性能测试:需要检查网站或服务的响应时间、负载能力等性能指标。

网络爬虫

  1. 搜索引擎索引:搜索引擎的爬虫需要访问网页以建立索引,便于用户搜索。
  2. 价格监控:电商监控工具可能定期访问商品页面以监控价格变动。

安全检查

  1. 漏洞扫描:安全专家可能需要访问网站以检测潜在的安全漏洞。
  2. 合规性检查:企业可能需要检查网站内容是否符合法律法规的要求。

网络监控

  1. 网站可用性监控:监控服务需要定期访问网站以确保网站在线并且可以访问。
  2. 内容监控:可能需要监控特定网页内容的变化,例如新闻更新或政策变动。

个人使用

  1. 娱乐:用户访问视频、音乐、游戏网站进行娱乐活动。
  2. 学习:用户访问在线课程、教育资料进行自我提升。


  在访问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-USzh-CN等。

4. 接受编码(Accept-Encoding)

  • 压缩内容:通常设置为gzip, deflate以接受压缩内容,减少数据传输量。

5. 内容类型(Content-Type)

  • 发送数据:在发送POST或PUT请求时,需要根据发送的数据类型设置,如application/jsonapplication/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篇。


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值