关于python:0基础学爬虫爬虫基础之网络请求库的使用

23次阅读

共计 7717 个字符,预计需要花费 20 分钟才能阅读完成。

大数据时代,各行各业对数据采集的需要日益增多,网络爬虫的使用也更为宽泛,越来越多的人开始学习网络爬虫这项技术,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 文件,判断网站是否容许爬虫程序进行采集。

应用办法

申请与响应

应用到了 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 协定的库,应用也较为简单,能够在须要时再做理解。

正文完
 0