urllib
简介
urllib通常分为四个模块
- request:是最基本的HTTP请求模块,可以用来模拟发送请求
- error:异常处理模块
- parse:工具模块,提供许多URL处理方法,比如拆分,解析,合并等
- robotparser:主要识别网站的robots.txt文件,然后判断网站是否可以爬虫,不常用
发送请求
urlopen()
基本使用:(此方式请求时GET请求)
import urllib.request
response = urllib.request.urlopen("https://www.baidu.com");
print(response.read().decode("utf-8"));
urlopen()的常用参数
- data参数
作用:如果传递了这个参数,请求方式为POST
data参数是可选的,如果要添加该参数,并且如果它是字节流编码格式的内容,即bytes类型,则需要通过bytes()方法转化。
#测试网址http://httpbin.org/
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
#post中需要是字节流
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read().decode("utf-8"))
- timeout
作用:可以设置时长,如果请求时间过长,则会抛出异常。
try:
response = urllib.request.urlopen("http://httpbin.org/post",timeout=0.01)
print(response.read().decode("utf-8"))
except urllib.error.URLError:
print("time out")
不常用参数
- context:必须时ssl.SSLContext类型,用来指定SSL设置
- cafile,capath:分别指定CA证书和它的路径,在请求HTTPS连接时会有用
响应的属性:response.属性
status | 响应的状态码 |
---|---|
getheaders() | 响应的头信息 |
Request
仍然通过urlopen()来放松请求,但是该方法的属性不再是URL,而是一个Request类型的对象
基本使用:
import urllib.request
request = urllib.request.Request("www.baidu.com")
response = urllib.request.urlopen(request)
print(response.read().decode("utf-8"))
其他常用的属性:
- data:如果要传data,必须是bytes(字节流)类型的,如果它是字典,可以先用urllib.pause模块中的urlencode()编码
- header:该参数是一个字典,就是请求头,可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例add_header()方法添加
最常用的就是通过修改User-Agent来伪装浏览器
#一些网站识别到是爬虫就会给服务器返回418
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
}
#构造请求
req = urllib.request.Request(url="https://www.douban.com/",headers=headers)
#将封装的对象传入
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
- method:用来指示请求的方法,一般时POST,GET
不常用属性
- origin_req_host:指的是请求方的host名称或者IP地址
- unverifiable:表示这个请求是否是无法验证的,默认时False,意思是说用户没有足够的权限来选择接受这个请求的结果。