Python爬虫教程第2篇-reqeusts是最好用的网络请求工具

简介

爬虫第一步就是网络请求,一个好用的网络请求库会非常重要。而requests库就是非常好用的一个http库,pyhon中虽然也有内置的urllib库用于网络请求,但是urllib使用起来比较的麻烦,而且缺少很多实用的高级功能,所以这里直接推荐使用reqeusts库,它是一个Python第三方库,底层也是基于urllib实现的,处理url资源特别的方便。reqeusts不仅用于写爬虫方便,在日常的开发中也是少不了requests的使用。如调用后端接口,上传文件,查询数据库等。
在这里插入图片描述

安装reqeusts库

pip install requests

建议使用虚拟环境安装依赖,参考文章:【python创建虚拟环境venv】

First Step

使用reqeusts库,爬取百度首页内容,只需要下面几行代码:

import requests
response = requests.get('http://www.baidu.com')# 如果返回的内容有中文乱码,可以设置返回对象的encoding
# response.encoding='utf-8'print(response.status_code)
print(response.text)# 输出内容
200
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>.......

可以看到请求一个网页页面一行代码就搞定了,非常简单,就如reqeusts库的设计理念一样:Requests is an elegant and simple HTTP library for Python, built for human beings.(requests是一个优雅而简单的 Python HTTP 库,它是为人类构建的。)

我们再来看搜索一个词的场景:搜索一个关键词,传入关键词参数。我们先分析一下百度搜索的链接是下面这种:
https://www.baidu.com/s?wd=爬虫
可以看到关键词作为url参数拼接在url后面,我们代码传入参数然后获取搜索结果,代码如下:

import requests
params = {'wd': '爬虫'}
response = requests.get('https://www.baidu.com/', params=params)response.encoding='utf-8'
print(response.url)
print(response.text)###### 输出内容
https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

返回的html结果
在这里插入图片描述
这里介绍了简单的使用方式,下面介绍reqeusts各种高阶的用法。

进阶使用

请求方法

reqeusts库支持大部分的HTTP请求方法,具体如下:
1. get: 对应http的get请求,用于获取指定的url内容
**2. post:**对应http的post请求,创建资源,提交表达,上传文件等
**3. put:**对应http的put请求,对资源全局更新
**4. delete:**对应http的delete请求,删除资源
**5. head:**对应http的head请求,获取header
**6. patch:**对应http的patch请求,对资源进行局部更新
**7. options:**对应http的options请求,查看接口是否支跨域
以上都是符合restful风格定义的方法,具体含义一致,真正该使用哪个方法需要对应目标接口或者网址支持的方法。比如下图,就是get方法,那请求该链接的时候就用get方法就好了。
在这里插入图片描述
一般情况下面四种方法就够用了。

requests.get(url='')
requests.post(url='')
requests.put(url='')
requests.delete(url='')

request请求参数

上面的reqeusts的请求方法底层都是基于requests.requst封装了一层,参考下面的参数,就是把method对应的做了替换,其他参数还都存在,所以不管是使用requests.get,还是reqeusts.post,或是直接用requests.request,下面的参数都一致。
在这里插入图片描述
参数详细说明:
在这里插入图片描述
下面介绍几种常见的使用场景。

header设置

因为是爬虫,如果不设置header很容易就会被目标网站发现是爬虫程序而拒绝请求,header参数参考:

headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding": "gzip, deflate, br, zstd","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6,nb;q=0.5,fr;q=0.4,en-US;q=0.3","Cache-Control": "max-age=0","Connection": "keep-alive","Sec-Ch-Ua": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',"Content-Type":"application/json"}

可以针对不同网站做调整,比如content-type、cookie等。

Content-Type字段

header 头部信息中有一个 Content-Type 字段,该字段用于客户端告诉服务器实际发送的数据类型,比如发送的数据可以是文件、纯文本、json字符串、表单等。在requests中常用的数据类型有5种:

  • application/x-www-form-urlencoded:form表单数据被编码为key/value格式发送到服务器。请求默认格式
  • multipart/form-data:不仅可以传输参数,还可以传输文件
  • text/xml : XML格式。发送的数据必须是xml格式
  • application/json:json 格式。发送的数据必须是json格式
  • text/plain :纯文本格式
Get请求
import requests
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding": "gzip, deflate, br, zstd","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6,nb;q=0.5,fr;q=0.4,en-US;q=0.3","Cache-Control": "max-age=0","Connection": "keep-alive","Sec-Ch-Ua": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'}params = {'wd': '爬虫'}
response = requests.get('https://www.baidu.com/s', params=params, headers=headers)
POST请求

1 模拟一个登录请求(默认使用的form表单):

requests.post('https://accounts.douban.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})

requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传入json参数:

requests.post('https://accounts.douban.com/login', json={'form_email': 'abc@example.com', 'form_password': '123456'})

演示用,实际douban可能不是这种形式提交数据。虽然json接收的是个dict参数,但是内部会自动化序列化为json

2 上传文件

upload_files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)

其他的PUT、DELETE方法也都类似以上请求方式。

使用代理
import requests
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding": "gzip, deflate, br, zstd","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6,nb;q=0.5,fr;q=0.4,en-US;q=0.3","Cache-Control": "max-age=0","Connection": "keep-alive","Sec-Ch-Ua": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'}proxy = {"http": "http://127.0.0.1:7890","https": "http://127.0.0.1:7890"
}params = {'wd': '爬虫'}
response = requests.get('https://www.baidu.com/s', params=params, headers=headers, proxies=proxy)

reqeust返回对象

每一次请求都需要获取详细准确的返回结果,requests请求返回的是一个requests.Response对象,该对象有丰富的属性和方法。
在这里插入图片描述

获取返回文本内容

response.content 返回的是二进制内容
response.text 返回的字符串
response.json 返回的是序列化的json数据
接口推荐直接使用json()获取结果,如果不知道返回的格式,使用text。

返回的状态码status和ok

status_code 是接口的标准响应码,ok 是表示一个请求是否正常。关于正常的定义可以参见ok函数的函数说明。
在这里插入图片描述
状态码通用含义:

  • 信息响应 (100–199)
  • 成功响应 (200–299)
  • 重定向消息 (300–399)
  • 客户端错误响应 (400–499)
  • 服务端错误响应 (500–599)
header和Cookie

在调用需要登陆的接口可能需要认证之后的cookies和header中某些特殊字段,所以在请求返回中通过header和cookies拿到相应的参数。

import requestsurl = "http://127.0.0.1:8090/demo/5"
res = requests.get(url)
print(f"header: {res.headers}")
print(f"cookies: {res.cookies}")>>>
header: {'Server': 'Werkzeug/2.3.6 Python/3.9.6', 'Date': 'Tue, 13 Jun 2023 13:27:13 GMT', 'Content-Type': 'application/json', 'Content-Length': '85', 'Connection': 'close'}
cookies: <RequestsCookieJar[]>
常见的网络请求异常

网络请求通常会存在很多可能的错误,特别是http请求还有复杂的后端接口。所以对于错误信息的捕获就特别重要,合理的捕获异常信息可以极大的增强代码的及健壮性。requests 提供了多种异常库,包括如下:

class RequestException(IOError):pass class InvalidJSONError(RequestException):pass class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError):pass class HTTPError(RequestException):pass class ConnectionError(RequestException):pass class ProxyError(ConnectionError):pass class SSLError(ConnectionError):pass class Timeout(RequestException):pass class ConnectTimeout(ConnectionError, Timeout):pass class ReadTimeout(Timeout):pass class URLRequired(RequestException):pass class TooManyRedirects(RequestException):pass class MissingSchema(RequestException, ValueError):pass class InvalidSchema(RequestException, ValueError):pass class class InvalidURL(RequestException, ValueError):pass class InvalidHeader(RequestException, ValueError):pass class InvalidProxyURL(InvalidURL):pass class ChunkedEncodingError(RequestException):passclass ContentDecodingError(RequestException, BaseHTTPError):passclass StreamConsumedError(RequestException, TypeError):pass class RetryError(RequestException):pass class UnrewindableBodyError(RequestException):pass 

常用的有下面几个:
在这里插入图片描述

RequestException

RequestException 可以捕获requests请求所有的异常,是最大颗粒度的异常。

ConnectionError

ConnectionError 可以捕获请求中网络相关的错误,如网络不可达,拒绝连接等。使用ConnectionError捕获到拒绝连接的错误。

超时
  1. 请求拒绝是对端服务器收到了请求但是拒绝连接,而ConnectTimeout是没有和对端服务器建立连接而超时。
  2. ReadTimeout 是和对端服务器建立了连接,接口返回时超时。在请求接口中睡眠10s,人为制造一个读取超时。
    如果接口响应耗时较久,设置timeout请求参数,适当调整超时时间。
其他

requests请求中所有的接口本身出错都不会抛出异常,比如接口404,500,502等都不会主动抛出异常,而是通过异常状态码展示出来。

总结

本篇讲解了requests的基础知识点,介绍了requests最重要的请求参数返回对象两部分内容,下一章会详细讲解如何解析返回的html内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Syncthing一款开源去中心化和点对点文件同步工具

Syncthing&#xff1a;一款开源的文件同步工具&#xff0c;去中心化和点对点加密传输&#xff0c;支持多平台&#xff0c;允许用户在多个设备之间安全、灵活地同步和共享文件&#xff0c;无需依赖第三方云服务&#xff0c;特别适合高安全性和自主控制的文件同步场景。 &#x…

牛客周赛 Round 50

A题&#xff1a;小红的最小最大 思路&#xff1a; 大水题 code&#xff1a; inline void solve() {int a, b, c; cin >> a >> b >> c;if (min(a, b) c > max(a, b)) cout << "YES\n";else cout << "NO\n";return; }…

传感器标定(二)摄像头外参标定(camera2lidar)

一、数据采集 1、ros包数据采集 rosbag record -a -O output_filename --duration6 //设置bag包名字为 my_rosbag.bag rosbag record -a -O my_rosbag.bag --duration62、参数解释 -a&#xff1a;订阅所有话题。-O output_filename&#xff1a;指定输出文件名称。–duration…

使用MySQLInstaller配置MySQL

操作步骤 1.配置High Availability 默认选项Standalone MySQL Server classic MySQL Replication 2.配置Type and Networking ◆端口默认启用TCP/P网络 ◆端口默认为3306 3.配置Account and Roles 设置root账户的密码、添加其他管理员 4.配置Windows Service ◆配置MySQL Serv…

Java线程池及面试题

1.线程池介绍 顾名思义&#xff0c;线程池就是管理一系列线程的资源池&#xff0c;其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 总结一下使用线程池的好处&#xff1a; 降低资源消耗。通过重复利用已创建的…

xcode项目添加README.md文件并进行编辑

想要给xcode项目添加README.md文件其实还是比较简单的&#xff0c;但是对于不熟悉xcode这个工具的人来讲&#xff0c;还是有些陌生&#xff0c;下面简单给大家讲一下流程。 选择“文件”>“新建”>“文件”&#xff0c;在其他&#xff08;滚动到工作表底部&#xff09;下…

【云原生】AWS云平台,ECR推送Helm chart包

文章目录 1、背景信息2、AWS ECR推送OCI1、背景信息 背景一:OCI 是一个围绕容器格式和运行时的开放治理结构,旨在创建开放的行业标准。OCI 由 Docker、CoreOS 和其他容器技术相关的公司于 2015 年创立,现在由 Linux 基金会托管。OCI 的目标是提供一个中立的论坛,以解决容器…

Vue 3<script setup>使用v-for渲染数组中的元素,根据传入id删除数组元素(filter方法根据元素id过滤数组中的元素)

首先&#xff0c;需要在<script setup>中定义组件的数据和方法。然后&#xff0c;在模板中使用v-for来遍历数组并渲染元素&#xff0c;每个元素旁边添加一个删除按钮&#xff0c;并通过点击事件调用删除方法。 <template> <div> <div v-for"item …

Java基础-组件及事件处理(中)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 BorderLayout布局管理器 说明&#xff1a; 示例&#xff1a; FlowLayout布局管理器 说明&#xff1a; …

vue extend的作用和使用方法

Vue.extend 是 Vue.js 提供的一个全局 API&#xff0c;用于扩展 Vue 组件。它的作用是创建一个可以被多次使用的组件构造器&#xff0c;可以像普通组件一样使用&#xff0c;并且可以在多个地方可以实例化该组件。 Vue.extend 的原理是通过 Vue.extend 方法创建一个新的构造器&…

【Qt5】入门Qt开发教程,一篇文章就够了(详解含qt源码)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二)

文章目录 开发思路发射点添加子弹组件构建子弹处理缩放效果闪光效果 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 开发思路 整体开发还是基于组件的思维。相比于工厂模式或者状态机&#xff0c;可能有些老套&#xff0c;但是更容易理解和编…

STM32/GD32驱动步进电机芯片TM2160

文章目录 官方概要简单介绍整体架构流程 官方概要 TMC2160是一款带SPI接口的大功率步进电机驱动IC。它具有业界最先进的步进电机驱动器&#xff0c;具有简单的步进/方向接口。采用外部晶体管&#xff0c;可实现高动态、高转矩驱动。基于TRINAMICs先进的spreadCycle和stealthCh…

STM32 低功耗模式 睡眠、停止和待机 详解

目录 1.睡眠模式&#xff08;Sleep Mode&#xff09; 2.停止模式&#xff08;stop mode&#xff09; 3.待机模式&#xff08;Standby Mode&#xff09; STM32提供了三种低功耗模式&#xff0c;分别是睡眠模式&#xff08;Sleep Mode&#xff09;、停止模式&#xff08;Stop …

Electron 简单搭建项目

准备工作 全局安装 node npm创建文件夹&#xff0c;并执行 npm init安装 electron npm i electron --save-dev在 package.json 配置文件中的scripts字段下增加一条start命令&#xff1a; {"scripts": {"start": "electron ."} }由于配置中的入…

MYSQL八股文汇总

目录 1、三大范式 2、DML 语句和 DDL 语句区别 3、主键和外键的区别 4、drop、delete、truncate 区别 5、基础架构 6、MyISAM 和 InnoDB 有什么区别&#xff1f; 7、推荐自增id作为主键问题 8、为什么 MySQL 的自增主键不连续 9、redo log 是做什么的? 10、redo log…

CY5-丙氨酸荧光探针,生物医学研究应用-星戈瑞

在生物医学研究中&#xff0c;荧光探针技术因其高灵敏度、高特异性和非侵入性而受科研应用。其中&#xff0c;CY5-丙氨酸荧光探针作为一种生物分子标记工具&#xff0c;近年来在细胞成像、蛋白质定位等领域展现出科研潜力。本文将详细介绍CY5-丙氨酸荧光探针的结构、性质以及其…

App H5+ 实现下载、查看功能 前后端实现(SpringBoot)

<!doctype html><html><head><meta charset"utf-8"><title>维修指南</title><meta name"viewport" content"widthdevice-width, initial-scale1.0, minimum-scale0, maximum-scale0.85, user-scalableyes&quo…

下半年交火点:智驾全国都能开,智舱多模态大模型

“你猜一猜我现在参加什么样的活动呢&#xff1f;” “你参加的是WAIC&#xff0c;就是那个人工智能的大Party&#xff0c;超多科技高手都在这……” “你帮我介绍一下这本书吧。” “这书叫《反脆弱&#xff0c;从不确定性中获益》&#xff0c;讲的是怎么在混乱里找机会&am…

闲聊C++与面向对象思想

艾伦凯曾说&#xff0c;“I made up the term object-oriented, and I can tell you I did not have C in mind.”&#xff08;“我发明了术语‘面向对象’&#xff0c;可以告诉您我没有C”&#xff09;。 今天看到这句话&#xff0c;激发了笔者写一篇文章聊聊C与面向对象思想…