当前位置: 首页 > news >正文

Python爬虫基础之Requests详解

目录

  • 1. 简介
  • 2. 安装
  • 3. 发送请求
  • 4. 处理响应
  • 5. IP代理
  • 6. Cookie登录
  • 参考文献

原文地址:https://program-park.top/2023/10/27/reptile_4/

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。

1. 简介

  Requests 是用 Python 编写,基于 urllib,采用 Apache2 Licensed 开源协议认证的 HTTP 库。它支持 HTTP 连接保持和连接池、cookie 保持会话、文件上传、自动响应内容编码,以及国际化的 URL 和 POST 数据自动编码等,比 urllib 更加方便简洁,在日常开发中可以节约我们大量的时间。
  这是 Requests 官网的描述:

  • 官方文档:
    • https://requests.readthedocs.io/projects/cn/zh_CN/latest/
  • 快速上手:
    • https://requests.readthedocs.io/projects/cn/zh_CN/latest/user/quickstart.html

2. 安装

  因为是第三方库,所以我们需要使用 pip 下载:

pip install requests

  使用时直接导入 requests 模块即可:

import requests

3. 发送请求

  首先,我们先从最简单的 HTTP 请求开始,发送一个 GET 请求到指定的 URL,获取响应数据:

import requestsurl = 'https://www.baidu.com/s'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}
data = {'wd': '北京'
}
response = requests.get(url = url, headers=headers, params=data)
print(response.text)

  除了发送 GET 请求,我们还可以发送其他类型的请求,例如 POST 请求:

import requestsurl = 'http://fanyi.baidu.com/sug'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}
data = {'kv': 'eye'
}
response = requests.post(url=url, headers=headers, data=data)
print(response.text)

  这里需要注意的是,Get 请求的参数名字是params,Post 请求的参数名字是data
  我们正常在发送请求时,会带上一些请求参数,比如 params、data、json、files、timeout、headers、cookies 等等,下面是常用参数的具体说明:

参数释义示例
url请求的 URL 地址,必选参数url=http://program-park.top
paramsurl 请求的参数(dict 字典),一般用于 get 请求,post 请求也可用params={‘key1’:‘value1’, ‘key2’:‘value2’}
datapost 请求的参数,字典(dict) 或文件类对象(file-like object)data={‘key1’:‘value1’, ‘key2’:‘value2’}
jsonpost 请求的 json 参数json={‘key1’:‘value1’, ‘key2’:‘value2’}
filespost 请求文件流数据,字典上传files={‘file’:open(‘report.xls’, ‘rb’)} 或 files={‘file’: (‘report.xls’, open(‘report.xls’, ‘rb’), ‘application/vnd.ms-excel’, {‘Expires’:‘0’})}
timeout请求响应的最长等待时间。默认 Nonetimeout=5
headershttp 请求头(HTTP Headers)信息headers={‘user-agent’:‘my-app/0.0.1’}
cookies字典 dict 或 cookie 对象cookie={‘cookie_are’:“working”}
verify默认 True,为 False 时忽略对 SSL 证书的验证,还可以接收 SSL 证书的路径,为会话加载 SSL 证书。verify=False
cert指定一个班底证书用作客户端证书,可以是单个文件或一个包含两个文件路径的元组,本地的私有 key 必须是解密状态cert=(‘/path/client.cert’, ‘/path/client.key’) 或 cert=(‘/path/client.pem’)
authHTTP 验证信息from requests.auth import HTTPBasicAuth
auth = HTTPBasicAuth()

  当然,Requests 支持的请求方式不只这两种:

requests.post('')
requests.put('')
requests.delete('')
requests.head('')
requests.options('')

4. 处理响应

  说完发送请求的相关知识点,下面就是接收到响应后如何做处理了,Requests 库提供了丰富的方法来处理响应数据:

属性或方法说明
apparent_encoding编码方式
close()关闭与服务器的连接
content返回响应的内容,以字节为单位
cookies返回一个 CookieJar 对象,包含了从服务器发回的 cookie
elapsed返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
encoding解码 r.text 的编码方式
headers返回响应头,字典格式
history返回包含请求历史的响应对象列表(url)
is_permanent_redirect如果响应是永久重定向的 url,则返回 True,否则返回 False
is_redirect如果响应被重定向,则返回 True,否则返回 False
iter_content()迭代响应
iter_lines()迭代响应的行
json()返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)
links返回响应的解析头链接
next返回重定向链中下一个请求的 PreparedRequest 对象
ok检查 “status_code” 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
raise_for_status()如果发生错误,方法返回一个 HTTPError 对象
reason响应状态的描述,比如 “Not Found” 或 “OK”
request返回请求此响应的请求对象
status_code返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
text返回响应的内容,unicode 类型数据
url返回响应的 URL

  这里我就不做演示了,都是些很基础的方法,上手一试便知。

5. IP代理

  Requests 基础的发送请求、处理响应说完之后,还需讲一下如何使用代理 IP 来发送请求,这个之前在 urllib 的教程中也说过,就直接上代码了,在快代理(https://www.kuaidaili.com/free/)白嫖个能用的代理做个示例:

import requestsurl = 'http://www.baidu.com/s?'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}
data = {'wd': 'ip'
}
proxy = {'http': 'http://101.200.185.203:16816'
}
response = requests.get(url=url, headers=headers, params=data, proxies=proxy)
content = response.text
with open('daili.html', 'w', encoding='utf-8') as fp:fp.write(content)

6. Cookie登录

  Cookie 是一种保存在电脑上的一种文件,当我们使用电脑进行浏览网页的时候,服务器就会生成一个证书,并且返回给我们的电脑,这个证书就是 Cookie,一般情况下,Cookie 是服务器写入客户端的文件,我们也可以叫浏览器缓存。
  一般情况下,网站是通过 Cookie 对请求进行保存,会根据用户进行特定的内容进行展示,也可以对密码进行存储,Cookie 文件是以浏览器为载体,并且有浏览器为支撑,我们可以在浏览器中设置阻止,这样的话,服务器就不能写进 Cookie,现在很多浏览器都是能支持 Cookie,不过有些时候,网站访问不支持 Cookie 的话,会出现浏览器不能访问的情况。
  这里结合登录古诗文网(https://www.gushiwen.cn/)的案例来讲解如何使用 Requests 实现 Cookie 登录。使用 Requests 处理 Cookie 有三种方法:

  • Cookie 字符串放在 headers 中;
  • Cookie 字典放在请求方法requests.get()中作为参数接收;
  • 使用 Requests 提供的 session() 方法。

  我这里就只讲解第三个方法,因为前两个都需要手动添加 Cookie,一般企业开发用不到。Requests 提供了一个叫session()的方法,来实现客户端和服务端的会话保持,会话保持主要作用是保存 Cookie,下次请求会带上上次的 Cookie,以及实现和服务端的长连接,加快请求速度。使用方法:

session = requests.session()
response = session.get(url,headers)

  那么话不多说,直接上案例代码:

import requests# 古诗文官网的登录地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}# 获取页面源码
response = requests.get(url=url, headers=headers)
content = response.text# 解析页面源码,获取__VIEWSTATE和__VIEWSTATEGENERATOR
from bs4 import BeautifulSoupsoup = BeautifulSoup(content, 'lxml')# 获取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code# 会话保持
seeion = requests.session()
# 验证码的url内容
response_code = seeion.get(code_url)
content_code = response_code.contentwith open('code.jpg', 'wb') as fp:fp.write(content_code)# 获取验证码后保存到本地,观察验证码后输入
code_name = input('输入验证码:')# 点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {'__VIEWSTATE': viewstate,'__VIEWSTATEGENERATOR': viewstategenerator,'from': 'http://so.gushiwen.cn/user/collect.aspx','email': 'lkm869666@126.com','pwd': 'XXXXXX','code': code_name,'denglu': '登录'
}response_post = seeion.post(url=url, headers=headers, data=data_post)
content_post = response_post.textwith open('gushiwen.html', 'w', encoding='utf-8') as fp:fp.write(content_post)

  观察上面的案例可以发现,在登录过程中,有一个图片验证码需要输入,我们这里是将图片保存到本地,手动输入图片的验证码接着再登录。其实在实际的企业开发中,这一步也是需要我们自动化去完成的,一般都是结合一些第三方打码平台(一般都是收费的)来调用接口,自动输入验证码。比如超级鹰(https://www.chaojiying.com/),这里会有自己的开发文档,里面有各个语言的 Demo,这个我就不详细说了,官网都是傻瓜式教程。

参考文献

  【1】https://requests.readthedocs.io/projects/cn/zh_CN/latest/
  【2】https://requests.readthedocs.io/projects/cn/zh_CN/latest/user/quickstart.html
  【3】https://cloud.tencent.com/developer/article/2345961
  【4】https://zhuanlan.zhihu.com/p/366457854
  【5】https://blog.csdn.net/ctrlthh/article/details/133820373
  【6】https://www.runoob.com/python3/python-requests.html
  【7】https://www.cnblogs.com/lanyinhao/p/9634742.html
  【8】https://zhuanlan.zhihu.com/p/137649301
  【9】https://zhuanlan.zhihu.com/p/33288426
  【10】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=84
  【11】https://www.php.cn/faq/413706.html
  【12】https://blog.51cto.com/u_14691/6678457

相关文章:

Python爬虫基础之Requests详解

目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址:https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由…...

C++求根节点到叶子节点数字之和

文章目录 题目链接题目描述解题思路代码复杂度分析 题目链接 LCR 049. 求根节点到叶节点数字之和 - 力扣(LeetCode) 题目描述 给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表…...

C++搜索二叉树

本章主要是二叉树的进阶部分,学习搜索二叉树可以更好理解后面的map和set的特性。 1.二叉搜索树概念 二叉搜索树的递归定义为:非空左子树所有元素都小于根节点的值,非空右子树所有元素都大于根节点的值,而左右子树也是二叉搜索树…...

软件工程17-18期末试卷

2.敏捷开发提倡一个迭代80%以上的时间都在编程,几乎没有设计阶段。敏捷方法可以说是一种无计划性和纪律性的方法。错 敏捷开发是一种软件开发方法论,它强调快速响应变化、持续交付有价值的软件、紧密合作和适应性。虽然敏捷方法鼓励迭代开发和灵活性&…...

课题学习(九)----阅读《导向钻井工具姿态动态测量的自适应滤波方法》论文笔记

一、 引言 引言直接从原论文复制,大概看一下论文的关键点: 垂直导向钻井工具在近钻头振动和工具旋转的钻井工作状态下,工具姿态参数的动态测量精度不高。为此,通过理论分析和数值仿真,提出了转速补偿的算法以消除工具旋…...

阿里云服务器—ECS快速入门

这里对标阿里云的课程,一步步学习,链接在下面,学习完考试及格即可获取阿里云开发认证和领取证书,大家可以看看这个,这里我当作笔记,记一下提升印象! 内容很长,请耐心看完&#xff0…...

Hive简介及核心概念

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.简介 Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。 …...

CrossOver 23.6.0 虚拟机新功能介绍

CrossOver 23.6.0 Mac 此应用程序允许您运行为 Microsoft Windows 编写的程序,而无需实际安装操作系统。 CrossOver 23.6.0 Mac 包括一个 Windows 程序库,用于它可以运行的 Windows 程序。 您会发现非常流行的应用程序,例如 Microsoft Word…...

(免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设农产品销售管理系统。…...

centos更改yum源

1、更改yum源 阿里云/etc/yum.repos.d/CentOS-Base.repo 金山云/etc/yum.repos.d/cloud.repo vi /etc/yum.repos.d/cloud.repo 替换为 [base] nameCentOS-$releasever - Base mirrorlisthttp://mirrorlist.centos.org/?release$releasever&arch$basearch&repoos&…...

React-快速搭建开发环境

1.安装 说明:react-excise-01是创建的文件名 npx create-react-app react-excise-01 2. 打开文件 说明:we suggest that you begin by typing:下面即是步骤。 cd react-excise-01 npm start 3.显示...

算法随想录算法训练营第四十六天| 583. 两个字符串的删除操作 72. 编辑距离

583. 两个字符串的删除操作 题目:给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思路:这题思路主要是求出 word1 字符串和 word2 字符串中的最长相同的子字符串&…...

vue源码分析(五)——vue render 函数的使用

文章目录 前言一、render函数1、render函数是什么? 二、render 源码分析1.执行initRender方法2.vm._c 和 vm.$createElement 调用 createElement 方法详解(1)区别(2)代码 3、原型上的_render方法(1&#xf…...

Maven第三章:IDEA集成与常见问题

Maven第三章:IDEA集成与常见问题 前言 本章内容重点:了解如何将Maven集成到IDE(如IntelliJ IDEA或Eclipse)中,以及使用过程中遇到的常见的问题、如何解决,如何避免等,可以大大提高开发效率。 IEAD导入Maven项目 File ->Open 选择上一章创建的Maven项目 my-app查看po…...

数据结构—线性实习题目(二)5迷宫问题(栈)

迷宫问题&#xff08;栈&#xff09; #include <iostream>​ #include <assert.h> using namespace std;int qi1, qi2; int n; int m1, p1; int** Maze NULL; int** mark NULL;struct items {int x, y, dir; };struct offsets {int a, b;char* dir; };const int…...

Nginx 的配置文件(负载均衡,反向代理)

Nginx可以配置代理多台服务器&#xff0c;当一台服务器宕机之后&#xff0c;仍能保持系统可用。 cmd查找端口是否使用&#xff1a;netstat -ano Nginx出现403 forbidden #解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把nginx的启动用户改成目录的所属用户&…...

项目管理49个过程定义与作用、五大过程组

五大过程组&#xff1a; 49个过程的定义与作用&#xff1a; 1.整合管理&#xff1a; (1)制定项目章程&#xff1a;制定项目章程是编写一份正式批准项目并授予项目经理权力的文件的过程&#xff0c;其作用是①确立组织与项目的关系&#xff1b;②展示组织对项目的承诺&#xff…...

MySQL篇---第六篇

系列文章目录 文章目录 系列文章目录一、 MySQL 中 varchar 与 char 的区别?varchar(30) 中的 30代表的涵义?二、 int(11) 中的 11 代表什么涵义?三、为什么 SELECT COUNT(*) FROM table 在 InnoDB 比MyISAM 慢?一、 MySQL 中 varchar 与 char 的区别?varchar(30) 中的 30…...

QA新人入职任务

一、背景 分享记录一下入职新公司后&#xff0c;新人第一周接到的新手任务&#xff0c;回顾总结&#xff0c;方便自己成长和思考~ 二、新人任务说明 题目1&#xff1a;接口相关 题目2&#xff1a;UI相关 UI原型图 三、任务要求 1、根据题目2原型图&#xff0c;进行UI测试…...

更新电脑显卡驱动的操作方法有哪些?

更新显卡驱动可以有效的提升我们电脑的性能&#xff0c;可以通过设备管理器、显卡驱动软件等方式进行检查驱动是否需要更新&#xff0c;并修复一些电脑上已知的显卡问题。 然而&#xff0c;对于一些不是很懂电脑技术的人员来说&#xff0c;更新电脑显卡驱动是一件比较复杂和混乱…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...