urlib库的使用
urlib库实际上不是很常用,因为其api调用复杂,已被requests模块取代。
1.request发送请求
from urllib import request #默认指定的是get请求 #urlopen可以指定data,设置了这个值,那么将变成post请求 response=request.urlopen('http://www.baidu.com') # print(response) #返回值:返回值是一个http.client.HTTPResponse对象,有read,readline,readlines以及getcode等方法 # print(response.read()) #读取前10个字节 # print(response.read(10)) #readline读取一行 # print(response.readline()) #readlines(),读取整个文件所有行,保存在一个列表变量中,每行作为一个元素,但读取大文件比较占内存 print(response.readlines()) #获取响应的状态码 # print(response.getcode())
2.request进行下载
from urllib import request #下载网页内容,第一个参数指定url,第二个参数指定要写入哪个文件的文件名 # request.urlretrieve('http://www.baidu.com','baidu.html') request.urlretrieve('https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3478835771,1633744087&fm=26&gp=0.jpg','luban.jpg')
3.request的编码与解码
这个主要是针对url的
from urllib import parse from urllib import request #urlencode函数的用法 # params={'name':'张三','age':18,'great':'hello world'} #传一个字典 # result=parse.urlencode(params) # print(result) # url='http://www.baidu.com/s' # params={'wd':'蔡徐坤'} # params=parse.urlencode(params) # print(params) # url=url+'?'+params # response=request.urlopen(url) # print(response.read()) #parse_qs函数的用法 解码 params={'name':'张三','age':18,'great':'hello world'} qs=parse.urlencode(params) print(qs) result=parse.parse_qs(qs) print(result)
4.将url进行分割的功能
from urllib import request from urllib import parse url='http://www.baidu.com/s?wd=python&username=lqz#1' # result=parse.urlparse(url) # print(result) #有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或urlsplit来进行分割 # print('scheme:',result.scheme) # print('netloc:',result.netloc) # print('path:',result.path) # print('params:',result.params) # print('query:',result.query) # print('fragment:',result.fragment) #fragment锚点 #urlsplit和urlparse的区别是urlsplit不会分割出params,以后使用的时候随便用哪个 #params用到的很少 #urlparse可以获取分号后的hello url2='http://www.baidu.com/s;hello?wd=python&username=lqz#1' print(parse.urlparse(url2)) result=parse.urlsplit(url) print(result) print(result.scheme) print(result.netloc)
5.使用代理
from urllib import request #7-ProxyHandler处理器 #通过ProxyHandler来设置使用代理服务器,防止同一ip访问网站次数过多被封禁 #常用的代理有:西刺,快代理,代理云 #httpbin.org专门测试http请求的,http://httpbin.org/ip 显示当前ip #没有使用代理的本机IP url='http://httpbin.org/ip' # resp=request.urlopen(url) # print(resp.read()) #使用代理的 #1.使用ProxyHandler传入代理构建一个handler #2.使用上面创建的handler构建一个opener #3.使用opener去发送一个请求 #使用代理 #传入一个字典 handler=request.ProxyHandler({'http':'60.2.44.182:46534'}) opener=request.build_opener(handler) resp=opener.open(url) print(resp.read())
6.携带cookie登录
from urllib import request #HTTP无状态协议,是指协议对于交互性场景没有记忆能力。 #参数含义 #NAME:cookie的名字 #VALUE:cookie的值 #Expires:cookie的过期时间 #Path:cookie作用的路径 #Domain:cookie作用的域名。设置的cookie默认只在主域名起作用,要设置子域名也起作用,要加这个。 #SECURE:是否只在https协议下起作用 #使用cookie模拟登陆 from urllib import request #老师人人网账户 email='970138074@qq.com' password='pythonspider' url='http://www.renren.com/880151247/profile' #不使用cookie # headers={ # 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36', # # } # req=request.Request(url=url,headers=headers) # resp=request.urlopen(url) # with open('renren.html','w',encoding='utf-8') as f: # f.write(resp.read().decode('utf-8')) #使用cookie,这样做太麻烦了,还有其他办法 # headers={ # "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36", # "Cookie":"anonymid=ju1t9qsph90pys; depovince=GW; _r01_=1; JSESSIONID=abcXfLxdWqMHi6Pe3ALNw; ick_login=e10e1e18-39d2-4e5c-a8b8-b90e4675fe8d; t=0ee4fa42a5f337b7e6368ed4f71ab8189; societyguester=0ee4fa42a5f337b7e6368ed4f71ab8189; id=970296329; xnsid=1a888270; jebecookies=f850bf5b-ecb9-40f2-b99e-541671612347|||||; ver=7.0; loginfrom=null; jebe_key=d6dba89f-a272-4afe-9157-347b5d152e41%7C49aae11d2fe745dc68a15c417d170403%7C1554333011073%7C1%7C1554333010402; wp_fold=0" # } # req=request.Request(url=url,headers=headers) # resp=request.urlopen(url) # with open('renren.html','w',encoding='utf-8') as f: # f.write(resp.read().decode('utf-8')) from http.cookiejar import CookieJar ''' CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie对象。 整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失 ''' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36', } #模拟登陆 def get_opener(): #创建一个cookiejar对象 cookiejar=CookieJar() #使用cookiejar创建一个HTTPCookieJar对象 handler=request.HTTPCookieProcessor(cookiejar) #使用上一步创建的handler创建一个opener opener=request.build_opener(handler) #使用opener发送登陆的请求(人人网的邮箱和密码) return opener def login_renren(opener): data={ 'email':'970138074@qq.com', 'password':'pythonspider' } from urllib import parse login_url='http://www.renren.com/ajaxLogin/login' req=request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers) opener.open(req) def visit_profile(opener): #访问个人主页 dapeng_url='http://www.renren.com/880151247/profile' req=request.Request(dapeng_url,headers=headers) resp=opener.open(req) with open('renren.html','w',encoding='utf-8') as f: f.write(resp.read().decode('utf-8')) if __name__ == '__main__': opener=get_opener() login_renren(opener) visit_profile(opener)
7.cookie信息的加载与保存
from urllib import request #保存cookie到本地 from http.cookiejar import MozillaCookieJar #指定保存到哪个文件 cookiejar=MozillaCookieJar('cookie.txt') handler=request.HTTPCookieProcessor(cookiejar) opener=request.build_opener(handler) # resp=opener.open('http://www.baidu.com') #前面已经传了文件名,现在save不用传文件名。前面如果没传,则save要传文件名。每次写都会重新覆盖文件 # cookiejar.save() #浏览器关闭,cookie过期的这种cookie是无法写入文件的。 resp=opener.open('http://httpbin.org/cookies/set?course=python') # print(resp.read()) #ignore_discard即使cookie将被丢弃也保存,ignore_expires即使cookie将过期也进行保存 cookiejar.save(ignore_discard=True,ignore_expires=True) #load 重用cookie信息,从本地loadcookie信息。要指定文件名,前面创建cookiejar的时候指定了文件名,则不用传 for cookie in cookiejar: print(cookie)
世界最优美的情书