大数据时代,各行各业对数据采集的需求越来越大,网络爬虫的使用也更加广泛??。越来越多的人开始学习网络爬虫的技术,K哥爬虫发布了很多爬虫进阶和逆向相关的文章。为做到从易到难全面覆盖,特设专栏【0爬虫基础】帮助小白快速上手爬虫。这个问题Useofthelibraryisrequestedforthenetwork。网络请求库概述作为爬虫初学者,熟练使用各种网络请求库是一项必备技能。使用这些网络请求库,我们可以通过非常简单的操作来模拟各种协议的请求。我们不需要深入底层关注如何建立通信,如何传输数据,只需要调用各种网络请求库封装的方法即可。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文件,判断网站是否允许爬虫采集。使用方法request和response使用urllib.request模块中的urlopen方法打开一个url,获取响应信息。urlopen默认返回一个HTTPResponse对象,可以通过read方法获取其明文信息。importurllib.requestresponse=urllib.request.urlopen('http://httpbin.org/get')print(response)#print: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:targeturldata:请求参数,默认为Noneheaders:请求头信息,字典类型origin_req_host:请求的主机地址unverifiable:设置网页是否需要验证org/post'#TargetURLheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/111.0.0.0Safari/537.36'}#请求头信息params={'test':'test01'#requestparameters}data=bytes(parse.urlencode(params),encoding='utf-8')#parsetobytes类型res=request.Request(url,data=data,headers=headers,method='POST')#实例化Requestresponse=request.urlopen(res)#发起请求print(response.read().decode('utf-8'))#发起响应信息异常捕获时请求,可能由于网络、url错误、参数错误等问题导致请求异常,程序报错。为了应对这种情况,我们需要添加一个异常处理函数。fromurllibimportrequest,errortry:response=request.urlopen('http://httpbin.org/get')excepterror.HTTPErrorase:#Captureexceptionprint(e)#打印异常信息requests中requests最流行Python爬虫开发一个常用的库,它提供了简单易用的API,使得在Python中发送HTTP请求变得非常简单。它比urllib模块更简洁、更易于使用。安装与介绍Installationrequests是Python的一个第三方库。使用pipinstallrequests来安装它。简介requests包含许多模块。这里只介绍主要模块:requests:主要模块提供HTTP请求方法。requests.session:session模块提供了多个请求之间共享请求信息的Session类。requests.adapters:适配器模块提供了不同协议的适配器类,用于处理不同协议的请求。requests.cookie:Cookie模块,用于处理cookie信息。requests.exceptions:异常处理模块,用于处理请求中可能出现的各种异常。requests.status_codes:状态码模块,提供HTTP状态码常量和状态码解释。使用方法request和responseimportrequests#importrequestsmoduleget_response=requests.get('http://httpbin.org/get')#sendgetrequestpost_response=requests.post('http://httpbin.org/post')#发送post请求print(get_response)#print(post_response)#requests库发送请求很简单,支持多种请求方式,如:get,post,put,删除等等。请求发起后,requests会返回一个Response对象,可以通过多种方式进行解析。importrequestsresponse=requests.get('http://httpbin.org/get')print(response.status_code)#返回响应状态码print(response.encoding)#返回响应信息的编码print(response.text)#ReturnResponsetextinformationprint(response.content)#返回response的字节信息print(response.json())#将JSON响应信息解析成字典,如果response数据类型不是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)请求头可以通过headers参数设置,headers是一个字典类型,key是请求头的字段名,value是对应请求h的值读者。可以通过params方法设置请求参数,类型为字典。key是参数名,value是对应参数的值。在网络请求中,携带的参数可以分为两种,它们在python中对应的字段名如下:查询字符串参数:params请求负载:data/json查询字符串参数params是在url中拼接的参数,常用在get中请求并用作查询参数。虽然data和json通常用于post请求,但它是要发送到服务器的实际数据。importrequestsheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/111.0.0.0Safari/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方法可以更好的模拟一个请求过程,不需要频繁设置cookies。Session的作用类似于浏览器中的cookie和缓存。可以用来在多个请求中维护一些状态信息,避免重复发送相同的信息和数据。使用Session可以优化HTTP请求的性能和可维护性。使用起来也非常简单。importrequestsession=requests.Session()#创建会话对象session.get('http://httpbin.org/cookies/set/username/test')#发起请求并模拟登录响应=session.get('http://httpbin.org/cookies')#getcookieprint(response.text)#{"cookies":{"username":"test"}}异常捕获requests.exceptions中提供了一系列的请求异常。ConnectTimeout:ConnectiontimedoutReadTimeout:ServerdidnotanswerwithinspecifiedtimeConnectionError:UnknownserverProxyError:ProxyexceptionURLRequired:InvalidURLTooManyRedirects:ToomanyredirectsMissingSchema:URLismissing,比如missing:http/httpsInvalidSchema:提供的URLscheme无效或不支持InvalidURL:提供的URL不知何故无效InvalidHeader:提供的请求标头无效InvalidProxyURL:提供的代理URL无效ChunkedEncodingError:服务器声明了一个编码块,但发送了一个无效块ContentDecodingError:无法解码响应消息StreamConsumedError:这个响应内容已经被使用RetryError:自定义重试逻辑错误UnrewindableBodyError:TherequestencounteredanerrorwhiletryingtorewindthetextHTTPError:AnHTTPerroroccurredSSLError:AnSSLerroroccurredTimeout:Therequesttimedouthttpx我提到了请求库较早,功能强大且易于使用它很简单,并提供了一个session会话模块。看来requests库可以满足所有的应用场景。但是请求也有一些致命的缺点:同步请求不支持异步,请求默认使用同步请求,网络请求中的同步请求会导致性能问题。不支持HTTP2.0,现在有少数网站使用HTTP2.0协议进行数据传输,此类网站不能使用requests。而httpx是一个基于异步IOPython3的全功能HTTP客户端库,旨在提供一个快速、简单、现代的HTTP客户端,它提供同步和异步API,支持HTTP1.1和HTTP2.0。而且httpx功能齐全,requests支持的功能httpx也基本支持。因此,在爬虫开发中使用httpx也是一个非常好的选择。安装与介绍安装httpx是Python的第三方库。使用pipinstallhttpx来安装它。如果你需要httpx支持https2.0,你需要安装它的可选依赖。pipinstallhttpx[http2]介绍httpx是成熟的基于requests的,除了易用性,提供的模块和requests类似,就不介绍了。httpx的使用方法和requests基本一样。这里主要介绍httpx的Client实例。httpxClientClient的功能和requests的session方法是一样的,只是用法有些不同。一个常见的用法是使用上下文管理器,它确保在请求完成后正确清理连接。importhttpxwithhttpx.Client()asclient:response=client.get('https://httpbin.org/get')print(response)#设置请求头的时候也有新的和传递参数的写法。importhttpxheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/111.0.0.0Safari/537.36'}params={'key':'value'}withhttpx.Client(headers=headers,params=params)asclient:response=client.get('https://httpbin.org/get')print(response)aiohttpaiohttp是一个基于Python的HTTP客户端asynchronousIO客户端/服务器库类似于httpx,同样支持HTTP1.1和HTTP2.0协议。aiohttp基于asyncio实现,支持WebSocket协议。安装aiohttp是Python的第三方库,使用pipinstallaiohttp安装useimportaiohttpimportasyncioasyncdefmain():asyncwithaiohttp.ClientSession()assession:asyncwithsession.get('https://httpbin.org/get')asresponse:print(response)#loop=asyncio.get_event_loop()loop.run_until_complete(main())aiohttp不支持同步并且需要与Asyncio同步使用。与上面提到的库相比,aiohttp极其复杂。requests中两行代码就可以完成的功能aiohttp需要5行。为什么aiohttp代码如此冗余以至于我们使用它?由于aiohttp是异步的,其API旨在充分利用非阻塞网络操作。在示例代码中,请求会阻塞3次,这为事件循环提供了3次切换上下文的机会。aiohttp可以实现单线程并发IO操作。在处理大量网站请求时比requests快很多,但是当涉及到文件读写操作时,它的作用就没有想象的那么大,所以aiohttp库的使用需要Reptile开发者自行斟酌。websocketPythonwebsocket库是一个专门用于创建WebSocket服务的库。WebSocket是用于客户端和服务器之间双向通信的协议。服务器可以向客户端推送数据,客户端也可以向服务器推送数据,从而实现数据的及时通信。它与HTTP协议有关。同理,由socket实现。WebSocket通常用于直播、弹幕等场景。安装websocket是Python自带的库,不需要手动安装。当你运行下面的例子时,如果报错cannotimportname'WebSocketApp'from'websocket',你可以卸载现有的websocket库,安装websocket-client==0.53.0版本的包。使用websocket进行客户端和服务器之间的通信。一般在爬虫的开发中只会进行客户端的开发,所以这里只介绍客户端的开发。使用WebSocketApp快速建立Websocket连接。fromwebsocketimportWebSocketAppdefon_message(ws,message):#收到消息时执行print(message)defon_error(ws,error):#发生异常时执行print(error)defon_close(ws):#执行print(当关闭连接时"WebSocketclosed")defon_open(ws):#Executews.send("Hello,WebSocket!")当打开连接时#Sendinformationif__name__=="__main__":ws=WebSocketApp("ws://echo.websocket.org/",on_message=on_message,on_error=on_error,on_close=on_close)ws.on_open=on_openws.run_forever()可以看到websocket提供了四个模块:on_message:接收服务器推送的数据on_error:当连接异常时会触发on_erroron_close:连接关闭时触发on_closeon_open:连接打开时触发on_open总结一下上面提到的五个库的使用,urllib,requests,httpx,aiohttp,websocket,这五个库基本可以满足爬虫开发中的request要求换货。urllib是python的内置库,使用起来比较麻烦,只能看懂了。requests是爬虫开发中最常用的库。功能齐全,使用方便。需要仔细研究。在请求的基础上,httpx支持异步处理、HTTP2.0和Websocket协议,httpx支持请求的功能,但是在性能上,httpx弱于其他请求库,而且httpx也需要爬虫初学者好好学习。aiohttp用于编写异步爬虫。开发效率低于其他库,但执行效率远高于其他库。也是需要掌握的请求库。websocket是一个专门用于Websocket协议的库,使用起来比较简单,需要的时候可以多多学习。