静态网页处理复杂请求

目录

1.定制请求头

(1).查看请求头

(2).设置请求头

 2.验证 Cookie

3.保持会话

4. SSL 证书验证

         在互联网中,网页中的内容是千变万化的,如果只根据请求 URL 发送基本请求,则可能
无法获取网站的响应数据,此时需要根据网站接收请求的要求来完善请求。例如,在访问登
录后的页面时需要给请求头带上 Cookies ,在遇到 403 错误时需要给请求头添加 User-Agent
接下来,本节将针对处理复杂请求的内容进行详细讲解。

1.定制请求头

        网络爬虫在发送请求抓取部分网页内容(如知乎网首页)时,可能会遇到服务器返回的
403 错误,即服务器有能力处理请求,但拒绝处理该客户端发送的请求。之所以出现服务
器拒绝访问的问题,是因为这些网页为防止网络爬虫恶意抓取网页信息加入了防爬虫措施。
它们通过检查该请求的请求头,判定发送本次请求的客户端不是浏览器,而可能是一个网
络爬虫。
        为了解决这个问题,需要为网络爬虫发送的请求定制请求头,使该请求伪装成一个由浏
览器发起的请求,即在请求头中添加字段 User-Agent ,并将这个字段设为浏览器在发送相同
请求时使用的 User-Agent
        定制请求头分为两步,即查看请求头和设置请求头。下面以知乎网登录页面为例,为大
家演示如何查看由浏览器发送请求的请求头信息,并根据该请求头中的 User-Agent 设置网络
爬虫的请求头,具体步骤如下。

(1).查看请求头

打开 Fiddler 工具,在 Chrome 浏览器中加载知乎网登录页面,完成加载后切换至 Fiddler
工具。在窗口左侧选中刚刚发送的 HTTP 请求,并且在窗口右侧查看该请求对应的请求头信
息,具体如图 3-3 所示。
        从图 3-3 中可以看出,字段 User-Agent 的值为 Mozilla/5.0 (Windows NT 6.1; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36

(2).设置请求头

Requests 中,设置请求头的方式非常简单:只需要在调用请求函数时为 headers 参数传
入定制好的请求头即可。一般是将请求头中的字段与值分别作为字典的键与值,以字典的形
式传给 headers 参数。示例代码如下
import requests 
# 定义 URL 和请求头
base_url = 'https://www.zhihu.com/signin' 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64' 
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'} 
# 根据 URL 和请求头构造请求,发送 GET 请求,接收服务器返回的响应
response = requests.get(base_url, headers=header) 
response.encoding = 'utf-8' 
# 查看响应内容
print(response.text)
        在上述代码中,首先定义了代表知乎网登录页面 URL 的变量 base_url 和代表请求头的变
header 。在请求头中以键值对的形式添加了 User-Agent 字段,并将该字段的值设为
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/90.0.4430.212 Safari/537.36 。然后调用了 get() 函数根据 base_url 发送 GET 请求到服务
器,指定请求头为 header ,并使用变量 response 接收服务器返回的响应。最后访问 response
text 属性获取了网页源代码。
运行代码,输出( HTML 格式化之后)如下结果。

 

<!DOCTYPE html> 
<html lang="zh" data-hairline="true" data-theme="light"> 
 <head> 
 <meta charset="utf-8" /> 
 <title data-react-helmet="true">知乎 - 有问题,就会有答案</title> 
 <meta name="viewport" 
 content="width=device-width,initial-scale=1,maximum-scale=1" /> 
 <meta name="renderer" content="webkit" /> 
 <meta name="force-rendering" content="webkit" /> 
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> 
 <meta name="google-site-verification" 
 content="FTeR0c8arOPKh8c5DYh_9uu98_zJbaWw53J-Sch9MTg" /> 
 ……
 </body> 
</html>
        对比从浏览器中查看的源代码可知,程序成功抓取了知乎网登录页面的源代码。
需要注意的是,如果程序使用同一个 User-Agent 字段访问网站的频率过高,那么程序也
有可能会被网站识别成网络爬虫,并被查封。为解决这个问题,可以收集所有可用的
User-Agent ,在向服务器发送请求时每隔一段时间便随机选择一个 User-Agent ,设置动态的请
求头。除此之外,还可以使用能够自动生成 User-Agent fake-useragent 模块。

 2.验证 Cookie

        当用户首次登录一个网站时,网站往往会要求用户输入用户名和密码,并且给出自动登
录选项供用户勾选。用户如果勾选了自动登录选项,那么在下一次访问该网站时,不用输入
用户名和密码便可以登录,这是因为第一次登录时服务器发送了包含登录凭证的 Cookie 到用
户硬盘上,第二次登录时浏览器发送了 Cookie ,服务器验证 Cookie 后就识别了用户的身份,
用户便无须输入用户名和密码。
        Cookie(有时也用其复数形式 Cookies )是指某些网站为了辨别用户身份、进行会话跟踪,
而暂时存储在客户端的一段文本数据(通常经过加密)。
        在 Requests 库中,发送请求时可以通过两种方式携带 Cookie ,一种方式是直接将包含
Cookie 信息的请求头传入请求函数的 headers 参数;另一种方式是将 Cookie 信息传入请求函
数的 cookies 参数。不过, cookies 参数需要接收一个 RequestsCookieJar 类的对象,该对象类
似于一个字典,会以名称(Name )与值( Value )的形式存储 Cookie
        下面以登录后的百度首页为例,分别通过上述两种方式演示如何使用Requests 实现 Cookie
登录。
1 种方式的实现代码如下。

 

import requests 
headers = { 
 'Cookie': '此处填写登录百度网站后查看的 Cookie 信息', # 设置字段 Cookie 
 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4)' 
 'AppleWebKit/537.36 (KHTML, like Gecko)' 
 'Chrome/53.0.2785.116 Safari/537.36',} # 设置字段 User-Agent 
response = requests.get('https://www.baidu.com/', headers=headers) 
print(response.text)

2 种方式的实现代码如下。

import requests 
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) ' 
 'AppleWebKit/537.36 (KHTML, like Gecko)' 
 'Chrome/53.0.2785.116 Safari/537.36'} 
# 准备 Cookie 
cookie = '此处填写登录百度网站后查看的 Cookie 信息' 
# 创建 RequestsCookieJar 类的对象
jar_obj = requests.cookies.RequestsCookieJar() 
# 以逗号为分隔符分隔 Cookie,并将获得的键和值保存至 jar_obj 中
for temp in cookie.split(';'): 
 key, value = temp.split('=', 1) 
 jar_obj.set(key, value) 
response = requests.get('https://www.baidu.com/', 
 headers=header, cookies=jar_obj) 
print(response.text)

上述两段代码的运行结果如下。

...... 
"userAttr":Number("")|| 0, 
"username":"Itcast_001122", 
"unametype":"2", 
"userIsSkined":"off", 
"userIsNewSkined":"off", 
"userSkinName":"", 
"userSkinOpacity":"70", 
……
由加粗部分的代码可以看出,程序输出的网页源代码包含了用户名 Itcast_001122 。这说明
我们成功地访问了登录后的百度首页。

3.保持会话

        我们在浏览拼多多网站时,只要在拼多多网站中登录成功一次,就可以连续打开多个商
品的标签页,中途浏览其他网页再快速回到拼多多网站也不需要重复登录,除非离开网站的
时间过长。这些情况便是保持会话的体现。
        在 Requests 中, Session 类负责管理会话。通过 Session 类的对象不仅可以实现在同一会
话内发送多次请求的功能,还可以在跨请求时保持 Cookie 信息。
例如,使用 Session 类的对象请求一个测试网站时设置 Cookie 信息,然后在请求另一个
网站时获取 Cookie 信息,具体代码如下。
import requests 
# 创建会话
sess_obj = requests.Session() 
sess_obj.get('http://httpbin.org/cookies/set/sessioncookie/123456789') 
response = sess_obj.get("http://httpbin.org/cookies") 
print(response.text)
        在上述代码中,首先创建了一个 Session 类的对象 sess_obj 。然后基于 sess_obj 对象发送
了一个 GET 请求到测试网站,并且在请求该测试网站时设置了 Cookie 信息。其中 Cookie
名称设置为 sessioncookie ,内容为 123456789 。最后基于 sess_obj 对象请求另一个网站,获取
上次请求时设置的 Cookie 信息。
运行代码,输出如下结果。

 

{ 
 "cookies": { 
 "sessioncookie": "123456789" 
 } 
}
        从输出结果可以看出,程序成功地获取了 Cookie 信息。这说明使用 Session 类的对象在
跨请求时可以成功保持 Cookie 信息。
        如果不使用 Session 类的对象请求测试网站,而直接使用 Requests 库请求测试网站时,示
例代码如下所示。
import requests 
requests.get('http://httpbin.org/cookies/set/sessioncookie/123456789') 
response = requests.get("http://httpbin.org/cookies") 
print(response.text)

运行程序,输出如下结果。 

{"cookies": {}}
        从输出的结果可以看出,程序并没有获取 Cookie 信息。这说明两次发送的请求属于完全
独立的请求,它们之间无法保持 Cookie 信息。

4. SSL 证书验证

        大多数网站中都加入了 SSL 证书,以实现数据信息在浏览器和服务器之间的加密传输,
保证双方传递信息的安全性。 SSL 证书是一种数字证书,类似于驾驶证、护照和营业执照的
电子副本,由受信任的数字证书颁发机构 CA 在验证服务器身份后颁发,具有服务器身份验证
和数据传输加密功能。
        当使用 Requests 调用请求函数发送请求时,由于请求函数的 verify 参数的默认值为 True
所以每次请求网站默认都会进行 SSL 证书的验证。不过,有些网站可能没有购买 SSL 证书,
或者 SSL 证书失效。程序访问这类网站时会因为找不到 SSL 证书而抛出 SSLError 异常。例如,  
使用 Requests 请求国家数据网站,具体代码如下。

 

import requests 
base_url = 'https://data.stats.gov.cn/' 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64' 
 'AppleWebKit/537.36 (KHTML, like Gecko)' 
 'Chrome/90.0.4430.212 Safari/537.36'} 
# 发送 GET 请求
response = requests.get(base_url, headers=header) 
print(response.status_code)

运行代码,程序抛出 SSLError 异常,具体内容如下。 

 

...... 
requests.exceptions.SSLError: HTTPSConnectionPool(host='data.stats.gov.cn', port= 
443): Max retries exceeded with url: / (Caused by SSLError(SSLCert Verification Error(1, 
'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in 
certificate chain (_ssl.c:1108)')))

这时需要主动关闭 SSL 验证,即在调用 get()函数时将 verify 参数设置为 False,代码如下。 

 

response = requests.get(base_url, headers=header, verify=False)

再次运行代码,发现控制台没有输出 SSLError 异常,而是输出了如下警告信息。 

C:\Users\admin\AppData\Roaming\Python\Python38\site-packages\urllib3\ 
connectionpool.py:981: InsecureRequestWarning: Unverified HTTPS request 
is being made to host 'data.stats.gov.cn'. Adding certificate verification is 
strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage. 
html#ssl-warnings

这时,如果不希望收到警告信息,则可以采用如下方式消除警告信息。 

 

import urllib3 
urllib3.disable_warnings()

再次运行程序,发现控制台中不再输出上面的警告信息。 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基 CanMV 的 C 开发环境搭建(Linux,Ubuntu篇)

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

如何调用讯飞星火认知大模型的API以利用其卓越功能

摘要 讯飞星火认知大模型&#xff0c;作为科大讯飞精心打造的一款人工智能模型&#xff0c;在自然语言理解和生成方面展现出了卓越的能力。这款模型通过深度学习技术和大量数据的训练&#xff0c;具备了强大的语言理解、文本生成和对话交互等功能。 一、模型功能概述 讯飞星…

XXL-Job实战(一)

​需求介绍&#xff1a;构建一个分布式短信发送系统&#xff0c;应对双十一活动需向1000万用户快速推送营销短信的挑战&#xff0c;每条数据的业务处理逻辑为0.1s。对于普通任务来说&#xff0c;只有一个线程来处理 可能需要10万秒才能处理完&#xff0c;业务则严重受影响。 常…

【Maven】项目的Maven插件报错

1. 找到本地maven库 2. 删除本地插件 3. 在IDEA上更新pom.xml

从零开始学代码写了一个心理学知识导航站

我从零编码经验开始开发一个网站。最初我只是想把自己收集到的心理学知识和一些资源分享出来&#xff0c;希望能够让更多的用户受益。 然而&#xff0c;在写作时&#xff0c;我意识到&#xff0c;尽管函数和界面是使用 GPT 从头开始​​手工编写的&#xff0c;而且我没有使用所…

【Axure教程】移动端多选图片上传

在移动端应用中&#xff0c;提供多选图片上传功能对于用户体验和功能性具有重要意义&#xff0c;尤其是在像微信、微博等社交媒体平台上。 例如用户可以快速上传多张图片进行分享&#xff0c;发布相册或创建图文并茂的动态&#xff1b;卖家可以一次性上传多个产品图片&#xf…

求职难遇理想offer!!【送源码】

现在的求职行情确实不太好&#xff0c;有很多抱怨自己找到的工作技术栈落后的同学&#xff0c;我也是建议他们接下先干着。不能幻想毕业之后还能找到更合适的工作&#xff0c;那个时候就基本只能参加社招了&#xff0c;没有工作经验参加社招想要获得满意 offer 的更是地狱难度。…

如何在软件开发时代实现技术+业务的双重突破?【含资源】

在当前的软件开发时代&#xff0c;许多企业面临着核心技术缺失、专业人才短缺以及产品能力单一等问题&#xff0c; 迫切需要加强技术实力&#xff0c;补充和扩展原有的业务和行业能力。 将技术与业务需求深度结合&#xff0c;构建适应时代需求的技术业务模式&#xff0c;成为软…

深入了解常用负载均衡软件

在构建高性能、高可用的分布式系统时&#xff0c;负载均衡技术扮演着至关重要的角色。它通过合理分发网络请求到后端服务器集群&#xff0c;从而有效提升系统吞吐量、减少响应延迟、并保障系统的稳定运行。本文将介绍几种常用的负载均衡软件&#xff0c;包括它们的优缺点、应用…

算法体系-23 第二十三节:暴力递归到动态规划(五)

一 求K次打击之后&#xff0c;英雄把怪兽砍死的概率 1.1 描述 给定3个参数&#xff0c;N&#xff0c;M&#xff0c;K 怪兽有N滴血&#xff0c;等着英雄来砍自己 英雄每一次打击&#xff0c;都会让怪兽流失[0~M]的血量 到底流失多少&#xff1f;每一次在[0~M]上等概率的获得一个…

小摩法兴纷纷转多,看涨港股的时机来了吗?

恒生指数今日高开一度上涨89点报18520点&#xff0c;创近两周高。之后持续震荡下行&#xff1b;恒指临近中 午跌幅扩大&#xff0c;恒生科技指数一度跌近1.5%。截止收盘&#xff0c;恒生指数跌0.52%&#xff0c;盘面上&#xff0c;石油、煤炭、环保、建筑节能等板块涨幅居前&a…

Opencv学习项目3——pytesseract

上一次我们使用pytesseract.image_to_data(img)来检测文本&#xff0c;这次我们来只检测数字 项目演示 可以看到&#xff0c;我们只检测了数字其他的并没有检测出来 代码实现 前面两次介绍了opencv的画矩形和设置文本&#xff0c;这次就直接用了&#xff0c;不太明白的可以看…

增加了redis分布式锁,但是还是生成了重复数据

增加了redis分布式锁&#xff0c;但是还是生成了重复数据 原因 两个线程 第一个线程先获取锁&#xff0c;然后进行新增&#xff0c;此时第二个线程也进入方法体&#xff0c;尝试获取锁&#xff0c;结果没获取到&#xff0c;继续在5s内尝试&#xff0c;在redis获取锁等待5s的过…

DevExpress WPF中文教程:Grid - 如何将更改发布到数据库(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

RapidLayout:中英文版面分析推理库

引言 继上一篇文章之后&#xff0c;我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中&#xff0c;便于大家快速使用。 不曾想到&#xff0c;我这整理工作越做越多了&#xff0c;好在整体都是往更好方向走。 起初&#xff0c;rapid_layout项目是在RapidStru…

ES中下载ik解决版本不一致问题

1.链接&#xff1a; https://github.com/infinilabs/analysis-ik/releases/tag/v7.17.7 2.我的ES版本是7.17.9 但是Ik没有7.19&#xff0c;只有7.17 3.下载之后创建ik&#xff0c;然后把下载的导入进去&#xff1a; 4.因为版本不一致 我们修改 把所有的7.17.7改为7.17.9然…

Spring AI 整合openAI的chatGpt

Spring AI支持ChatGPT&#xff0c;这是OpenAI的AI语言模型。ChatGPT在激发人们对人工智能驱动文本生成的兴趣方面发挥了重要作用。 SpringAi与Spring Boot 的整合详见上一篇文章&#xff1a; Spring AI 介绍以及与 Spring Boot 项目整合 下面分四个部分来分别说明和演示&#…

Day01 数据结构概述

目录 一、数据结构概述 1、基本概念 2、数据结构 3、逻辑关系&#xff08;线性结构&非线性结构&#xff09; 4、物理结构&#xff08;存储结构&#xff09; 5、算法 6、算法特征 二、时空复杂度 1、时间复杂度 2、空间复杂度 3、结构类型 一、数据结构概述 1、…

体育时间:“中国第一”的出海代表们,一致瞄准了这一赛道?

2024年无疑又是一个体育赛事超级大年。 从1月的亚洲杯&#xff0c;2月的世乒团体锦标赛、第14届冬运会、到6月欧洲杯与美洲杯隔空对决&#xff0c;巴黎奥运会也将在7月盛大开赛&#xff0c;随后则还有8月的巴黎残奥会&#xff0c;对于期待万分的体育粉丝们&#xff0c;这将是极…

后端不提供文件流接口,前台js使用a标签实现当前表格数据(数组非blob数据)下载成Excel

前言&#xff1a;开发过程中遇到的一些业务场景&#xff0c;如果第三方不让使用&#xff0c;后端不提供接口&#xff0c;就只能拿到table数据(Array)&#xff0c;实现excel文件下载。 废话不多说&#xff0c;直接上代码&#xff0c;方法后续自行封装即可&#xff1a; functio…