urllib: 自带的库
1.了解urllib库
2.熟悉掌握urllib库
3.熟悉urllib.request,处理cookie 代理设置
urllib常用库
urllib
"""
urllib库是python中一个最基本的网络请求库。可以模拟浏览器的行为。
在python3中urllib库中,所有的网络请求相关的方法,都被集到urllib.request模块中
"""
urloppen()
"""
urloppen: 创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据
1.url:请求的url
2.data:请求的data。如果设置了这个值,那么将变成post请求
3.返回值:返回的是一个http.client.HTTPResponse对象,这个对象是一个文件句柄对象
有read(size()) readline() readlines() getcode()等方法
"""
from urllib import request
resp = request.urlopen('https://www.baidu.com/')
print(resp.read())
print(resp.readlens())
urlretrieve()
"""
urlretrieve:这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:
"""
from urllib import request
request.urlretrieve('http://www.sogou.com/', 'sogou.html')
urlencode(), quote(), parse_qs()
"""
urlencode: 可以把字典数据转换位url编码的数据
quote(): 对字符串进行编码处理
parse_qs(): 可以将经过编码后的url参数进行解码
"""
from urllib import parse
data = {'name': '爬虫基础', 'greet': 'hello world', 'age': '100'}
qs = parse.urlencode(data)
print(qs)
urlparse(), urlsplit()
"""
urlparse 和 urlsplit:
有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候可以使用urlparse和urlsplit
两者唯一不同:
urlparse中有params熟悉
"""
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
# result = parse.urlparse(url)
result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
print(result.params)
request.Request类
"""
request.Request类:用于网络请求,可以添加请求头
如果想在请求的时候增加一些请求头,那么必须使用request.Request类来实现
比如要增加一个User-Agent
"""
from urllib import request
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
rq = request.Request('https://www.baidu.com', headers=header)
rq = request.urlopen(rq)
print(rq.read())
ProxyHandler()
"""
ProxyHandler处理器(代理设置)
很多网站会检测某一段时间某个IP的访问次数,如果访问次数多的不像正常人,他会禁止这个ip的访问
http://httpbin.org: 查看http请求的一些参数
"""
from urllib import request
# 使用代理
url = 'http://httpbin.org/ip'
# 1.使用ProxyHandler,传入代理构建一个headler
headler = request.ProxyHandler({'http':'42.176.134.184:9999'})
# 2.使用上面创建的handler构建一个opener
opener = request.build_opener(headler)
# 3.使用opener去发送一个请求
res = opener.open(url)
print(res.read())
cookie
"""
cookie:
某些网站为了辨别用户身份,进行session跟踪而储存在用户本地终端上的数据,cookie存储的数据有限,一般不超过4kb
cookie的格式:
Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
参数意义:
NAME:cookie的名字
VALUE:cookie的值
Expires:cookie的过期时间
Path:cookie作用的路径
Domain:cookie作用的域名
SECURE:是否只是在https协议下起作用
"""
- cookie之模拟登录知乎
from urllib import request
url = 'http://www.zhihu.com/hot'
resp = request.urlopen(url)
print(resp.read().decode('utf-8'))
# 因为没有cookie所以无法登录知乎,会停在登录页面
# 添加cookie后可以访问到知乎热榜
from urllib import request
url = 'http://www.zhihu.com/hot'
header = {
'cookie': '从浏览器复制'
}
url = request.Request(url, headers=header)
resp = request.urlopen(url)
print(resp.read().decode('utf-8'))
http.CookieJar模块
"""
http.cookiejar 模块
该模块主要的类有:
CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie,向传出的HTTP请求添加的cookie的对象。整个cookie都存储在内存中,对CookieJar实列进行垃圾回收后cookie也将丢失。
FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实列,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar(filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookie.txt兼容的FileCookieJar实列。
LWPCookieJar(filename,delayload=None):从FileCookieJar派生而来,创建与libwww-perl标准的Set-Cookie3 文件格式兼容的FileCookieJar实列。
"""
# 使用CookieJar模块获取cookie
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
# 先登录获取cookie,然后用cookie访问
# 创建cookiejar对象
cookiejar = CookieJar()
# 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
# 使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)
# 使用opener发送登录请求 (账户和密码)
post_url = '登录网址'
post_data = parse.urlencode({
'username': '',
'password': ''
})
req = request.Request(post_url, data=post_data.encode('utf-8'))
opener.open(req) # 运行到这里opener中已经有了cookie
# 访问个人网页
url = ''
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
rq = request.Request(url, headers=header)
resp = opener.open(rq)
print(resp.read().decode('utf-8'))
把cookie保存到本地
from urllib import request
from http.cookiejar import MozillaCookieJar
# cookie 保存
cookiejar = MozillaCookieJar("cookie.txt")
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com')
cookiejar.save() # ignore_discard=True 保存即将过期的cookie ignore_expires=True 即使cookie已经过期也保持并且覆盖
加载cookie
from urllib import request
from http.cookiejar import MozillaCookieJar
# 加载cookie
cookiejar = MozillaCookieJar("cookie.txt")
cookiejar.load() # 加载
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com')
for cookie in cookiejar:
print(cookie)