urllib的使用
urllib包含四个基本的模块。request:这是最基本的HTTP请求模块,可以模拟请求的发送。error:异常处理模块。如果出现请求异常,那么我们可以捕获这些异常,然后进行重试,使程序不会意外终止。parse:提供一个工具模块,提供了许多url的处理方法。robotparser:来网站的robots.txt文件,然后判断哪些文件可以爬,哪些网站不可以。
发送请求
尝试爬取Python官网
import urllib.request
response=urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))
通过简单的几行代码便得到了Python官网的源代码,输出得到的响应类型
import urllib.request
response=urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))
print(type(response))
输出结果为
这是一个HTTPResponse类型的对象。主要的属性有read,getheader,以及getheader方法。调用read方法时我们可以得到响应的网页内容,调用status属性可以获取到响应结果的状态码,调用getheaders方法可以输出响应头信息,调用getheader方法并传入server参数即可获取响应头中server的值,例如
import urllib.request
response=urllib.request.urlopen("https://www.python.org")
# print(response.read().decode("utf-8"))
print(response.getheaders())
print(response.getheader("Server"))
输出结果:
说明网站是用Nginx来搭建的。
给链接传递一些参数
data参数:添加参数时要将bytes方法将参数转化为字节流编码格式的内容,即是bytes类型。何为bytes类型?我们要知道Python的字符串类型是utf-8显示类型的序列,而bytes数据类型则是utf-8格式的二进制的不可变序列。进行一些测试:
import urllib.request
import urllib.parse
data=bytes(urllib.parse.urlencode({"name":"germy"}),encoding="utf-8")
response=urllib.request.urlopen("https://www.httpbin.org/post",data=data)
print(response.read().decode("utf-8"))
输出结果:
form中有我们传入的参数,意味着我们模拟表单提交。
timeout参数:用于设置超时时间,单位为秒,如果超出了我们设置的这个时间,没有得到响应就会抛出异常,如果不指定参数就会使用全局默认时间,这个参数支持HTTP、HTTPS、FTP请求。
data=bytes(urllib.parse.urlencode({"name":"germy"}),encoding="utf-8")
# response=urllib.request.urlopen("https://www.httpbin.org/post",data=data)
response=urllib.request.urlopen("https://www.httpbin.org/post",timeout=0.1)
print(response.read().decode("utf-8"))
输出会报错,原因是超时,