• Python3:urllib模块的使用


    Python3:urllib模块的使用
    1.基本方法

    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
        url:  需要打开的网址
        data:Post提交的数据
        timeout:设置网站的访问超时时间
    

    直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode*()解码,转换成str类型。

    from urllib import request
    response = request.urlopen(r'http://python.org/')
    page = response.read()
    page = page.decode('utf-8')
    urlopen返回对象提供方法:
    
    read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作
    
    info():返回HTTPMessage对象,表示远程服务器返回的头信息
    getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
    geturl():返回请求的url
    

     2.使用Request

    urllib.request.Request(url, data=None, headers={}, method=None)

    使用request()来包装请求,再通过urlopen()获取页面。

    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的状态。

    3.Post数据

    urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
    urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post。
    
    from urllib import request, parse
    url = r'http://www.lagou.com/jobs/positionAjax.json?'
    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, data=data)
    page = request.urlopen(req).read()
    page = page.decode('utf-8')
    

    urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

    urlencode()主要作用就是将url附上要提交的数据。

    data = {
         'first': 'true',
         'pn': 1,
         'kd': 'Python'
    }
    data = parse.urlencode(data).encode('utf-8')
    经过urlencode()转换后的data数据为?first=true?pn=1?kd=Python,最后提交的url为:
    http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python
    Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
    当然,也可以把data的数据封装在urlopen()参数中:
    page = request.urlopen(req, data=data).read()
    

       在这里就要说点实际应用的事儿了:

    从json中取出的数据类型和数据如下:
    <class 'dict'> {'install': {'install_date': '2018/09/26', 'install_result': 'success'}}
    经过转码:company_data = parse.urlencode(data).encode('utf-8')
    变成这样:b'install=%7B%27install_date%27%3A+%272018%2F09%2F26%27%2C+%27install_result%27%3A+%27success%27%7D'
    服务器端接收数据:
    data = request.POST.get("company_data")
    数据类型、数据分别如下:
    <class 'str'> {"install": {"install_result": "success", "install_date": "2018/09/26"}}
    

     我想要的字典变成了字符串,这就得找解决办法(用json去解决问题):

    客户端:
    import json
    with open('1.json', 'r') as f:
        data = json.load(f)
    
    data = {"company_data": json.dumps(data)}
    
    # urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post
    from urllib import request, parse
    url = r'http://192.168.165.4:8000/show/report/'
    company_data = parse.urlencode(data).encode('utf-8')
    req = request.Request(url, data=company_data)
    print(company_data)
    page = request.urlopen(req).read()
    page = page.decode('utf-8')
    
    服务器端:
    @csrf_exempt
    def receive_data(request):
        data = request.POST.get("company_data")
        if data:
            try:
                data = json.loads(data)
                print("企业数据", type(data), data)
                return HttpResponse(data)
            except ValueError as e:
                print(str(e))
        else:
            return HttpResponse("no data")
    

     4.处理异常

     1 from urllib import request, parse
     2 def get_page(url):
     3     headers = {
     4           'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ''
     5                         r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     6         'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     7         'Connection': 'keep-alive'
     8         }
     9     data = {
    10          'first': 'true',
    11          'pn': 1,
    12          'kd': 'Python'
    13      }
    14     data = parse.urlencode(data).encode('utf-8')
    15     req = request.Request(url, headers=headers)
    16     try:
    17         page = request.urlopen(req, data=data).read()
    18         page = page.decode('utf-8')
    19     except request.HTTPError as e:
    20         print(e.code())
    21         print(e.read().decode('utf-8'))
    22     return page
    get_page

    5.使用代理

    urllib.request.ProxyHandler(proxies=None)
    当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。

    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')
    page = opener.open(url, data).read()
    page = page.decode('utf-8')
    

    python3-urllib参考:https://www.cnblogs.com/Lands-ljk/p/5447127.html

  • 相关阅读:
    CSS 的 outline 属性
    CSS3 的 boxsizing 属性
    CSS 颜色的使用
    动态添加tab(ext)
    showModalDialog()重新加载问题
    DBUtility.SQLServerHelper”的类型初始值设定项引发异常
    终于有了思路
    js判断上传的图片格式
    session丢失 frame
    动态添加tab(ext中的treePanel)
  • 原文地址:https://www.cnblogs.com/fawaikuangtu123/p/9728612.html
Copyright © 2020-2023  润新知