请求模块requests:复杂的网络请求

简介: 请求模块requests(三)

复杂的网络请求
requests模块网络请求,不只有简单的GET与POST。还有复杂的请求头、Cookies以及网络超时等。不过,requests模块将这一系列复杂的请求方式进行了简化,只要在发送请求时设置对应的参数即可实现复杂的网络请求。

1、添加请求头headers
有时候请求一个网页内容时,会发现无论通过GET、POST以及其他请求方式,都会出现403错误。这种现象多数为服务器拒绝了您的访问,那是因为这些网页为了防止恶意采集信息,所使用的反爬虫设置。此时可以通过模拟浏览器的头部信息来进行访问,这样就能解决以上反爬设置问题。下面介绍requests模块添加请求头的方式,示例代码如下:

# 导入网络请求模块requests
import requests

# 创建需要爬取网页的地址
url = 'https://www.baidu.com'

# 创建头部信息
headers = {
   
  "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}

# 发送网络请求
resp = requests.get(url, headers=headers)

# 打印响应状态码
print(resp.status_code)

运行结果如下:

200

2、验证Coookies
有时候爬取网页数据,需要进行网页的登录,才可以进行数据的抓取工作。Cookies登录就像很多网页中的自动登录功能一样,可以让用户第二次登录时在不需要验证账号和密码的情况下进行登录。在使用requests模块实现Cookies登录时,首先需要在浏览器的开发者工具页面中找到可以实现登录的Cookies信息,然后将Cookies处理并添加RequestsCookieJar的对象中,最后将RequestsCookieJar对象作为网络请求的Cookies参数发送网络请求即可。以豆瓣网登录为例,具体步骤如下:

§ 首先通过Chrome浏览器开发工具找到Cookie,如图:

image.png

§ 导入相应模块,将‘找到的登录后网页中的Cookie信息’以字符串形式保存,然后创建RequestsCookieJar()对象并对Cookie信息进行处理,最后将处理后的RequestsCookieJar()对象作为网络请求参数,代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/28/22 6:46 PM
# 文件      :验证cookie登录豆瓣网.py
# IDE      :PyCharm

import requests  # 导入网络请求模块
from lxml import etree  # 导入lxml模块

# 此处填写登录后网页中的cookie信息
cookies = 'll="118144"; bid=j6NSQkV1r_Y; _pk_ses.100001.8cb4=*; __utma=30149280.579477142.1643366325.1643366325.1643366325.1; __utmc=30149280; __utmz=30149280.1643366325.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; dbcl2="253305871:xciB+TYVVkg"; ck=ABZW; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.25330; _pk_id.100001.8cb4=8fd22890377e5e62.1643366324.1.1643366564.1643366324.; __utmb=30149280.7.10.1643366325'
headers = {
   'Host': 'www.douban.com',
           "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" }
# 创建RequestsCookieJar对象,用于设置cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):
      # .split('=', 1) 这个‘1’代表分割一次
    key, value = cookie.split('=', 1)
    cookies_jar.set(key, value)  # 将cookies保存RequestsCookieJar当中
# 发送网络请求
response = requests.get('https://www.douban.com/',
headers=headers, cookies=cookies_jar)
if response.status_code == 200:  # 请求成功时
    html = etree.HTML(response.text)  # 解析html代码
    # 获取用户名
    name = html.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()')
    print(name[0])  # 打印用户名

程序结果如下:

bruce_liu的帐号

3、会话请求
在实现获取某个登录后页面的信息时,可以使用设置Cookies的方式先实现模拟登录,然后在获取登录后页面的信息内容。这样虽然可以成功滴获取页面中的信息,但是比较烦琐。

其实requests模块中提供了Session对象,通过该对象可以实现在同一会话内发送多次网络请求的功能,相当于在浏览器中打开了一个新的选项卡,此时再获取登录后页面中的数据时,可以发送两次请求,第一次发送登录请求,而第二次请求就可以在不设置Cookies的情况下获取登录后的页面数据。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/28/22 7:58 PM
# 文件      :通过session对象实现会话请求.py
# IDE      :PyCharm

import requests        # 导入requests模块
s = requests.Session()  # 创建会话对象
data={
   'username': 'bruce_liu', 'password': '2008_lxw'}  # 创建用户名、密码的表单数据
# 发送登录请求
response =s.post('http://site2.rjkflm.com:666/index/index/chklogin.html',data=data)
response2=s.get('http://site2.rjkflm.com:666')   # 发送登录后页面请求
print('登录信息:',response.text)                # 打印登录信息
print('登录后页面信息如下:\n',response2.text)    # 打印登录后的页面信息

程序运行结果如下:

登录信息: {
   "status":true,"msg":"登录成功!"}
登录后页面信息如下:
 <!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
<meta name="keywords" content="明日科技,thinkphp5.0,编程e学网" />
<meta name="description" content="明日科技,thinkphp5.0,编程e学网" />
<title>编程e学网</title>
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" type="text/css" href="/public/static/index/css/public.css" />
<link rel="stylesheet" type="text/css" href="/public/static/index/css/index.css" />
</head>
相关文章
|
4月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
RT-DETR改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
165 3
RT-DETR改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
|
4月前
|
机器学习/深度学习 计算机视觉 网络架构
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
444 63
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
|
4月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
273 62
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
3月前
|
存储 人工智能 编解码
Deepseek 3FS解读与源码分析(2):网络通信模块分析
2025年2月28日,DeepSeek 正式开源其颠覆性文件系统Fire-Flyer 3FS(以下简称3FS),重新定义了分布式存储的性能边界。本文基于DeepSeek发表的技术报告与开源代码,深度解析 3FS 网络通信模块的核心设计及其对AI基础设施的革新意义。
Deepseek 3FS解读与源码分析(2):网络通信模块分析
|
4月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 优化颈部网络
RT-DETR改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 优化颈部网络
162 10
RT-DETR改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 优化颈部网络
|
4月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
YOLOv11改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
197 9
YOLOv11改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度
|
4月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
171 9
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
4月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 二次创新C3k2 改进颈部网络
YOLOv11改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 二次创新C3k2 改进颈部网络
169 6
YOLOv11改进策略【Neck】| ECCV-2024 RCM 矩形自校准模块 二次创新C3k2 改进颈部网络
|
4月前
|
机器学习/深度学习 计算机视觉 网络架构
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
320 19
|
5月前
|
前端开发 小程序 Java
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
276 3

热门文章

最新文章