精华内容
下载资源
问答
  • 基于概念格和改进粒子群算法的铁水硅含量预测模型.pdf
  • 手把手教你利用爬虫爬网页(Python代码)

    万次阅读 多人点赞 2019-05-14 14:34:48
    万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。 通用搜索引擎大多提供...

    640?wx_fmt=jpeg

    本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以便具备编写HTTP网络程序的能力。


    01

    网络爬虫概述


    接下来从网络爬虫的概念、用处与价值和结构等三个方面,让大家对网络爬虫有一个基本的了解。

    1. 网络爬虫及其应用

    随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战,网络爬虫应运而生。网络爬虫(又被称为网页蜘蛛、网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。下面通过图3-1展示一下网络爬虫在互联网中起到的作用:


    640?wx_fmt=png

    ▲图3-1 网络爬虫


    网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

    搜索引擎(Search Engine),例如传统的通用搜索引擎baidu、Yahoo和Google等,是一种大型复杂的网络爬虫,属于通用性网络爬虫的范畴。但是通用性搜索引擎存在着一定的局限性:

    1. 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。

    2. 通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。

    3. 万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。

    4. 通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。

    为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。

    聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择地访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。

    说完了聚焦爬虫,接下来再说一下增量式网络爬虫。增量式网络爬虫是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。

    和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。

    例如:想获取赶集网的招聘信息,以前爬取过的数据没有必要重复爬取,只需要获取更新的招聘数据,这时候就要用到增量式爬虫。

    最后说一下深层网络爬虫。Web页面按存在方式可以分为表层网页和深层网页。表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的Web页面。深层网络是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的Web页面。

    例如用户登录或者注册才能访问的页面。可以想象这样一个场景:爬取贴吧或者论坛中的数据,必须在用户登录后,有权限的情况下才能获取完整的数据。

    2. 网络爬虫结构

    下面用一个通用的网络爬虫结构来说明网络爬虫的基本工作流程,如图3-4所示。


    640?wx_fmt=png

    ▲图3-4 网络爬虫结构

    网络爬虫的基本工作流程如下:

    1. 首先选取一部分精心挑选的种子URL。

    2. 将这些URL放入待抓取URL队列。

    3. 从待抓取URL队列中读取待抓取队列的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。

    4. 分析已抓取URL队列中的URL,从已下载的网页数据中分析出其他URL,并和已抓取的URL进行比较去重,最后将去重过的URL放入待抓取URL队列,从而进入下一个循环。

    02

    HTTP请求的Python实现


    通过上面的网络爬虫结构,我们可以看到读取URL、下载网页是每一个爬虫必备而且关键的功能,这就需要和HTTP请求打交道。接下来讲解Python中实现HTTP请求的三种方式:urllib2/urllib、httplib/urllib以及Requests。

    1. urllib2/urllib实现

    urllib2和urllib是Python中的两个内置模块,要实现HTTP功能,实现方式是以urllib2为主,urllib为辅。

    1.1 首先实现一个完整的请求与响应模型

    urllib2提供一个基础函数urlopen,通过向指定的URL发出请求来获取数据。最简单的形式是:

    
     

    import urllib2
    response=urllib2.urlopen('http://www.zhihu.com')
    html=response.read()
    print html

    其实可以将上面对http://www.zhihu.com的请求响应分为两步,一步是请求,一步是响应,形式如下:

    
     

    import urllib2
    # 请求
    request=urllib2.Request('http://www.zhihu.com')
    # 响应
    response = urllib2.urlopen(request)
    html=response.read()
    print html

    上面这两种形式都是GET请求,接下来演示一下POST请求,其实大同小异,只是增加了请求数据,这时候用到了urllib。示例如下:

    
     

    import urllib
    import urllib2
    url = 'http://www.xxxxxx.com/login'
    postdata = {'username' : 'qiye',
        'password' : 'qiye_pass'}
    # info 需要被编码为urllib2能理解的格式,这里用到的是urllib
    data = urllib.urlencode(postdata)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    html = response.read()

    但是有时会出现这种情况:即使POST请求的数据是对的,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息,服务器会检验请求头,来判断是否是来自浏览器的访问,这也是反爬虫的常用手段。

    1.2 请求头headers处理

    将上面的例子改写一下,加上请求头信息,设置一下请求头中的User-Agent域和Referer域信息。

    
     

    import urllib
    import urllib2
    url = 'http://www.xxxxxx.com/login'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    referer='http://www.xxxxxx.com/'
    postdata = {'username' : 'qiye',
        'password' : 'qiye_pass'}
    # 将user_agent,referer写入头信息
    headers={'User-Agent':user_agent,'Referer':referer}
    data = urllib.urlencode(postdata)
    req = urllib2.Request(url, data,headers)
    response = urllib2.urlopen(req)
    html = response.read()

    也可以这样写,使用add_header来添加请求头信息,修改如下:

    
     

    import urllib
    import urllib2
    url = 'http://www.xxxxxx.com/login'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    referer='http://www.xxxxxx.com/'
    postdata = {'username' : 'qiye',
        'password' : 'qiye_pass'}
    data = urllib.urlencode(postdata)
    req = urllib2.Request(url)
    # 将user_agent,referer写入头信息
    req.add_header('User-Agent',user_agent)
    req.add_header('Referer',referer)
    req.add_data(data)
    response = urllib2.urlopen(req)
    html = response.read()

    对有些header要特别留意,服务器会针对这些header做检查,例如:

    • User-Agent:有些服务器或Proxy会通过该值来判断是否是浏览器发出的请求。

    • Content-Type:在使用REST接口时,服务器会检查该值,用来确定HTTP Body中的内容该怎样解析。在使用服务器提供的RESTful或SOAP服务时,Content-Type设置错误会导致服务器拒绝服务。常见的取值有:application/xml(在XML RPC,如RESTful/SOAP调用时使用)、application/json(在JSON RPC调用时使用)、application/x-www-form-urlencoded(浏览器提交Web表单时使用)。

    • Referer:服务器有时候会检查防盗链。

    1.3 Cookie处理

    urllib2对Cookie的处理也是自动的,使用CookieJar函数进行Cookie的管理。如果需要得到某个Cookie项的值,可以这么做:

    
     

    import urllib2
    import cookielib
    cookie = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
    response = opener.open('http://www.zhihu.com')
    for item in cookie:
        print item.name+':'+item.value

    但是有时候会遇到这种情况,我们不想让urllib2自动处理,我们想自己添加Cookie的内容,可以通过设置请求头中的Cookie域来做:

    
     

    import  urllib2
    opener = urllib2.build_opener()
    opener.addheaders.append( ( 'Cookie''email=' + "xxxxxxx@163.com" ) )
    req = urllib2.Request( "http://www.zhihu.com/" )
    response = opener.open(req)
    print response.headers
    retdata = response.read()

    1.4 Timeout设置超时

    在Python2.6之前的版本,urllib2的API并没有暴露Timeout的设置,要设置Timeout值,只能更改Socket的全局Timeout值。示例如下:

    
     

    import urllib2
    import socket
    socket.setdefaulttimeout(10# 10 秒钟后超时
    urllib2.socket.setdefaulttimeout(10# 另一种方式

    在Python2.6及新的版本中,urlopen函数提供了对Timeout的设置,示例如下:

    
     

    import urllib2
    request=urllib2.Request('http://www.zhihu.com')
    response = urllib2.urlopen(request,timeout=2)
    html=response.read()
    print html

    1.5 获取HTTP响应码

    对于200 OK来说,只要使用urlopen返回的response对象的getcode()方法就可以得到HTTP的返回码。但对其他返回码来说,urlopen会抛出异常。这时候,就要检查异常对象的code属性了,示例如下:

    
     

    import urllib2
    try:
        response = urllib2.urlopen('http://www.google.com')
        print response
    except urllib2.HTTPError as e:
        if hasattr(e, 'code'):
            print 'Error code:',e.code

    1.6 重定向

    urllib2默认情况下会针对HTTP 3XX返回码自动进行重定向动作。要检测是否发生了重定向动作,只要检查一下Response的URL和Request的URL是否一致就可以了,示例如下:

    
     

    import urllib2
    response = urllib2.urlopen('http://www.zhihu.cn')
    isRedirected = response.geturl() == 'http://www.zhihu.cn'

    如果不想自动重定向,可以自定义HTTPRedirectHandler类,示例如下:

    
     

    import urllib2
    class RedirectHandler(urllib2.HTTPRedirectHandler):
        def http_error_301(self, req, fp, code, msg, headers):
            pass
        def http_error_302(self, req, fp, code, msg, headers):
            result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, 
            msg, headers)
            result.status = code
            result.newurl = result.geturl()
            return result
    opener = urllib2.build_opener(RedirectHandler)
    opener.open('http://www.zhihu.cn')

    1.7 Proxy的设置

    在做爬虫开发中,必不可少地会用到代理。urllib2默认会使用环境变量http_proxy来设置HTTP Proxy。但是我们一般不采用这种方式,而是使用ProxyHandler在程序中动态设置代理,示例代码如下:

    
     

    import urllib2
    proxy = urllib2.ProxyHandler({'http''127.0.0.1:8087'})
    opener = urllib2.build_opener([proxy,])
    urllib2.install_opener(opener)
    response = urllib2.urlopen('http://www.zhihu.com/')
    print response.read()

    这里要注意的一个细节,使用urllib2.install_opener()会设置urllib2的全局opener,之后所有的HTTP访问都会使用这个代理。这样使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的Proxy设置,这种场景在爬虫中很常见。比较好的做法是不使用install_opener去更改全局的设置,而只是直接调用opener的open方法代替全局的urlopen方法,修改如下:

    
     

    import urllib2
    proxy = urllib2.ProxyHandler({'http''127.0.0.1:8087'})
    opener = urllib2.build_opener(proxy,)
    response = opener.open("http://www.zhihu.com/")
    print response.read()


    2. httplib/urllib实现

    httplib模块是一个底层基础模块,可以看到建立HTTP请求的每一步,但是实现的功能比较少,正常情况下比较少用到。在Python爬虫开发中基本上用不到,所以在此只是进行一下知识普及。下面介绍一下常用的对象和函数:


    • 创建HTTPConnection对象:

      class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])。

    • 发送请求:

      HTTPConnection.request(method, url[, body[, headers]])。

    • 获得响应:

      HTTPConnection.getresponse()。

    • 读取响应信息:

      HTTPResponse.read([amt])。

    • 获得指定头信息:

      HTTPResponse.getheader(name[, default])。

    • 获得响应头(header, value)元组的列表:

      HTTPResponse.getheaders()。

    • 获得底层socket文件描述符:

      HTTPResponse.fileno()。

    • 获得头内容:

      HTTPResponse.msg。

    • 获得头http版本:

      HTTPResponse.version。

    • 获得返回状态码:

      HTTPResponse.status。

    • 获得返回说明:

      HTTPResponse.reason。

    接下来演示一下GET请求和POST请求的发送,首先是GET请求的示例,如下所示:

    
     

    import httplib
    conn =None
    try:
        conn = httplib.HTTPConnection("www.zhihu.com")
        conn.request("GET""/")
        response = conn.getresponse()
        print response.status, response.reason
        print '-' * 40
        headers = response.getheaders()
        for h in headers:
            print h
        print '-' * 40
        print response.msg
    except Exception,e:
        print e
    finally:
        if conn:
            conn.close()

    POST请求的示例如下:

    
     

    import httplib, urllib
    conn = None
    try:
        params = urllib.urlencode({'name''qiye''age'22})
        headers = {"Content-type""application/x-www-form-urlencoded"
        , "Accept""text/plain"}
        conn = httplib.HTTPConnection("www.zhihu.com"80, timeout=3)
        conn.request("POST""/login", params, headers)
        response = conn.getresponse()
        print response.getheaders() # 获取头信息
        print response.status
        print response.read()
    except Exception, e:
        print e
        finally:
        if conn:
            conn.close()

    3. 更人性化的Requests

    Python中Requests实现HTTP请求的方式,是本人极力推荐的,也是在Python爬虫开发中最为常用的方式。Requests实现HTTP请求非常简单,操作更加人性化。

    Requests库是第三方模块,需要额外进行安装。Requests是一个开源库,源码位于:

    GitHub: https://github.com/kennethreitz/requests

    希望大家多多支持作者。

    使用Requests库需要先进行安装,一般有两种安装方式:

    • 使用pip进行安装,安装命令为:pip install requests,不过可能不是最新版。

    • 直接到GitHub上下载Requests的源代码,下载链接为:

      https://github.com/kennethreitz/requests/releases

      将源代码压缩包进行解压,然后进入解压后的文件夹,运行setup.py文件即可。

    如何验证Requests模块安装是否成功呢?在Python的shell中输入import requests,如果不报错,则是安装成功。如图3-5所示。

    640?wx_fmt=png

    ▲图3-5 验证Requests安装

    3.1 首先还是实现一个完整的请求与响应模型

    以GET请求为例,最简单的形式如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    print r.content

    大家可以看到比urllib2实现方式的代码量少。接下来演示一下POST请求,同样是非常简短,更加具有Python风格。示例如下:

    
     

    import requests
    postdata={'key':'value'}
    r = requests.post('http://www.xxxxxx.com/login',data=postdata)
    print r.content

    HTTP中的其他请求方式也可以用Requests来实现,示例如下:

    
     

    r = requests.put('http://www.xxxxxx.com/put', data = {'key':'value'})
    r = requests.delete('http://www.xxxxxx.com/delete')
    r = requests.head('http://www.xxxxxx.com/get')
    r = requests.options('http://www.xxxxxx.com/get')

    接着讲解一下稍微复杂的方式,大家肯定见过类似这样的URL:

    http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1

    就是在网址后面紧跟着“?”,“?”后面还有参数。那么这样的GET请求该如何发送呢?肯定有人会说,直接将完整的URL带入即可,不过Requests还提供了其他方式,示例如下:

    
     

    import requests
        payload = {'Keywords''blog:qiyeboy','pageindex':1}
    r = requests.get('http://zzk.cnblogs.com/s/blogpost', params=payload)
    print r.url

    通过打印结果,我们看到最终的URL变成了:

    http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1

    3.2 响应与编码

    还是从代码入手,示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    print 'content-->'+r.content
    print 'text-->'+r.text
    print 'encoding-->'+r.encoding
    r.encoding='utf-8'
    print 'new text-->'+r.text

    其中r.content返回的是字节形式,r.text返回的是文本形式,r.encoding返回的是根据HTTP头猜测的网页编码格式。

    输出结果中:“text-->”之后的内容在控制台看到的是乱码,“encoding-->”之后的内容是ISO-8859-1(实际上的编码格式是UTF-8),由于Requests猜测编码错误,导致解析文本出现了乱码。Requests提供了解决方案,可以自行设置编码格式,r.encoding='utf-8'设置成UTF-8之后,“new text-->”的内容就不会出现乱码。

    但是这种手动的方式略显笨拙,下面提供一种更加简便的方式:chardet,这是一个非常优秀的字符串/文件编码检测模块。安装方式如下:

    
     

    pip install chardet

    安装完成后,使用chardet.detect()返回字典,其中confidence是检测精确度,encoding是编码形式。示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    print chardet.detect(r.content)
    r.encoding = chardet.detect(r.content)['encoding']
    print r.text

    直接将chardet探测到的编码,赋给r.encoding实现解码,r.text输出就不会有乱码了。

    除了上面那种直接获取全部响应的方式,还有一种流模式,示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com',stream=True)
    print r.raw.read(10)

    设置stream=True标志位,使响应以字节流方式进行读取,r.raw.read函数指定读取的字节数。

    3.3 请求头headers处理

    Requests对headers的处理和urllib2非常相似,在Requests的get函数中添加headers参数即可。示例如下:

    
     

    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    r = requests.get('http://www.baidu.com',headers=headers)
    print r.content

    3.4 响应码code和响应头headers处理

    获取响应码是使用Requests中的status_code字段,获取响应头使用Requests中的headers字段。示例如下:

    
     

    import requests
    r = requests.get('http://www.baidu.com')
    if r.status_code == requests.codes.ok:
        print r.status_code# 响应码
        print r.headers# 响应头
        print r.headers.get('content-type')# 推荐使用这种获取方式,获取其中的某个字段
        print r.headers['content-type']# 不推荐使用这种获取方式
    else:
        r.raise_for_status()

    上述程序中,r.headers包含所有的响应头信息,可以通过get函数获取其中的某一个字段,也可以通过字典引用的方式获取字典值,但是不推荐,因为如果字段中没有这个字段,第二种方式会抛出异常,第一种方式会返回None。

    r.raise_for_status()是用来主动地产生一个异常,当响应码是4XX或5XX时,raise_for_status()函数会抛出异常,而响应码为200时,raise_for_status()函数返回None。

    3.5 Cookie处理

    如果响应中包含Cookie的值,可以如下方式获取Cookie字段的值,示例如下:

    
     

    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    r = requests.get('http://www.baidu.com',headers=headers)
    # 遍历出所有的cookie字段的值
    for cookie in r.cookies.keys():
        print cookie+':'+r.cookies.get(cookie)

    如果想自定义Cookie值发送出去,可以使用以下方式,示例如下:

    
     

    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    cookies = dict(name='qiye',age='10')
    r = requests.get('http://www.baidu.com',headers=headers,cookies=cookies)
    print r.text

    还有一种更加高级,且能自动处理Cookie的方式,有时候我们不需要关心Cookie值是多少,只是希望每次访问的时候,程序自动把Cookie的值带上,像浏览器一样。Requests提供了一个session的概念,在连续访问网页,处理登录跳转时特别方便,不需要关注具体细节。使用方法示例如下:

    
     

    import Requests
    oginUrl = 'http://www.xxxxxxx.com/login'
    s = requests.Session()
    #首先访问登录界面,作为游客,服务器会先分配一个cookie
    r = s.get(loginUrl,allow_redirects=True)
    datas={'name':'qiye','passwd':'qiye'}
    #向登录链接发送post请求,验证成功,游客权限转为会员权限
    r = s.post(loginUrl, data=datas,allow_redirects= True)
    print r.text

    上面的这段程序,其实是正式做Python开发中遇到的问题,如果没有第一步访问登录的页面,而是直接向登录链接发送Post请求,系统会把你当做非法用户,因为访问登录界面时会分配一个Cookie,需要将这个Cookie在发送Post请求时带上,这种使用Session函数处理Cookie的方式之后会很常用。

    3.6 重定向与历史信息

    处理重定向只是需要设置一下allow_redirects字段即可,例如:

    r=requests.get('http://www.baidu.com',allow_redirects=True)

    将allow_redirects设置为True,则是允许重定向;设置为False,则是禁止重定向。如果是允许重定向,可以通过r.history字段查看历史信息,即访问成功之前的所有请求跳转信息。示例如下:

    
     

    import requests
    r = requests.get('http://github.com')
    print r.url
    print r.status_code
    print r.history

    打印结果如下:

    
     

    https://github.com/
    200
    (<Response [301]>,)

    上面的示例代码显示的效果是访问GitHub网址时,会将所有的HTTP请求全部重定向为HTTPS。

    3.7 超时设置

    超时选项是通过参数timeout来进行设置的,示例如下:

    
     

    requests.get('http://github.com', timeout=2)

    3.8 代理设置

    使用代理Proxy,你可以为任意请求方法通过设置proxies参数来配置单个请求:

    
     

    import requests
    proxies = {
        "http""http://0.10.1.10:3128",
        "https""http://10.10.1.10:1080",
    }
    requests.get("http://example.org", proxies=proxies)

    也可以通过环境变量HTTP_PROXY和HTTPS_PROXY?来配置代理,但是在爬虫开发中不常用。你的代理需要使用HTTP Basic Auth,可以使用http://user:password@host/语法:

    
     

    proxies = {
        "http""http://user:pass@10.10.1.10:3128/",
    }


    03

    小结


    本文主要讲解了网络爬虫的结构和应用,以及Python实现HTTP请求的几种方法。希望大家对本文中的网络爬虫工作流程和Requests实现HTTP请求的方式重点吸收消化。

    本文摘编自《Python爬虫开发与项目实战》,经出版方授权发布。

    关于作者:范传辉,资深网虫,Python开发者,参与开发了多项网络应用,在实际开发中积累了丰富的实战经验,并善于总结,贡献了多篇技术文章广受好评。研究兴趣是网络安全、爬虫技术、数据分析、驱动开发等技术。

    640?wx_fmt=jpeg

    Python爬虫开发与项目实战

    扫码购买

    640?wx_fmt=png


    本书特色:

    • 由浅入深,从Python和Web前端基础开始讲起,逐步加深难度,层层递进。

    • 内容详实,从静态网站到动态网站,从单机爬虫到分布式爬虫,既包含基础知识点,又讲解了关键问题和难点分析,方便读者完成进阶。

    • 实用性强,本书共有9个爬虫项目,以系统的实战项目为驱动,由浅及深地讲解爬虫开发中所需的知识和技能。

    • 难点详析,对js加密的分析、反爬虫措施的突破、去重方案的设计、分布式爬虫的开发进行了细致的讲解。

    扫码购买

    640?wx_fmt=png

    展开全文
  • 对现有的行业规程、规范及技术标准中关于"煤层残存瓦斯含量"的定义、测定与计算方法存在的歧义与不统一、不规范的问题进行了分析,指出随着矿井煤炭的开采与瓦斯的抽采,煤层残存瓦斯含量是一个动态的概念,应该按照...
  • 以符拉迪沃斯托克(Vladivostok)市区的俄罗斯岛屿和邻近岛屿系统为例,研究了局部水平(比例为1:25,000)的景观空间数字矢量层结构的新概念。 对景观系统的内部和外部内容进行综合,分析和评估,并确定区域的海拔...
  • 2.比特币的每一笔交易的价值含量是不一样的,当区块容量不够用的时候,应该优先保证价值高的交易进块,但是这样会造成一个后果,就是小额的支付会被赶出系统,这样真个比特币网络就变成了一个清算系统。从长远来看,...
  • 软件测试基本概念总结

    千次阅读 2019-09-24 10:19:40
    测试是没有技术含量的 五、软件缺陷 软件测试员认为软件难以理解,不宜使用,运行速度慢,或者最终用户认为不好 软件未达到需求规格说明书中指明的功能 软件出现了需求规格说明书中指明不会出现的错误 ...

    一、软件的定义

    • 软件S = 程序P + 数据(库)DB + 文档D + 服务S

    二、软件测试的定义

    • 软件测试是使用人工和自动手段来运行或测试某个系统的过程,其目的在于检测被测软件系统是否满足规定的需求,或是能清楚被测系统的预期结果与实际结果之间的差别。
    •  

    三、软件测试核心和本质

    • 软件测试的根本目的是确保软件满足用户需求
    • 软件测试的目的是要衡量软件产品是否符合预期
    • 软件测试是一个持续进行的过程
    • 测试既需要动态执行也需要静态检查
    • 测试不仅需要手动执行也需要自动执行

    四、软件测试的误区

    • 如果有良好的设计和高水平的程序员,不需要测试。
    • 软件测试并不创造任何代码和产品,可以不需要测试
    • 测试等于调试(测试发现缺陷,调试修复缺陷)
    • 软件需求规则说明应详细的包含所有用户需求
    • 软件测试可以提高软件质量(不修复不会提高)
    • 测试是没有技术含量的

    五、软件缺陷

    • 软件测试员认为软件难以理解,不宜使用,运行速度慢,或者最终用户认为不好
    • 软件未达到需求规格说明书中指明的功能
    • 软件出现了需求规格说明书中指明不会出现的错误
    • 软件功能超出需求说明规格书中指明的范围
    • 软件未达到需求规格说明书虽未指出但应达标的目标

    软件缺陷的来源和代价

    • 软件及系统本身复杂性不断增长,是测试的范围和难度随之增大
    • 与用户沟通不畅导致无法及时获取最真实的用户需求
    • 需求不断变化,特别是敏捷开发模式下,测试开发和执行更难以跟上需求变化的步伐
    • 开发人员的个人因素(自大劳累等),导致不断植入各种缺陷
    • 进度压力导致测试被压缩,无法进行充分的测试
    • 对文档的轻视导致对测试缺乏依据,带来测试的漏洞

    测试用例

    • 测试用例是一组测试输入、执行条件和预期结果,目的是要满足一个特定目标,如执行一个特定的程序路径或检验是否符合一个特定的需求用例
    • 测试用例 = 输入 + 输出 + 测试环境

    • 测试用例具体是由输入数据,操作步骤,预期执行结果和测试环境组成。

    测试用例的设计

    • 测试用例越少越好。测试用例越少,用力记录、执行、结果检查、管理所对应的工作量越少
    • 测试用例的典型性越高越好。测试用例具有典型性体现在每个测试用例代表被测对象对某一类数据的处理方式
    • 测试用例对缺陷的定位性越强越好。当一组测试用例执行后发现不通行的时候,应能快速推测缺陷原因,利于程序员快速定位缺陷

    黑盒测试

    基本原理和特点

    • 基本原理
      • 仅需要知道被测对象的输入和预期输出,不需要理解其细节
    • 特点
      • 对测试人员的技术要求相对较低
      • 黑盒测试不要了解程序实现的细节,因此,测试团队与开发团队可以并行完成完成各自的任务,提高团队开发进度
    • 缺点
      • 测试结果覆盖度不易度量
      • 测试的潜在风险较高

    黑盒测试方法

    • 测试方法的评价

      • 测试用例对被测对象的覆盖率:越高潜在风险越低
      • 测试用例的冗余:越低测试成本越低
      • 测试用例的数量:越低测试成本越低
      • 测试用例对缺陷的定位能力:能快速定位某一种软件缺陷
      • 测试用例设计的复杂:复杂度越低对测试人员经验的依赖性越低。

      边界值测试

      • 基本原理:在被测对象的边界及边界附近设计测试用例
      • 测试用例的设计
        • 测试数据的选择
          • 穷举法:在每个边界点的邻域范围内取所有数据构成测试数据的集合
          • 典型值法:一般的,对于某个边界点x ,邻域为a,一般选取x-a,x,x+a三个值作为测试数据。
        • 边界组合的方式选择
          • 强边界法:要求测试用例覆盖所有输入条件的所有边界组合,多个输入条件同时取边界测试数据的情况,不利于缺陷的隔离和定位。
          • 弱边界法:基于一个最重要的假设——单缺陷假设,及被测对象只要在某个输入条件的某个边界出错,则在任何包含该输入条件的某个边界的情况下一定会出错,那么测试时仅覆盖输入条件的单个边界点即可
          • 全边界法:将所有边界法都包含在测试内容内,既强边界+弱边界

      等价类测试方法

      • 基本原理:通过等价划分的方式来将数据分片,从每个分片中抽取典型数据展开测试
      • 等价类的划分(也称子集):
        • 每个子集内所有的数据等价,既被测系统对该子集中每个数据的处理方式相同。
        • 各个子集互不相交,即输入域中的某个数据或某项唯一隶属某个子集
        • 所有子集的并集是整个输入域
      • 有效等价类和无效等价类
        • 有效是指对于SRS(软件需求说明书)而言,合理有意义的输入数据构成的集合,考察工作能力
        • 无效相反,考察容错能力
      • 等价类的划分:不断施加规则,直到不能再分为止,此为一个等价类。
      • 有效等价类的测试用例设计:
        • 强组合方式的等价类测试
          • 最终的得到的测试用例完全覆盖所有输入条件的有效等价类的所有组合情况,实质是笛卡尔乘积,即完全组合。
        • 若组合方式下的等价类测试
          • 测试用例仅需要完全覆盖所有输入条件的有效等价类即可。有不同组合。但是无法达到针对整个输入域的覆盖,并非完备测试。
      • 无效等价类的测试用例设计
        • 基本原理:单缺陷假设,即一个测试用例只需要覆盖一个无效等价类

      基于决策表的测试

      • 基本原理:该方法是分析和表达多逻辑条件下不同操作的执行情况!在一个程序中,许多项操作是在多个逻辑条件的组合下完成,此项方法中要做的就是针对每个条件的不同情况来分析每项操作的执行情况!

      • 表格形式:

        输入条件(可多个)具体实例1具体实例2
        预期输出(可多个)具体实例1具体实例2
      • 决策表的化简的前提:

        • 输出相同:欲化简多个测试用例的预期输出结果应完全相同
        • 输入相似:欲化简多个测试用例的输入应相似,

      正交表

    白盒测试技术

    基本原理

    • 对程序内部结构展开测试,关注程序实现的细节。主要关注两方面:1.源代码2.程序结构
    • 优势
      • 针对性强,测试效率高
      • 在函数级别开始测试工作,缺陷修复成本低。
    • 缺陷
      • 对测试人员的技术要求高。

    静态白盒测试

    • 包括:1.代码检查2.静态结构分析3.代码质量度量

    代码检查

    • 方法分类:审查,团队评审,走查,结对编程,同行桌查,轮查,特别检查。(越来越随意)

    静态结构分析

    • 原理:通过引入多种形式的图表(如函数调用关系图,模块控制流图等)帮助人们快速了解程序设计和结构,更好地理解源代码,以及找到程序设计缺陷和代码优化的方向。

    • 函数关系调用图:通过树形方式展现多个函数之间的调用关系。

    • 优点:1.可以集中测试重要函数,例如:

      • A)根节点,叶子节点,接口数量多的等。
      • B)递归过多的函数。
      • C)孤立节点需要考虑其正确性。
    • 函数流程控制图:通过有向图来展现函数内部之间的语句执行关系。

    • 优点:可以检查函数内部的语句调用关系

      • A)着重检查是否存在多个出口的问题
      • B)检查是否存在孤立的点
      • C)环复杂度是否过多
      • D)是否存在非结构化设计(goto break continue)

    代码质量度量

    • 原理:代码质量模型ISO9126质量模型是最著名的模型之一,分为3个质量模型:外部质量模型,内部质量模型,使用中质量模型。
      • 其中内部质量模型和外部质量模型由3层组成
        • 第一层,高层,为质量特性,6个
        • 第二层,中层,为质量子特性,27个
        • 第三层,底层,为质量度量,自行制定度量

    对判定的测试

    • 基本原理:对源代码中所有的逻辑值均需要测试真值和假值的情况。
    • 常见的判定测试覆盖指标包括:
      • 语句覆盖
        • 基本思想:设计测试用例是应保证程序的每一条可执行语句至少执行一次。
        • 缺陷:1.关注语句而非是判定式2.对隐式分支无效
      • 判定覆盖
        • 基本思想:保证程序中每个判定节点的取真和取假分支至少执行一次。若判定节点有多个可能时,要保证每个可能至少执行一次。
        • 缺陷:当有判定表达式为复合判定表达式时,且和或可能输出完全一致。
      • 条件覆盖
        • 基本思想:保证程序中每个复合判定表达式中,每个简单判定条件的取真和取假的情况至少各执行一次。
      • 判定/条件覆盖
        • 基本思想:应满足判定节点的取真和取假分支至少各执行一次,且每个简单判定条件的取真和取假的情况各执行一次。
      • 条件组合覆盖
        • 基本思想:满足每个判定节点中,所有简单判定条件的所有可能的取值组合情况应至少执行一次。用冗余换取方法的简单性。
      • 修正的判定/条件覆盖
        • 基本思想:在满足判定/条件覆盖的基础上,每个简单判定条件都应独立地影响到整个判定表达式的取值。利用简单判定条件的的独立性来消除冗余。

    做题方法:可以先进行条件覆盖,然后删减法来来得到其他的覆盖


    对路径的测试

    • 相关概念
      • 程序图:
      • 环复杂度:除去内部的封闭区域,包括一个外部开放区域
      • 独立路径的抽取:
        • 1.确定主路径(即最复杂的一条路径):尽可能多的判定节点,尽可能多的复杂判定式,尽可能高的执行概率,尽可能多的语句。
        • 2.从基础路径抽取其他路径

    对循环的测试

    • 概念:重点关注循环过程的正确性,即在循环的边界和运行的界限内对循环体的执行进行测试。
    • 循环结构的分类:串联,嵌套,非结构化。
    • 针对单个循环点循环用例设计:
      • 循环0次,即不执行循环
      • 循环1次
      • 循环2次
      • 循环正常次数,即最大次数的一半
      • 循环n-1次
      • 循环n次,即n为最大次数,若题目没有要求,通常需要在写测试用例时假设声明
    • 针对多个循环结构的用例设计:
      • 串联时:1.相互独立时每个独自设计2.有关联时,进行补充测试。
      • 嵌套时:1.相互独立,由内向外,先测试内部循环体,再测试最外层的循环体。并根据单个循环测试原则再考虑4种特殊情况:
        • a.内层最小循环次数,外层最小循环次数
        • b.内层最小循环次数,外层最大循环次数
        • c.内层最大循环次数,外层最小循环次数
        • d.内层最大循环次数,外层最大循环次数
    • 非结构化:具体情况分析

    对变量的测试

    • 原理:关注代码中计算最复杂的变量,计算结构对函数返回值影响的变量,最可能出错的变量,发现定义/引用异常缺陷的变量(使用前未定义,被定义但未使用,使用前多次定义)。

    如何评判测试方法应用是否得当?

    • 1.用例数
      • 判定:判定 2 ,条件 2, 判条2 ,条件组合2的n次方,修正条件判 n+1

    单元测试

    概述:是指对软件中最小可测试单元或基本组成单元进行检查和验证。

    最小可测单元的定义:具有明确的功能定义,性能定义,连接其他部分的接口定义。

    单元测试的内容:静态检查和动态检查

    驱动模块和桩模块

    • 驱动模块:模拟被测单元的上级模块,用于接收测试数据,启动被测模块和输出结果。
    • 桩模块:模拟被测单元所调用的模块,桩模块不包含原模块所有细节。
    • 桩模块和驱动模块设计原则:
      • 应考虑测试结论的有效决定于单元测试环境下模拟目标环境(程序)执行的精确度,及设计时应满足所有环境因素。
      • 应充分考虑测试过程迭代性,提高重用性,提高回归测试效率
    • 原则体现
      • 尽量结合已有的测试用例来设计测试数据。
      • 尽量使用已有测试用例的测试数据来驱动被测单元
      • 尽量将测试数据和测试脚本分离。
    • 功能要求
      • 驱动模块:
        • 利用已有的测试用例,接收测试的输入数据
        • 将测试数据传递给被测单元,从而启动被测单元
        • 打印或输出被测结果,判断失败还是成功
        • 通过测试日志文件记录测试过程,便于后续数据保存分析
      • 桩模块:
        • 在特定条件下完成原单元的基本功能
        • 能够被正确调用
        • 有返回值
        • 不包含原单元所有细节

    单元测试的过程

    • 计划阶段:完成单元测试用例,制订单元测试策略
    • 设计阶段:根据单元测试计划,提取测试需求,完成测试设计
    • 实施阶段:根据测试用例开发测试数据或测试脚本,并建立单元测试环境,准备开始正式测试执行。
    • 执行阶段:手动或自动执行单元测试用例,记录测试结果
    • 评估阶段:利用测试用例和缺陷计算相关指标,评估阶段性测试结果,作出决策。

    集成测试

    集成测试的基本原理

    • 基本原理:在单元测试的基础上,将所有已通过单元测试的模块按照概要设计的要求组装成子系统或系统,并进行测试的过程。
    • 内容:包括模块之间的接口以及集成后的功能。主要使用黑盒测试方法测试集成的功能,并对以前的集成进行回归测试。
    • 集成测试和单元测试的区别
      • 1.测试时机不一样。单元测试在编码期测试,集成测试在系统即将开发完毕测试。
      • 2.测试目的不一样。
      • 3.测试工具不一样。
      • 4.测试颗粒不一样。

    集成测试的过程

    单个集成测试用例的设计

    成对集成

    • 概念:将每个集成测试用例限定在一对调用单元上,每个集成测试用例都是最小的集成单元,仅涉及一对调用的接口。
    • 好处是:缺陷容易快速定位。

    邻居集成

    • 概念:将每个集成测试用例限定在某个节点的邻居上,针对某个模块的集成测试用例应同时包含该模块及其邻居。所为邻居,是对应某个模块的一个特定邻域模块集合,它包括指定的某个模块、所有直接调用该模块的上层模块以及所有被该模块直接调用的下层模块。

    • 构成方式:

      • 1.处于中间层的模块。
      • 2.根节点直接调用叶子节点。
    • 特点是:通过扩大单个测试用例的范围来减少测试用例总数,导致的结果实质是缺陷定位变得困难。

    基于独立路径的集成

    • 概念:将函数调用图看做程序的控制流图或程序图,每个从根节点到叶子节点的调用形成了路径,每条独立路径即可构成一个集成测试用例

    集成测试遍历顺序的设计

    大爆炸集成

    • 是将所有经过单元测试的模块一次性组长到北侧系统中进行测试,完全不考虑模块之间的依赖性和可能的风险。

    自顶向下集成

    • 是从主控模块(主程序根节点)开始,按照系统结构程序,沿着控制层侧从上而下,逐渐将各模块组装起来。该集成测试方式下无须开发驱动模块,但需对味精即成测试的模块开发桩模块。集成中采用宽度优先或深度优先策略向下推进。

    自底向上集成

    • 是从底层模块(叶子节点)开始,按照调用图的结构,从下而上,逐层将各模块组装起来。该集成测试方式 开发桩模块,但需对未经集成测试的模块开发驱动模块,集成中采用宽度优先或深度优先策略向上推进。

    三明治集成

    • 将自顶向下和自底向上集成方法结合起来的集成策略。在调用图上按照一定的策略,分别自顶向下和自底向上展开集成,并在子树上进行大爆炸集成。

    集成测试的评价

    • 四个方面来评价:
      • 1.测试用例的规模。越小越好。
      • 2.驱动模块的设计。数量越少越好。
      • 3.桩模块的设计。数量越少越好。
      • 4.缺陷的定位。接口越少越能够快速定位缺
    展开全文
  • 有源滤波器——APF

    千次阅读 2019-04-20 22:00:02
     上图为电网电压和电流,从仿真结果可以看出,0.1s后投入APF后,补偿后电网电流与电压相位相同,实现无功补偿,且电网电流谐波含量明显降低。      上图为直流侧电压,从仿真结果可以看出,在负载切换过程...

            近年来,由电网非线性负荷引起的谐波问题日益受到重视,而有源电力滤波器与传统的无源滤波器相比,具有可以同时实现谐波和无功动态补偿,响应快;受电网阻抗影响小,不容易与电网阻抗发生谐振;跟踪电网频率变化,补偿性能不受电网频率变化的影响等优点,因此采用有源电力滤波器已成为谐波补偿的一种重要趋势。

           有源滤波器实际上可以称为任意波形发生器,或者可称为可控非线性元件。其工作原理就是根据所检测到的负荷谐波电流分量来控制有源滤波器,使其发出一个相反的谐波电流,这样在系统中将不含有这个谐波电流成分,从而起到补偿作用。理论上讲,有源滤波器可以对任意谐波电流进行补偿,其原理框图如下图所示。

                      

           指令电流的检测和补偿电流的产生是APF两个关键技术,直接影响到APF的补偿效果,目前理论上及实际使用的有多种谐波电流检测的方法,但主流的检测方法主要有以下几种:基于Fryze功率定义的检测方法,基于瞬时无功功率理论的瞬时电流检测方法,基于自适应噪声消除的检测方法,基于神经网络和小波分析的检测方法等,从延迟性及检测精度来比较,瞬时电流检测方法最优,其谐波电流原理如下图所示 :

                                              

    其中,

                                        

     C23是C32的逆。

            补偿电流的产生通常采用直接电流控制的方式,以检测环节得到的电流实际值与参考值之间的差值来产生相应的控制信号,然后将控制信号与高频三角载波相比较,所得到的脉冲矩阵作为逆变器各开关器件所需的控制信号,出端得到所需的波形。

                                          

           采用simulink搭建APF模型,电网电压为380V,谐波源采用三相不控整流电路,0.1s投入APF,在0.3s时刻进行负载切换,连接电抗器3mH,其仿真结果如下所示: 

                           

           上图为采样三相指令电流与补偿电流,从仿真结果可以看出,APF投入后,补偿电流可以很好的对指令电流进行跟踪,实现补偿目的。 

                              

           上图为电网电压和电流,从仿真结果可以看出,0.1s后投入APF后,补偿后电网电流与电压相位相同,实现无功补偿,且电网电流谐波含量明显降低。

                                

         上图为直流侧电压,从仿真结果可以看出,在负载切换过程中,直流电压波动会迅速进行跟踪,能够维持电压稳定。

                                

                   上图为补偿后电网电流THD,从仿真结果可以看出,补偿后电网电流THD为,低于5%,符合并网要求。

    欢迎关注公众号,持续更新中。

           

    展开全文
  • 车联网常用概念总结

    千次阅读 2021-09-07 18:36:02
    车联网常用概念总结 车联网的组成 主机: 主机主要用于车内的影音娱乐,以及车辆信息显示 汽车T-BOX:主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控制。 手机APP:当用户通过手机端APP发送控制...

    车联网常用概念总结

    车联网的组成
    主机: 主机主要用于车内的影音娱乐,以及车辆信息显示
    汽车T-BOX:主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控制。
    手机APP:当用户通过手机端APP发送控制命令后,TSP后台会发出监控请求指令到车载T-BOX,车辆在获取到控制命令后,通过CAN总线发送控制报文并实现对车辆的控制,最后反馈操作结果到用户的手机APP上,仅这个功能可以帮助用户远程启动车辆、打开空调、调整座椅至合适位置等。
    后台系统:这里的后台系统其实就可以理解为TSP


    ECU
    ECU是Elecmal Control Unit 的缩写,即电子控制单元,也可以叫 “行车电脑 ”。

    作为现代汽车电子的核心元件之一 ,ECU电子控制单元在汽车中也许有好几个,每个管理不同的功能;而每个ECU系统之间又有信息交换。

    ECU具备最基本的结构:

    微处理器(CPU)
    存储器(ROM、RAM)
    输入/输出接口(I/O)
    模数转换器(A/D)以及整形
    驱动等大规模集成电路
             控制信号的采集就来源于分布在汽车上的数量众多的传感器 ,比如油门位置传感器、发动机转速传感器、轮速传感器、空气质量(氧气含量)传感器 、发动机温度传感器等 ,所有传感器收集到信息 ,都及时传给ECU进行计算 ,并根据计算结果下达执行指令。

            ECU的控制范围已经扩张到巡航控制、灯光控制 、安全气囊控制 ,悬架控制 、燃油加热控制、排气控制、制动控制、EGR和增压压力控制等。当然 ,随着车上电子元件的日益增多,线路也越来越复杂 。为了简化电路和降低成本,现在汽车上多个ECU之间的数据交换是通过一种称为多路复 用通信网络技术连接起来的,通过它将整车的ECU形成一个网络系统 ,也就是所谓的 “CAN一BUS”数据总线。

    物联网
    物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段。其英文名称是:“Internet of things(IoT)”。顾名思义,物联网就是物物相连的互联网。这有两层意思:其一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;其二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信,也就是物物相息。物联网通过智能感知、识别技术与普适计算等通信感知技术,广泛应用于网络的融合中,也因此被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。(物联网的物物相连会引出 MQTT,因为这不是我们理解的,设备与软件相连了。)

      而在物联网的应用上,对于信息传输,MQTT是一种再合适不过的协议工具了。(好引出这个协议了,该协议也是基于tcp/ip的基础上的,这是废话)

    车载娱乐系统IVI(又称HU)怎么叫都行
     TSP为IHU主要提供两种基本服务:一种是TSP托管的第三方服务包括天气、新闻、违章查询等;一种是车辆配置服务

    IHU(Infotainment Head Unit信息娱乐主机)

    Telematics BOX,简称汽车T-BOX,车联网系统包含四部分,主机、汽车T-BOX、手机APP及后台系统。主机主要用于的影音娱乐,以及车辆信息显示;汽车T-BOX主要用于和后台系统/手机APP互联通信,实现后台系统/手机APP的车辆信息显示与控制。

     IVI:In-Vehicle Infotainment  车载信息娱乐系统

    HMI:车端的应用,即(车载)人机交互界面,是驾驶员与车辆交互的桥梁。
     

    展开全文
  • 通信原理教程chapter1

    千次阅读 2018-09-16 20:45:15
    通信系统基本概念 模拟通信系统 数字通信系统 数字通信的优点: 数字通信系统模型 数字通信系统的主要性能指标 传输速率 错误率 频带利用率 能量利用率 信道 电磁场四道大题 1已知电场求磁场 2平行传输线,已知...
  • 如何学习新概念英语2

    千次阅读 2019-04-03 11:18:26
    如何学习新概念英语2第一步 阅读第二步 课后练习第三步 听课文第四步 复述第五步 整理第六步 修改 Review 正所谓开谈不讲新概念,读遍英书也枉然,虽然我对这个观点不是很赞同,也不认为新概念是什么优秀教材,但是...
  • 介绍了虚拟水的概念,归纳了农产品和畜牧产品中虚拟水含量的计算方法,并总结了有关产品虚拟水的研究成果和不足之处;提出了工业产品虚拟水的计算方法,以辽河油田为例,计算出石油制品中虚拟水含量。在此基础上,...
  • 一、二维码简介_二维码基本概念_二维码基本原理 1.二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,...
  • 传感器基本概念

    千次阅读 2018-12-23 15:19:08
    湿度是指大气中的水蒸气含量。通常采用绝对湿度和相对湿度两种方法表示。相对湿度指被测气体中的水蒸气压和该气体在相同温度下饱和水蒸气压的百分比,一般用符号%RH表示。 20、红外辐射特点 红外光的最大特点就是...
  • 根据传统难筛粒含量的基本概念,对比分析了GB/T 15716-2005《煤用筛分设备工艺性能评定方法》中,用临近粒度物含量作为工艺效果评定指标的不妥之处;以精煤泥弧形筛使用和不使用击打器的对比试验案例,对两者之间的差异...
  • GPU概念

    2019-07-15 15:42:56
    在正式讲解GPU之前,我们先来讲讲上文中提到的一个概念——并行计算。 并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想...
  • 技术含量

    2018-04-21 01:04:00
    技术含量在于1.如果根据需求,过往经验,存在困难,可用代码,从无到有构思,想象,或是搭建一个系统。做到快速的,有预见的,可扩展的,好维护的。2.如何把宏伟的计划变成分先分后的简单任务,包括用修真的态度营造...
  • 在写这篇大数据文章之前,我发现身边很多IT人对于这些热门的新技术、新趋势往往趋之若鹜却又很难说的透彻,如果你问他大数据是什么,什么是大数据概念?估计很少能说出一二三来。究其原因,一是因为大家对大数据这类...
  • 空气里氧气含量的测定;物质;危害 等 防治与保护 等 ;1.通常情况下,氧气是一种 色 味的气体 2.标准状况下氧气的密度略 空气的密度 3.氧气 溶于水 4.液体氧 色 5.固体氧 色 状; 物质;2.原理:根据空气中氮气和氧气的 ...
  • 运用过程概念设计的方法,使用流程模拟软件Aspen Plus建立了生物质裂解气制燃料醇的过程模拟与分析模型,燃料醇的构成为含乙醇为主的低碳醇。在给定工艺条件下,通过对模型的灵敏度分析发现:合成气的循环重整分率...
  • 视频图像处理概念

    千次阅读 2016-07-12 18:00:12
    特此声明,鄙人收集资料大都来源于百度百科,但是提取其中关键部分,加上一些其他的网上资源来帮助一些概念的理解,希望和大家一起学习。如有解释不到位的地方,还请多多理解。   先简单介绍一下OpenCV,以后再...
  • 以有机概念图为理论依据,选择松香的水相乳化剂组合为松香丙三醇酯、脂肪醇聚氧乙烯醚(AEO-3)、辛基酚聚氧乙烯醚(TX-10)、十二烷基硫酸钠(SBS),其质量分数比依序为1:2:4:8,采用常压转相乳化法制备出颗粒均匀、...
  • 多相流的相关概念

    千次阅读 2018-04-12 16:10:41
    多相流的相关概念11. 多相流的定义物理学中,所谓的“相”是指自然界中物质的态,例如气态、液态、固态等。一种物态即成为一相;热力学中,物体中的每一个均匀部分称为一相。各部分均匀的固体、液体和气体可分别称为...
  • 计算智能论文基于计算智能的创新概念设计研究及应用 中文摘要随着社会经济的飞速发展和科学技术的不断进步,产品制造业水平得到了前所未有的发展,产品的技术含量也越来越高目前市场上的产品功能齐全种类繁多,产品风格...
  • 运维是不是IT行业里技术含量最低的岗位?

    千次阅读 多人点赞 2021-05-20 17:02:33
    在互联网行业里,运维一直都是一个被人误解很深的岗位,以致于很多人都认为运维在IT行中的技术含量很低,但是今天我要为运维人“平反”。 开发与运维搞不清楚 从本质上说,运维其实是用自己的技术储备知识,保证...
  • 生信概念整理

    千次阅读 2018-10-29 08:23:41
    常见的删除动作有:去接头、去N含量高的reads、去质量评分低的reads、去掉每个read的最后几个碱基等等。 19、降解组数据(Degradome data)是通过降解组测序(Degradome sequencing)方法得到的测序数据  降解组测序...
  • 人们不知道的是,马斯克这个具有远大理想的企业家,除了特斯拉以外还有8家足够改写人类未来的公司,而特斯拉在这里面,只能算是最没有技术含量的。接下来我们就来看一看,这8家公司到底何方神圣。 首先要说到的是...
  • 这是一个演示项目,目的是展示动态盐渍相对于静态盐渍背后的概念验证。 许多开发人员错误地使用除用户密码之外的相同盐来创建新哈希。 不幸的是,攻击者也可以通过执行相同的操作轻松地预先计算出静态盐。 通过创建...
  • 信息熵及其相关概念

    万次阅读 多人点赞 2018-07-24 16:26:18
    3. 两随机变量系统中熵的相关概念[4] 3.1 互信息 3.2 联合熵 3.3 条件熵 3.4 互信息、联合熵、条件熵之间的关系 4. 两分布系统中熵的相关概念[5] 4.1 交叉熵 4.2 相对熵 4.3 相对熵与交叉熵的关系 ...
  • 为进一步研究拉丁方与幻方之间的关系,在完美幻方的基础上,提出均衡完美幻方的概念,证明了均衡完美幻方与正交完美拉丁方对是一一对应的,同时发现了基于Zn的n阶完美拉丁方与正则群的联系。还从完美拉丁方的缺陷...
  • 遥感影像处理的几个概念

    千次阅读 2019-09-18 09:53:52
    辐射定标: 1、定义(Radiometric Calibration)是计算地物的光谱反射率或光谱...反射率法:在卫星过顶时同步测量地面目标反射率因子和大气光学参量(如大气光学厚度、大气柱水汽含量等)然后利用大气辐射传输模...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,045
精华内容 7,218
关键字:

含量的概念