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…

使用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;下…

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

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

【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 …

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…

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…

搞不清啊?伦敦金与上海金区别是?

进入黄金市场的朋友&#xff0c;有可能会被各式各样的黄金交易品种带得眼花缭乱&#xff0c;其实各品种虽然都以黄金作为投资标的物&#xff0c;但是也是各有不同的&#xff0c;下面我们就来比较一下相似的投资品种——伦敦金和上海金。 首先在比较之前&#xff0c;我们要搞清楚…

基于泰坦尼克号生还数据进行 Spark 分析

基于泰坦尼克号生还数据进行 Spark 分析 在这篇博客中&#xff0c;我们将展示如何使用 Apache Spark 分析著名的泰坦尼克号数据集。通过这篇教程&#xff0c;您将学习如何处理数据、分析乘客的生还情况&#xff0c;并生成有价值的统计信息。 数据解析 • PassengerId &#…

快速排序[原理,C++实现,注意事项,时间复杂度分析]

模板&#xff1a; //本模板来自ACwing void quick_sort(int q[],int l,int r) {if(l>r) return;int xq[lr>>1],il-1,jr1;while(i<j){do i;while(q[i]<x);do j--;while(q[j]>x); if(i<j) swap(q[i],q[j]);}quick_sort(q,l,j);quick_sort(q,j1,r); };原理&…

注册中心组成结构和基本原理解析

假如你正在设计和开发一个分布式服务系统&#xff0c;系统中存在一批能够独立运行的服务&#xff0c;而在部署上也采用了集群模式以防止出现单点故障。显然&#xff0c;对于一个完整的业务系统而言&#xff0c;这些服务之间需要相互调用并形成复杂的访问链路&#xff0c;一种可…

codesys多段直线电机跨电机控制

1. 电机描述 在X轴上有多段直线电机&#xff0c;如下图有9个&#xff0c;从X1到X9. 2.codesys程序结构 程序名称&#xff1a;Pou_two_motors 动作名称&#xff1a;ACT_move 把这个程序搞到任务配置里面 通过ethercat总线命名一下这些电机&#xff0c;方便调用。 3.程序内容 P…

油烟监测仪:守护厨房,让蓝天白云成为常态

夏日炎炎&#xff0c;白天的酷暑让人们更加向往夜晚的凉爽与惬意。在这样的季节里&#xff0c;品尝各式烧烤、小龙虾&#xff0c;再搭配一杯冰镇啤酒&#xff0c;成为了许多市民夜晚消遣的不二选择。然而&#xff0c;随之而来的餐饮油烟问题也进入了高发阶段&#xff0c;对周边…

智能锁赛博化,凯迪仕携全球顶尖科技亮相建博会!

7月8日&#xff0c;作为大家居建材行业全球规模第一大展&#xff0c;2024中国建博会&#xff08;广州&#xff09;在广交会展馆正式拉开序幕。据官方数据显示&#xff0c;本届展会展出规模展览总规模近40万平方米&#xff0c;建筑装饰领域各细分题材的一线品牌几乎全部参展。 其…

循环练习题

思路&#xff1a; 代码&#xff1a; public static void main(String[] args) {double sum0;for (int i1;i<100;i){if (i%2!0){sum1.0/i;}else {sum-1.0/i;}}System.out.println(sum);} 结果为&#xff1a;