zoukankan      html  css  js  c++  java
  • 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())
    View Code

    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')
    View Code

    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)
    View Code

    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)
    View Code

    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())
    View Code

    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)
    View Code

    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)
    View Code
  • 相关阅读:
    【html+css3】在一张jpg图片上,显示多张透明的png图片
    【php】php输出jquery的轮询,5秒跳转指定url
    【jquery采坑】Ajax配合form的submit提交(微擎表单提交,ajax验证,submit提交)
    【redis持久化】redis持久化理解
    【微信上传素材接口--临时&永久性】微信临时&永久性上传、获取返回的medie_id 和url
    【PHP】php生成一个不重复的数字(订单号、会员号)
    【MySQL】玩转触发器、监听器
    java 比较两个日期大小(2) 用before(), after()
    java 比较两个日期大小(1)
    SoapUI 获取当天时间
  • 原文地址:https://www.cnblogs.com/xufengnian/p/10788168.html
Copyright © 2011-2022 走看看