zoukankan      html  css  js  c++  java
  • ┱Python中关于urllib和urllib2的问题

    python3对urllib和urllib2进行了重构
    主要拆分成了:
    1、urllib.request
      1、urllib.request.Request(url, data=None, headers={}, method=None)

    url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'
    headers = {
    'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
    r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     'Connection': 'keep-alive'
    }
    req = request.Request(url, headers=headers)
    page = request.urlopen(req).read()
    page = page.decode('utf-8')

    用来包装头部的数据:
    User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
    Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
    Connection:表示连接状态,记录Session的状态。
      2、urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
        url:需要打开的网址urllib.request.urlopen('https://www.baidu.com/')

     from urllib import request
     response = request.urlopen(r'http://python.org/') # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse类型
    page = response.read()
    page = page.decode('utf-8')

    #此处为何不用page.encode('utf-8')
    #decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
    #encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
    urlopen返回对象提供方法:
    read()#读取整个文件 ,
    readline()#每次读取一行内容 ,
    readlines()#读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。
    fileno()#方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
    close() :关闭文件
    info():返回HTTPMessage对象,表示远程服务器返回的头信息
    getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
    geturl():返回请求的url

        data:post提交的数据
        timeout:设置网站的访问超时时间
      3、urllib.request.ProxyHandler()

    data = {
             'first': 'true',
             'pn': 1,
             'kd': 'Python'
         }
    proxy = request.ProxyHandler({'http': '5.22.195.215:80'})  # 设置proxy
    opener = request.build_opener(proxy)  # 挂载opener
    request.install_opener(opener)  # 安装opener
    data = parse.urlencode(data).encode('utf-8')
    age = opener.open(url, data).read()
    page = page.decode('utf-8')
    return page

    2、urllib.urlretrieve(url[, filename[, reporthook[, data]]]):

    urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度,下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度。

    def cbk(a, b, c):
      '''回调函数
      @a: 已经下载的数据块
      @b: 数据块的大小
      @c: 远程文件的大小
      '''
      per = 100.0 * a * b / c
      if per > 100:
        per = 100
      print ('%.2f%%' % per)
    
    url = 'http://www.sina.com.cn'
    local = 'd://sina.html'
    urllib.urlretrieve(url, local, cbk)
    


    3、urllib.parse
      1、urllib.parse.urlencode()#将提交的数据encode为byte编码
    4、urllib.error等几个子模块。#抛出请求错误

    import urllib
    from urllib import parse
    from urllib import request
    
    
    def get_page(url):
        headers = {
              'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
             'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
              'Connection': 'keep-alive'
        }
        data = {
             'first': 'true',
             'pn': 1,
             'kd': 'Python'
        }
        data = parse.urlencode(data).encode('utf-8')
        req = request.Request(url, headers=headers)
        try:
            page = request.urlopen(req, data=data).read()
            page = page.decode('utf-8')
            print(page)
        except error.HTTPError as e:
            print(e.code())
            print(e.read().decode('utf-8'))
        return page
    get_page('https://www.baidu.com/')
  • 相关阅读:
    UWP关于图片缓存的那些破事儿
    UWP中的文件相关操作
    数据结构-快速排序(C#实现)
    C#与Swift异步操作的差异
    Windows环境下使用Clover四叶草引导双硬盘安装OSX 10.11.5原版镜像
    Winform以任意角度旋转PictureBox中的图片的方法
    Xcode调用旧版本库出现Undefined symbols for architecture x86_64: ld: symbol(s) not found for architecture x86_64
    做WP程序时遇到的一些问题及解决方法
    WInform关闭程序的几种方法以及区别。
    显示在标题上的进度条
  • 原文地址:https://www.cnblogs.com/888888CN/p/7031306.html
Copyright © 2011-2022 走看看