获取网页资源
requests库具有获取网页内容和向网页中提交信息的功能,本节主要介绍如何获取网页内容及如何对获取的网页内容进行处理。
get()函数
在requests库中获取HTML网页内容的方法是使用get()函数。其使用形式如下:
get(url, params=None, **kwargs)
参数url:表示需要获取的HTML网址(也称为url)。
伊
参数params:表示可选参数,以字典的形式发送信息,当需要向网页中提交查询信息时使用,参数**kwargs:表示请求采用的可选参数。返回值:返回一个由类Response创建的对象。类Response位于requests库的models.py文件中。示例代码:
'''get函数'''
import requests
r = requests.get('https://www.ptpress.com.cn/')
print(r.text)
第1行代码导入了requests库。第2行使用requests库中的get()函数获取人民邮电出版社的官方网址,并返回一个Response对象给变量r。第3行代码使用print()语句输出变量r的text方法,Response对象中的text方法用于获取相应的文本内容
即网页的源代码。执行代码后的输出结果如图15-7所示,“Squeezed text(1019line).”表示获取的内容较多,IDLE会自动将内容收缩起来,可以用鼠标右键单击此处并选择“view”查看返回的完整信息,如图15-8所示。对比使用代码输出的信息和使用浏览器访问的网页源代码,它们的内容是相同的。
get()搜索信息
当在网页中搜索人民邮电出版社中的某些指定信息时,可以在图15-9所示的搜索框中输入搜索信息,例输入关键词“Excel”,搜索结果如图15-10所示。
从搜索结果网页中可以看到当前页面的网址为https://vww.ptpress,com.cn/search?keyword=excel其中https://www.ptpress.com.cn/为官网主页,search表示搜索,keyword表示搜索的关键词(这里值为
excel,表示需要搜索的关键词为“excel”),“?”用于分隔search和keyword。在其他网页中搜索也有与以上类似的效果,search或keyword可能会用其他字符表示,但基本形式是相园的。读者可在其他网页中进行尝试,例如使用百度的网址+s?wd=excel可以搜索到关键词为“excel”的内容其中s为search的缩写,wd为word的缩写。
在requests库中可以充分利用以上方法实现获取网页中的资源。
示例代码:
'''搜索信息'''
import requests
r = requests.get('https://www.ptpress.com.cn/search?keyword=excel')
print(r.text)
第2行代码用于实现在人民邮电出版社官网中搜索关键词为“word”的信息
get()添加信息
get()函数中第2个参数params会以字典的形式在ur1后自动添加信息,需要提前将params定义为字典示例代码:
'''添加信息'''
import requests
info ={'keyword':'excel' }
r = requests.get('https://www.ptpress.com.cn/search',params=info)
print(r.url)
print(r.text)
第2行代码建立字典info,包含一个键值对。
第3行代码使用get()函数获取网页,由于get()中包含参数params,因此系统会自动在url后添加字典信息形式为https://www.ptpress.com.cn/search?keyword=exce1,该使用形式便于灵活设定需要搜索的信息即可以添加或删除字典信息。
第4行代码输出返回的Response对象中的url,即获取网页的url。
执行代码后的输出结果如图15-11所示。
返回 Response 对象
通过get()函数获取HTML网页内容后,由于网页的多样性,通常还需要对网页返回的Response对象进行设置。本小节将主要讲解类Response中的方法。
Response 的属性
Response包含的属性有status_code、headers、url、encoding、cookies等。status_code(状态码):当获取一个HTML网页时,网页所在的服务器会返回一个状态码,表明本次获取网页的状态。例如访问人民邮电出版社官网,当使用get()函数发出请求时,人民邮电出版社官网的服务器接收到请求信息后,会先判断请求信息是否合理,如果请求合理则返回状态码200和网页信息;如果请求不合理则返
回一个异常状态码。常见的HTTP(Hypertext Transfer Protocol,超文本传送协议)状态码有200(请求成功)、301(网页内容被永久转移到其他url)、404(请求的网页不存在)、500(内部服务器错误)等,更多状态码可以使用搜索引擎查询。
因此在使用get()函数请求访问网页时,为了确保获取正确的网页信息,需要判断服务器返回的状态码是否为200。Response对象中的status_code为服务器返回的状态码。
示例代码:
'''状态码'''
import requests
r = requests.get('https://www.ptpress.com.cn')
print(r.status_code)
if r.status_code==200:
print(r.text)
else:
print('本次访问失败')
第3行代码输出Response对象返回的状态码。第4行代码用于判断状态码是否为200,如果为200,则输出获取的网页内容,否则表明访问存在异常。header(响应头):服务器返回的附加信息,主要包括服务器传递的数据类型、使用的压缩方法、语言、服务器的信息、响应该请求的时间等。
url:响应的最终url位置。
encoding:访问r.text时使用的编码。CDH8:访网范团的投件。这是服务器为别用户身份,对用户排作进行会话限储在用户本地端上的数据(详见15.5节)。
设置编码
当访间一个网页时,如果获取的内容是乱码,例如图15-12所示的内容为访间百度官网后返回的信息,其中存在大量的乱码信息。这是由网页读取编码错误导致的,可以通过设置requests.get(url)返回的Bespons对象的encoding='utr-8来修改“Response对象,text”文本内容的编码方式。同时Response对象中提供了apparent_encoding()方法来自动识别网页的编码方式,不过由于此方法是由机器自动识别,因此可能会存在识别错误的情况(大部分情况下是可用的)。
如果要设置自动识别网页的编码方式,可以使用以下
形式:
Response对象.encoding=Response对象,apparent_encoding
示例代码:
'''设置编码'''
import requests
r = requests.get('https://www.baidu.com')
r.encoding = r.apparent_encoding
print(r.text)
第3行代码设置自动识别网页的编码方式,执行代码后的输出结果中将包含可识别的文字,而不再是乱码如图15-13所示。当设置自动识别编码方式后依然出现内容乱码时,读者需要自行设置encoding编码方式。
返回网页内容
Response对象中返回网页内容有两种方法,分别是text()方法和content()方法,其中text()方法在前面的内容中有介绍,它是以字符串的形式返回网页内容。而content()方法是以二进制的形式返回网页内容,常用于直接保存网页中的媒体文件。
图 15-13
示例代码(下载人民邮电出版社官网中的图片):
'''网页内容'''
import requests
r = requests.get('https://cdn.ptpress.cn/uploadimg/Material/978-7-115-41359-8/72jpg/41359.jpg')
f2 = open('b.jpg','wb')
f2.write(r.content)
f2.close()
第2行代码使用get()方法访问了图片url。第3行代码使用open()函数创建了一个'b,jpg,文件,并且设置以二进制写入的模式第4行代码将获取的url内容以二进制形式写入文件。
聪明的
执行代码后将在相应文件夹中存储一张图片,如图15-14所示
息。如果读者需要对网负信息进们有纠以深度学习这几个库。
提交信息到网页
requests库除了可以从网页中获取资源,还可以将信息提交到网页中,本节将主要介绍如何使用,实现将信息上传到网站服务器中。
浏览器提交请求
在15.3节中介绍了如何通过requests库获取网页的内容,而当需要向网页中提交信息时,可以requests库中的post()函数来实现,提交内容包含表单、图片、文件等类型的数据。
可以在浏览器的检查窗口中观察到数据提交的过程。以在人邮教育社区中修改用户密码为例,观察浏览器提交数据的步骤如下。
步骤1,登录用户账户后,进入修改密码界面,如图15-18所示。需要在指定位置输入当前密码和新密码,这种文本框中的数据称为表单信息。
步骤2,在网页空白处单击鼠标右键并进入检查窗口,单击“Network”进入Network窗口,接下来在网页中输入用户的当前密码、新密码、确认密码,并单击“修改密码”按钮,如图15-19所示。
步骤3,提交信息后,在右边的Network窗口中将不断获取网页交互的信息,如图15-20所示。
形察4,找到提交密码的交互信息。在Name窗口中单击“"change-password”,观察其"Hearders”送
不的售息、可以发现在:G2neral”区城中的RequestMenna(更示情2d”、码方法)(为POST,书信息是通过P0S请求来提交数据的,如图15-21所示。而在最0(的示请来网D3方花设单数据)区城中了刚刚输入的密码,其中OldPassword对应网页中的当前密码。的“pa.Dea对盘网页中的新密码。frmPasword对应网页中的确认密码,它们的值正好为用户限附品入P&”0n15-22所示。由此可以CmName窗口中的change-password是提交给服务器的情期
以上内容是使用浏览器实现通过p0St请求提交数据的过程,接下来介绍使用requests库模拟浏览器提交调。,实现通过post请求将表单中的数据提交给服务器。
post()函数
post()函数可用于向网站发送数据请求。其使用形式如下:
bost(url,data=None, jgon=None, **kwargs)
参数url:表示网站url。
参数data:表示需要发送的数据对象,可以为字典、元组、列表、字节数据或文件。
参数json:表示需要发送的数据对象,该数据对象为JSON数据(具体内容见17.3节)。
参数**kwargs:表示请求采用的可选参数。
返回值:使用post()函数后返回一个Response对象。
示例代码
1 import requests02d=('0ldpassword':'123456python','NewPassword':'123python','Conflrmpassword' :'123python' }p3r=requests,post('https://account.ryjiaoyu.com/change-password', data-d)04 print(z.text)
第2行代码使用字典的形式保存了需要上传的数据。第3行代码使用post()函数访问修改密码网页ur,并提交修改密码数据。执行此代码后本质上还无法完成使用代码修改密码,因为在修改密码前还需要登录账户,这里代码并没有实现账户的登录,此处仅展示上传表单数据的方法。
15.4.3 上传文件的方法
如果需要将文件上传到网页中,可以使用files参数,该参数的内容为文件对象。示例代码:
import requests02 fp ={"ále":open('bitbug.ico’,'rb')}#上传的图片03r=requests.post('可上传图片的网址',files=fp)
04 print(r.text)
第2行代码创建了一个字典fp,其中键"file"对应的值为使用open()函数打开的图片对象。
第3行代码使用了post()函数上传这张图片,执行代码后会将此图片上传到网站服务器。