简介
urllib 是一个收集几个模块以处理URL的包:
- urllib.request 用于打开和读取URL
- urllib.error 包含由 urllib.request产生的异常
- urllib.parse 用于解析URL
- urllib.robotparser用于解析robots.txt文件
简单使用
- urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
获取url - urllib.request.urlretrieve(url,filename = None,reporthook = None,data = None )
下载文件
#使用示例
from urllib import request
url = 'http://www.baidu.com'
filename = 'baidu.html' #下载后保存的文件名
resp = request.urlopen(url) #获取url
print(resp.read()) #查看url响应
print(resp.getcode()) # 获取状态码
request.urlretrieve(url,filename) #下载文件
urlencode()和parse_qs()
- urlencode()
用浏览器发送请求的时候,如果url包含中文或者特殊字符,浏览器会自动编码,如果使用代码发送请求,就必须手动进行编码,这时候就应该使用urlencode函数编码,可以把字典数据转换成url编码的数据 - parse_qs()
与urlencode()相反,可以吧编码的内容解码回字典形式
from urllib import parse
data = {'name':'爬虫','greet':'hello world','age':100}
url='https://www.baidu.com/s'
params = {"wd":"卷福"}
qs = parse.urlencode(params) #编码
url=url+'?'+qs
print('字典:',params)
print("编码:",qs)
print("完整URL:",url)
qs = parse.parse_qs(qs) #还原编码内容
print("还原:",qs)
urlparse()和urlsplit()
对url各个部分进行分割,区别在于urlsplit()没有params这一项
from urllib import request
url = 'http://www.baidu.com/s;hello_parms?wd=卷福&username=abc#1'
result = request.urlsplit(url)
print(result)
print('Scheme:',result.scheme)
print('Netloc:',result.netloc)
print('Path:',result.path)
print('Query:',result.query)
print('Fragment:',result.fragment)
result = request.urlparse(url)
print(result)
print('Scheme:',result.scheme)
print('Netloc:',result.netloc)
print('Path:',result.path)
print('Params:',result.params) #区别:urlsplit()没有params这一项
print('Query:',result.query)
print('Fragment:',result.fragment)
request类常见用法
- class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)¶
from urllib import request,parse
url='https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false'
headers = { #设置报文首部,可以通过浏览器抓包得到
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
}
data = { #POST方法的内容,可以通过浏览器抓包得到
'first': 'true',
'pn':1,
'kd':'python'
}
req = request.Request(url,headers=headers,
data=parse.urlencode(data).encode('utf-8'),method='POST')
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
设置代理
- class urllib.request.ProxyHandler(proxies=None)
常用的免费代理
from urllib import request
url='http://httpbin.org/ip' #http://httpbin.org/ip 用于判断请求的ip是否发生变化
#1.使用ProxyHandler,传入代理构建一个handler
handler=request.ProxyHandler({"http":"119.145.2.99:44129"}) #字典键表示代理支持的请求方式,值为代理的ip。
#2.构建opener
opener = request.build_opener(handler)
#3.使用opener发送请求
resp = opener.open(url)
print(resp.read())