当前位置: 首页 > 后端技术 > Python

简单实用的Requests模块

时间:2023-03-26 00:55:35 Python

1.爬行动物的概念不是动物,而是计算机程序。这类程序有其特定的功能,可以根据用户给定的一系列规则自行浏览万维网并获取所需信息。此类程序称为网络爬虫或蜘蛛。它具有智能分析功能,也称为机器人。爬虫的应用领域:百度、谷歌等面向搜索的公司利用其自行开发的爬虫程序,对互联网上的网页中的数据进行爬取、分析、分类、存储……然后提供给用户使用。新闻聚合应用也使用爬虫程序,爬取各种新闻网站的新闻信息,整理分类后提供给用户。爬虫可用于各种需要数据分析的应用领域。比如价格分析,根据商品关键词抓取各个商城的商品价格,对比分析价格,呈现给用户一个直观的对比表。爬虫从网络上爬取数据时,需要遵守Rebots协议。Rebots协议是网站制定的资源共享列表,规定了爬虫在本网站爬取数据时,哪些资源可以爬取,哪些资源不能爬取。爬虫的工作流程:识别目标网页。此页面是起始页或入口页。获取页面的数据,通过一定的方法(比如正则表达式)获取页面中的相关信息。它还可以提取页面中的链接,并以递归的方式继续分析和提取页面数据。信息被永久存储以供后续处理。2.Python爬虫模块爬虫程序的核心逻辑之一就是通过网络请求方式下载指定页面的数据。爬虫本质上是一个网络应用程序。Python提供了丰富的库或模块来帮助开发人员快速开发此类网络应用程序。2.1urllib库urllib库是python的内置库,不需要单独安装。完整的urllib库包括以下5个模块:urllib.request:可以使用不同的协议发送请求包,并得到请求后的响应结果。urllib.response:用于解析响应包数据。urllib.error:包含由urllib.request生成的异常。urllib.parse:用于解析和处理URL。urllib.robotparse:用于解析页面的robots.txt文件。使用urllib.request模块发送网络请求:importurllib.request#基于https协议的URL地址url="https://www.cnblogs.com/guo-ke/p/15951196.html"#构建请求对象req=urllib.request.Request(url)#使用urlopen方式发送请求包withurllib.request.urlopen(req)asresp:#解析数据data=resp.read()print(data.decode())urllib.request.Request()类说明:构建请求包。类原型声明:classRequest:def__init__(self,url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None):#...其他代码块构造方法参数说明url:Torequest的url地址。data:data必须是bytes(字节流)类型,如果是字典,可以使用urllib.parse模块中的urlencode()进行编码headers:headers是字典类型,用于描述请求头信息。可以在构造方法中指定,也可以调用add_header()方法添加。默认的User-Agent是Python-urlliborigin_req_host:指定请求者的主机名或ip地址。unverifiable:设置网页是否需要验证,默认为False。method:用于指定请求使用的方法,如GET、POST或PUT。很多网站都有反爬虫设置,浏览器以外的访问都被认为是非法请求。所以爬虫需要伪装成浏览器。fromurllibimportrequest,parseurl='http://www.guo-ke.com/post'headers={#伪装成GoogleChrome'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/99.0.4844.51Safari/537.36','Host':'guo-ke.org'}dict={'name':'guoke','key':'python'}#数据必须是字节流data=bytes(parse.urlencode(dict),encoding='utf8')'''#转成URL格式的字符串data=parse.urlencode(dict)#编码成字节流数据data=data.encode()'''request=request.Request(url=url,data=data,headers=headers,method='POST')#req.add_header('User-Agent','Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/99.0.4844.51Safari/537.36')以request.urlopen(req)作为响应:res=(response.read()print(res.decode)('utf-8'))提示:当使用data参数或者指定method="POST"时,是POST请求,GET请求也可以加上请求参数:https://www.baidu.com/s?wd=javaurllib.request.urlopen()方法描述:发送网络请求。defurlopen(url,data=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*,cafile=None,capath=None,cadefault=False,context=None):参数说明:url:可以接收一个URL字符串或者一个urllib.request。请求对象。data:POST请求的数据,GET请求设置为None。timeout:设置网站访问超时时间。仅在使用HTTP、HTTPS、FTP协议请求连接时使用。cafile、capath:使用HTTPS请求时,用于指定CA数字证书。cafile指定数字证书文件。capath指定包含数字证书文件的目录。返回类型说明:无论使用什么协议发送请求,返回的对象都会包含3个通用方法。geturl()返回请求的资源URL。info()返回元数据信息,例如消息头。getcode()返回响应的状态代码。如果有错误,将抛出URLError异常。当使用http或https协议请求时,返回一个http.client.HTTPResponse对象。除了以上3个方法,该对象还包括:read():获取response返回的bytes类型数据,只能使用一次。输出时需要使用decode()进行解码。getheaders():获取返回的响应头信息。使用urllib.request下载一张图片:爬虫程序的强大之处在于可以批量递归下载用户需要的数据。一个强大的逻辑背后的想法可能会得到一个简单原则的支持。我们可以先尝试下载一张图片,一窥大局。importurllib.request#图片URLurl="https://img2022.cnblogs.com/blog/2749732/202202/2749732-20220222195931956-448995015.jpg"withurllib.request.urlopen(url)asresp:data=resp.read()withopen("d:/my_file.jpg","wb")asf:f.write(data)打开对应盘符,可以查看图片是否下载成功。urllib.request还提供了一个更方便的urlretrieve()方法。下载的字节流数据可以直接存储为文件。fromurllibimportrequesturl="https://img2022.cnblogs.com/blog/2749732/202202/2749732-20220222195931956-448995015.jpg"#urlretrieve()方法传入的第二个参数为文件保存位置,和文件名。request.urlretrieve(url,'d:/temp.jpg')2.2。requests库requests是基于urllib编写的第三方库。使用时需要下载安装:pip3installrequests主要提供两个方法:1.get()方法用于发送GET请求。defget(url,params=None,**kwargs):#...参数说明:url:要请求的url资源(字符串类型)。params:查询数据,可以是字典、列表、元组或字节类型。kwargs:以键值对形式描述的请求消息头参数。GET基本用法:importrequests#用get发送请求并得到响应response=requests.get('https://www.cnblogs.com/guo-ke/p/15925214.html')#使用text查看responsecontentprint(response.text)getrequestwithparametersimportrequestsresponse=requests.get('https://www.baidu.com/s?wd=java')#将参数拼接在url后面,用问号分隔,并在参数之间用&分隔参数print(response.text)字典格式importrequestsdata={'wd':'java'}response=requests.get('https://www.baidu.com/s',params=data)#使用字典的形式传递给params参数,不用自己写url代码。print(response.text)GET方法返回一个Responese对象,该对象提供相应的属性或方法来解析响应包中的数据。response.encoding:获取当前编码。response.encoding='utf-8':设置编码。response.text:根据响应头的字符编码自动解码。response.content:以字节(二进制)返回。response.headers:将服务器响应头存放在一个字典对象中,字典中的key不区分大小写,key不存在则返回None。response.status_code:响应状态码。response.raw:返回原始的responsebody,即urllib的response对象,使用response.raw.read()response.json():Requests中内置的JSON解码器,以json形式返回,前提是返回的内容是json格式,否则解析错误会抛出异常。下载图片导入请求#;图片地址url="https://img2022.cnblogs.com/blog/2749732/202202/2749732-20220222195931956-448995015.jpg"#Requestheadermetadataheaders={'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_13_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/66.0.3359.181Safari/537.36'}response=requests.get(url,headers=headers)#获取字节流Datadata=response.content#保存字节流datawithopen("d:/test.jpg","wb")asf:f.write(data)2.post()方法:post方式发送请求defpost(url,data=None,json=None,**kwargs):参数说明:url:string类型需要请求的url资源。data:发送数据,可以是字典、列表、元组、字节类型json:json格式的数据。kwargs:以键值对形式描述的请求头参数。基本用法importrequestsdata={'name':'zhuzhu','age':'23'}headers={'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_11_4)AppleWebKit/537.36(KHTML,likeGecko)Chrome/52.0.2743.116Safari/537.36'}response=requests.post("http://httpbin.org/post",data=data,headers=headers)#Datamustbejsonpackageprint(response.json())3.总结Requests是一个基于urllib编写的第三方库,比urllib更易用。对于它的API介绍,本文只做一些简单的说明。更多方法或使用方法,请参考文档。