【0基础学爬虫】爬虫基础之网络请求库的使用

news2024/10/5 17:24:52

0

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为网络请求库的使用。

网络请求库概述

作为一名爬虫初学者,熟练使用各种网络请求库是一项必备的技能。利用这些网络请求库,我们可以通过非常简单的操作来进行各种协议的模拟请求。我们不需要深入底层去关注如何建立通信与数据如何传输,只需要调用各种网络请求库封装好的方法。Python提供了很多功能强大的网络请求库,如urllib、requests、httpx、aiohttp、websocket等,下文中会对这些库做一一介绍。

urllib

安装与介绍

安装

urllib是Python的内置请求库,不需要再额外安装。

介绍

urllib库包含四个模块:

urllib.request:向目标url发起请求并读取响应信息。

urllib.error:负责异常处理,捕获urllib.request抛出的异常。

urllib.parse:解析url,提供了一些url的解析方法。

urllib.robotparser:解析网站robots.txt文件,判断网站是否允许爬虫程序进行采集。

1

使用方法

请求与响应

使用到了urllib.request模块中的urlopen方法来打开一个url并获取响应信息。urlopen默认返回的是一个HTTPResponse对象,可以通过read方法得到它的明文信息。

import urllib.request

response = urllib.request.urlopen('http://httpbin.org/get')

print(response)  #打印:<http.client.HTTPResponse object at 0x0000013D85AE6548>
print(response.read().decode('utf-8'))  #响应信息
print(response.status)                  #返回状态码
print(response.getheaders())            #返回响应头信息

设置请求头与参数

当请求需要设置请求头时,就需要用到urllib.request模块中的另一个方法Request,它允许传递如下几个参数:

def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None)

url:目标url

data:请求参数,默认为None

headers:请求头信息,字典类型

origin_req_host:请求的主机地址

unverifiable:设置网页是否需要验证

method:请求方式

from urllib import request,parse

url = 'https://httpbin.org/post'  #目标URL
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}                           #请求头信息
params = {
    'test':'test01'         #请求参数
}

data = bytes(parse.urlencode(params),encoding='utf-8')  #解析为bytes类型
res = request.Request(url,data=data,headers=headers,method='POST')  #实例化Request
response = request.urlopen(res)         #发起请求

print(response.read().decode('utf-8'))  #响应信息

异常捕获

在发起请求时,可能会因为网络、url错误、参数错误等问题导致请求异常,程序报错。为了应对这种情况,我们需要添加异常处理功能。

from urllib import request,error

try:
    response = request.urlopen('http://httpbin.org/get')
except error.HTTPError as e:    #捕获异常
    print(e)  #打印异常信息

requests

requests是Python爬虫开发中最常使用到的库,它提供了简单易用的API,使得在Python中发送HTTP请求变得非常容易,它比urllib模块更加简洁,使用更加方便。

安装与介绍

安装

requests是Python的第三方库,使用 pip install requests进行安装

介绍

requests包含了许多模块,这里只介绍主要模块:

requests:主模块,提供了HTTP请求方法。

requests.session:会话模块,提供了Session类,用于多个请求中共享请求信息。

requests.adapters:适配器模块,提供了不同协议的适配器类,用于处理不同协议的请求。

requests.cookie:Cookie模块,用于处理cookie信息。

requests.exceptions:异常处理模块,用于处理请求中会出现的各种异常。

requests.status_codes:状态码模块,提供了HTTP状态码常量和状态码解释。

使用方法

请求与响应

import requests   #导入requests模块

get_response = requests.get('http://httpbin.org/get')   #发送get请求
post_response = requests.post('http://httpbin.org/post')   #发送post请求

print(get_response)   #<Response [200]>
print(post_response)   #<Response [200]>

requests库发送请求非常简单,并支持多种请求方式,如:get、post、put、delete等。发起请求后requests会返回一个Response对象,可以使用多种方法来解析Response对象。

import requests

response = requests.get('http://httpbin.org/get')

print(response.status_code)   #返回响应状态码
print(response.encoding)   #返回响应信息的编码
print(response.text)   #返回响应的文本信息
print(response.content)   #返回响应的字节信息
print(response.json())   #将JSON响应信息解析为字典,如果响应数据类型不为JSON则会报错
print(response.headers)   #返回响应头信息
print(response.cookies)   #返回响应cookie

设置请求头与参数

request(self,method,url,params=None,data=None,headers=None,cookies=None,files=None,auth=None,timeout=None,allow_redirects=True,proxies=None,hooks=None,stream=None,verify=None,cert=None,json=None)

requests中设置请求头可以通过headers参数来设置,headers是一个字典类型,键为请求头的字段名,值为对应请求头的值。

请求参数可以通过params方法进行设置,类型为字典。键为参数名,值为对应参数的值。

在网络请求中,携带的参数可以分为两个类型,它们在python中对应的字段名如下:

查询字符串参数:params

请求载荷:data/json

查询字符串参数params是拼接在url中的参数,常用于get请求,作为查询参数使用。而data与json一般使用与post请求中,它是要发送到服务器的实际数据。

import requests

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}

params = {'key':'value'}
data = {'username':'user','passowrd':'password'}

get_response = requests.get(url,params=params,headers=headers)
post_response = requests.post(url,data=data,headers=headers)

Session的使用

当一个网站我们需要多次请求时,如我需要登录 -> 请求个人页面,在面对这种场景时,我们可以使用到Session方法。因为通过requests发送到的请求是独立,我们请求登录接口与请求个人页面之间是没有联系的,我们需要请求登录接口后获取它返回的cookie,然后设置cookie进行下一次请求。每次请求后都需要设置一次cookie,如果请求流程更多的话那么过程就会显得很繁琐。使用Session方法就能更好的模拟一次请求流程,不需要频繁的设置cookie。

Session的作用类似于浏览器中的cookie与缓存,它可以用于在多次请求中维护一些状态信息,避免重复发送相同的信息和数据,使用Session可以优化HTTP请求的性能与可维护性,它的使用也非常简单。

import requests

session = requests.Session()       #创建session对象
session.get('http://httpbin.org/cookies/set/username/test')   #发起请求,模拟一次登录
response = session.get('http://httpbin.org/cookies')   #获取cookie

print(response.text)   #{"cookies": {"username": "test"}}

异常捕获

requests.exceptions 中提供了一系列请求异常。

ConnectTimeout:连接超时

ReadTimeout:服务器在指定时间内没有应答

ConnectionError:未知的服务器

ProxyError:代理异常

URLRequired:无效URL

TooManyRedirects:重定向过多

MissingSchema:URL缺失,如缺少:http/https

InvalidSchema:提供的URL方案无效或不受支持

InvalidURL:提供的URL不知何故无效

InvalidHeader:提供的请求头无效

InvalidProxyURL:提供的代理URL无效

ChunkedEncodingError:服务器声明了编码分块,但发送了无效分块

ContentDecodingError:无法对响应信息解码

StreamConsumedError:此响应内容已被使用

RetryError:自定义重试逻辑错误

UnrewindableBodyError:请求在尝试倒带正文时遇到错误

HTTPError:出现HTTP错误

SSLError:发生SSL错误

Timeout:请求超时

httpx

前面讲到了requests库,它功能强大、使用简单,并且提供session会话模块,似乎requests库已经可以满足所有的应用场景了。但是requests也有一些致命的缺点:

  1. 同步请求,不支持异步,requests默认使用同步请求,在网络请求中同步请求到导致性能问题。

  2. 不支持HTTP2.0,如今已经有少部分网站采用HTTP2.0协议来进行数据传输,面对这类网站无法使用requests。

而httpx是一个基于异步IO的Python3的全功能HTTP客户端库,旨在提供一个快速、简单、现代化的HTTP客户端,它提供同步与异步API,而且支持HTTP1.1和HTTP2.0。并且httpx功能也很齐全,requests支持的功能httpx也基本同样支持。因此,在爬虫开发中使用httpx也是一个非常不错的选择。

安装与介绍

安装

httpx是Python的第三方库,使用 pip install httpx进行安装

如果需要httpx支持https2.0,则需要安装它的可选依赖项, pip install httpx[http2]

介绍

httpx是建立在requests的成熟可用性之上的,提供的模块与requests大同小异,因此不做介绍。

使用方法

httpx用法与requests基本一致,这里主要介绍httpx的Client实例。

httpx Client

Client作用与requests的session方法一致,但用法有些区别。

常见用法是使用上下文管理器,这样可以确保在请求完成后能够正确清理连接。

import httpx

with httpx.Client() as client:
    response = client.get('https://httpbin.org/get')
    
print(response)   #<Response [200 OK]>

在设置请求头、传递参数时也有新的写法。

import httpx

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
params = {'key':'value'}

with httpx.Client(headers=headers,params=params) as client:
    response = client.get('https://httpbin.org/get')
    
print(response)

aiohttp

aiohttp是基于Python异步IO的HTTP客户端/服务器库,它与httpx相似,同样支持HTTP1.1和HTTP2.0协议,aiohttp是基于asyncio实现的,它支持WebSocket协议。

安装

aiohttp是Python的第三方库,使用 pip install aiohttp进行安装

使用

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://httpbin.org/get') as response:
            print(response) #<ClientResponse(https://httpbin.org/get) [200 OK]>

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

aiohttp不支持同步,需要与asyncio一起使用,与前文中讲到的库对比,aiohttp显得异常复杂,requests两行代码就能完成的功能aiohttp却需要5行。为什么aiohttp代码如此冗余我们却要使用它呢?因为aiohttp是异步的,它的api旨在充分利用非阻塞网络操作,在实例代码中,请求将阻塞三次,这为事件循环提供了三次切换上下文的机会。aiohttp可以实现单线程并发IO操作,它在处理大量网站请求时的速度远超于requests,但在涉及到文件读写操作时,它发挥的作用就没有预期的那么大,因此aiohttp库的使用需要爬虫开发者自行斟酌。

websocket

Python websocket库是专门用于创建WebSocket服务的库。WebSocket是一种在客户端与服务端之间进行双向通信的协议,服务端可以向客户端推送数据,客户端也可以向服务端推送数据,这样就能实现数据的及时通信,它与HTTP协议一样,由socket实现。WebSocket通常使用在直播、弹幕等场景中。

安装

websocket是Python的内置库,不需要手动安装。当你在运行下文中的实例时,如果报错cannot import name 'WebSocketApp' from 'websocket',你可以卸载现有的websocket库,安装websocket-client==0.53.0版本的包。

使用

websocket用于客户端与服务端通信,爬虫开发中一般只会进行客户端的开发,所有这里只介绍客户端的开发。

使用WebSocketApp可以快速的建立一个Websocket连接。

from websocket import WebSocketApp

def on_message(ws, message):  #接收到消息时执行
    print(message)
def on_error(ws, error):  #异常时执行
    print(error)
def on_close(ws):   #关闭连接时执行
    print("WebSocket closed")
def on_open(ws):  #开启连接时执行
    ws.send("Hello, WebSocket!")  #发送信息
    
if __name__ == "__main__":
    ws = WebSocketApp("ws://echo.websocket.org/",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()

可以看到websocket提供了四个模块:

on_message:接收服务器推送来的数据

on_error:连接异常时会触发on_error

on_close:连接关闭时触发on_close

on_open:连接开启时触发on_open

归纳

上文中讲到了urllib、requests、httpx、aiohttp、websocket这五个库的使用,这五个库基本能够满足爬虫开发中的请求需求。urllib是python的内置库,使用起来较为繁琐,可以只做了解。requests是爬虫开发中最常使用的库,功能齐全,使用简单,需要认真学习。httpx在requests的基础上支持异步处理、HTTP2.0与Websocket协议,requests的功能httpx都支持,但在性能方面httpx弱于其他请求库,httpx也需要爬虫初学者好好学习。aiohttp用于编写异步爬虫,开发效率低于其它库,但是执行效率远高与其它库,也是一个需要好好掌握的请求库。websocket是专门用于Websocket协议的库,使用也较为简单,可以在需要时再做了解。

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

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

相关文章

Qt5开发环境-银河麒麟V10ARM平台

目录 前言1.源码下载2.编译安装2.1 安装依赖2.2 编译2.3 遇到的问题2.4 安装 3.编译qtwebengine3.1 安装依赖库3.2 编译3.3 遇到的问题3.4 安装 4.配置开发环境5.测试6.程序无法输入中文的问题总结 前言 近期因参与开发的某个软件需要适配银河麒麟v10arm 平台&#xff0c;于是…

算法与数据结构(五)--二叉树入门

符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n)&#xff0c;为了提高运算效率&#xff0c;我们学习树这种数据结构。 目录 一.树的基本定义 二.树的相关术语 三.二叉树的基本定义 四.二叉树的链表实现…

mysql-5.5.62-win32安装与使用

1.为啥是这个版本而不是当前最新的8.0&#xff1f; 因为我要用32位。目前mysql支持win32的版本最新只到5.7.33。 首先&#xff0c;到官网MySQL :: MySQL Downloads 然后选 选一个自己喜欢的版本就好。我这里是如标题版本。下载32位的zip。然后回来解压。 完了创建系统环境变…

【boost网络库从青铜到王者】第三篇:asio网络编程中的buffer缓存数据结构

文章目录 1、关于buffer数据结构1.1、简单概括一下&#xff0c;我们可以用buffer() 函数生成我们要用的缓存存储数据。1.2、但是这太复杂了&#xff0c;可以直接用buffer函数转化为send需要的参数类型:1.3、output_buf可以直接传递给该send接口。我们也可以将数组转化为send接受…

一百五十五、Kettle——Linux上安装的kettle9.3连接MySQL数据库

一、目的 kettle9.3在Linux上成功安装后&#xff0c;就建立数据库连接&#xff0c;第一个就是MySQL数据库 二、前提准备 提前准备好MySQL驱动包 &#xff08;一&#xff09;MySQL版本 &#xff08;二&#xff09;注意&#xff1a;由于我的MySQL版本比较高&#xff0c;所以特…

vue 路由地址把#去掉

在路由对象里边添加history模式就不显示# mode:history // 4.通过规则创建对象 const router new VueRouter({routes,// 默认模式为hash 带# // history 不带#mode:history })想把端口号8000换成其他的 比如我这样的3000更换端口号教程

【实际开发19】- 压测 / 调优准备

目录 1. Jmeter 2. Jmeter 环境部署 1. 配置 : 临时修改语言 ~ Options → Choose Language → Chinese 3. Jmeter 并发测试 0. 提示 : Postman 测试是“串行”的 , 无法测试并发请求 1. daiding 1. Jmeter 下载 : Apache JMeter - Download Apache JMeter 详参&#xf…

从规划到落地,数字化工厂如何破局

随着第四次工业革命的推进&#xff0c;数字化工厂解决方案已经成为制造业转型升级的必经之路。然而&#xff0c;在实际推进过程中&#xff0c;许多企业却面临着规划难以落地、投资回报率低、人才短缺等问题。如何破局&#xff0c;实现数字化工厂的顺利转型&#xff0c;成为制造…

puzzle(0414)六边形拼图

目录 六边形拼图 简单 中等 困难 六边形拼图 taptap小游戏 简单 &#xff08;3&#xff09; &#xff08;4&#xff09; 中等 &#xff08;3&#xff09; &#xff08;4&#xff09; 困难 &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff…

Python 程序设计入门(021)—— 循环结构程序设计(2):while 循环

Python 程序设计入门&#xff08;021&#xff09;—— 循环结构程序设计&#xff08;2&#xff09;&#xff1a;while 循环 目录 Python 程序设计入门&#xff08;021&#xff09;—— 循环结构程序设计&#xff08;2&#xff09;&#xff1a;while 循环一、while 循环的语法二…

单片机如何分散加载文件

本篇文章将通过实际操作介绍如何实现分散加载文件的方法。开发工具为&#xff1a;mdk&#xff1b;开发板&#xff1a;野火stm32f407 一、建立工程 通过实现简单的加法计算的软件算法&#xff0c;来了解分散加载image 的方法。 建立工程&#xff0c;创建文件夹以及相应的文件&am…

设计师都会用哪些在线设计工具?

在效率为王的时代&#xff0c;在线设计是设计的未来&#xff0c;为设计师提供了更节省时间、精力和成本的解决方案。在线设计工具可以通过打开浏览器使用&#xff0c;大多数操作界面比传统设计工具更简单&#xff0c;入门门槛很低。此外&#xff0c;它还为云存储提供了便利&…

通俗讲解-动量梯度下降法原理与代码实例

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一.动量梯度下降法介绍 1.1 动量梯度下降法简介与思想 1.2 动量梯度下降法的算法流程 二.动量梯度下降法代码实例 2.1 动量梯度下降法实例代码 一.动量梯度下降法介绍…

7-3 查询水果价格

分数 15 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 给定四种水果&#xff0c;分别是苹果&#xff08;apple&#xff09;、梨&#xff08;pear&#xff09;、桔子&#xff08;orange&#xff09;、葡萄&#xff08;grape&#xff09;&#xff0c;单价分别对应为3.00…

mysql-事务特性以及隔离机制

一.ACID 事务&#xff08;Transaction&#xff09;是访问和更新数据库的程序执行单元&#xff1b;事务中可能包含一个或多个sql语句&#xff0c;这些语句要么都执行&#xff0c;要么都不执行。 1.逻辑架构和存储引擎 如上图所示&#xff0c;MySQL服务器逻辑架构从上往下可以分…

浪潮信息赵帅:多元算力时代 开源开放的OpenBMC成为服务器管理优先解

“多元算力时代下&#xff0c;大规模的异构服务器设备面临多种处理器架构、多种设备协议、不同管理芯片兼容的系统化设计挑战&#xff0c;管理固件也迎来新的变革。开源开放的OpenBMC&#xff0c;以创新的分层解耦软件架构&#xff0c;兼容不同处理器架构、算力平台和管理芯片&…

Python爬虫——scrapy_工作原理

引擎向spiders要url引擎把将要爬取的url给调度器调度器会将url生成的请求对象放入到指定的队列中从队列中出队一个请求引擎将请求交给下载器进行处理下载器发送请求获取互联网数据下载器将数据返回给引擎引擎将数据再次给到spidersspiders通过xpath解析该数据&#xff0c;得到数…

springboot集成ES

1.引入pom依赖2.application 配置3.JavaBean配置以及ES相关注解 3.1 Student实体类3.2 Teacher实体类3.3 Headmaster 实体类4. 启动类配置5.elasticsearchRestTemplate 新增 5.1 createIndex && putMapping 创建索引及映射 5.1.1 Controller层5.1.2 service层5.1.3 ser…

飞天使-jenkins进行远程linux机器修改某个文件的思路

文章目录 jenkins配置的方式jenkins中执行shell的思路 jenkins配置的方式 jenkins中执行shell的思路 下面的脚本别照抄&#xff0c;只是一个思路 ipall"$ips"# 将文本参数按行输出为变量 while IFS read -r line; doecho "$line" if [[ ! -z $line ]] &…

linux——mysql的高可用MHA

目录 一、概述 一、概念 二、组成 三、特点 四、工作原理 二、案例 三、构建MHA 一、基础环境 二、ssh免密登录 三、主从复制 master slave1 四、MHA安装 一、环境 二、安装node 三、安装manager 一、概述 一、概念 MHA&#xff08;MasterHigh Availability&a…