<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>YINUXY | 理想的生活就是生活的理想</title>
  
  <subtitle>WELCOME TO YINUXY&#39;S BLOG</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blog.yinuxy.com/"/>
  <updated>2021-02-24T08:01:54.009Z</updated>
  <id>https://blog.yinuxy.com/</id>
  
  <author>
    <name>YINUXY</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2021，新的一年绝不咕咕</title>
    <link href="https://blog.yinuxy.com/post/Activity/Nogugu/"/>
    <id>https://blog.yinuxy.com/post/Activity/Nogugu/</id>
    <published>2021-02-24T00:30:00.000Z</published>
    <updated>2021-02-24T08:01:54.009Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5" color = "#1BC3FB"  face = "楷体">2021，新的一年绝不咕咕</font></center></blockquote><a id="more"></a><blockquote><p>立个Flag:2021，新的一年一周一更！</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot; color = &quot;#1BC3FB&quot;  face = &quot;楷体&quot;&gt;2021，新的一年绝不咕咕&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>python模拟登陆</title>
    <link href="https://blog.yinuxy.com/post/Experience/simulationLogin/"/>
    <id>https://blog.yinuxy.com/post/Experience/simulationLogin/</id>
    <published>2020-07-12T04:06:04.000Z</published>
    <updated>2020-10-14T08:33:00.902Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">python模拟登陆</font></center></blockquote><a id="more"></a><h2 id="使用表单登录方法实现模拟登录"><a href="#使用表单登录方法实现模拟登录" class="headerlink" title="使用表单登录方法实现模拟登录"></a>使用表单登录方法实现模拟登录</h2><h3 id="1-查找提交入口"><a href="#1-查找提交入口" class="headerlink" title="1. 查找提交入口"></a>1. 查找提交入口</h3><p>提交入口指的是登录网页的表单数据如用户名、密码、验证码等的真实提交地址，它不一定是登录网页的地址，因为出于安全需要它可能会被设计成其他地址。找到表单数据的提交入口是表单登录的前提。</br><br>打开网站，单击右上角登录链接，进入登录网页，如图所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/942fe565d29fdd3c246e6015b786ccae.png" alt=""></br><br>打开Chrome开发者工具后打开网络面板，勾选Preserve log（保持日志）。按“F5”键刷新网页显示各项资源，如图所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/f194fb7667bddaa4599cbb7d5886350d.png" alt=""></br><br>在登录网页输入账号、秘密、验证码，单击“登录”按钮，提交表单数据，此时Chrome开发者工具会加载新的资源。</br><br>观察Chrome开发者工具左侧的资源，找到“login.jspx”资源并单击，观察右侧的Headers标签下的General信息，如下图所示，发现Request Method信息为POST，即请求方法为POST，可以判断Request URL信息即为提交入口。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/7f4970c1c580b3ba3d31d35a60972e86.png" alt=""></p><h3 id="2-查找并获取需要提交的表单数据"><a href="#2-查找并获取需要提交的表单数据" class="headerlink" title="2. 查找并获取需要提交的表单数据"></a>2. 查找并获取需要提交的表单数据</h3><h4 id="2-1-查找需要提交的表单数据"><a href="#2-1-查找需要提交的表单数据" class="headerlink" title="2.1 查找需要提交的表单数据"></a>2.1 查找需要提交的表单数据</h4><p>使用Chrome开发者工具获取到的提交入口，观察Headers标签，Form Data信息为服务器端接收到的表单数据，如图 5-4所示。其中，username表示账号；password表示密码；captcha表示验证码；returnUrl表示跳转网址。returnUrl系自动生成，在登录网页时无需输入。</p><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/8040bc99fdf96000577935d604bc42fc.png" alt=""></p><h4 id="2-2-处理验证码"><a href="#2-2-处理验证码" class="headerlink" title="2.2 处理验证码"></a>2.2 处理验证码</h4><ul><li>识别验证码。人工识别验证码分为3个步骤：①获取生成验证码的图片地址；②将验证码图片下载到本地；③人工识别验证码。<br>获取登录网页验证码地址的步骤如下。</li><li>打开网站，进入登录网页，若已登录需先退出。打开Chrome开发者工具后打开网络面板，按“F5”键刷新网页。</li><li>观察Chrome开发者工具左侧的资源，找到“captcha.svl”资源并单击，观察右侧的Preview标签，若显示验证码图片如左图所示，则“captcha.svl”资源的Request URL信息为验证码图片的地址，如右图所示。<center class="half">  <img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/f5f4ff4da602ecd81a2f85f44d5b1d2f.png" width="50%"/><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/0787f37cc8f2354210c8f9d38ba19c9d.png" width="50%"/></center></li></ul><ul><li>获取验证码图片地址后，下一步对图片地址发送请求，将图片下载到本地，最后人工打开图片识别验证码。</li><li>代理IP跳过验证码。很多时候在登录后爬取过程中也会弹出验证码，当使用同一个IP长时间高频率爬取网页时，该网站的服务器可能会判定该IP在爬取数据，触发网站的安全机制，在客户端弹出验证码，只有输入验证码后，客户端的访问请求才能继续被接受和处理，下图是爬取淘宝时弹出验证码的情况。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/3aea17780f58d9a0872c251d611adb38.png" alt=""></li></ul><p>每次输入验证码会比较麻烦，效率低下。而且当网站服务器多次对指定IP弹出验证码后，可能会封禁该IP，导致爬取无法进行。因此，使用代理IP的方法，使用多个IP切换跳过验证码，成为应对反爬虫的主要手段。<br>获取代理IP</p><ol><li>VPN：是Virtual Private Network的简称，指专用虚拟网络。国内外很多厂商都提供VPN服务，可自动更换IP，实时性高，速度快，但价格较高，适合商用。</li><li>IP代理池：指大量IP地址集。国内外很多厂商将IP做成代理池，提供API接口，允许用户使用程序调用，但价格也较高。</li><li>ADSL宽带拨号：是一种宽带上网方式。特点是断开重连会更换IP，爬虫使用这个原理更换IP，但效率低，实时性差。</li></ol><h4 id="使用POST请求方法登录"><a href="#使用POST请求方法登录" class="headerlink" title="使用POST请求方法登录"></a>使用POST请求方法登录</h4><p>POST请求方法能够保障用户端提交数据的安全性，因此它被一般需要登录的网站采用。Requests库的post函数能够以POST请求方法向服务器端发送请求，它返回一个Response <Response>对象。post函数的基本语法格式如下。</p><pre><code>requests.post(url, data=None, json=None, **kwargs) </code></pre><p>post函数常用的参数及其说明，如表所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/6ca5806992332a8e17780c2800b3c01a.png" alt=""><br>Cookie用于服务器端识别客户端，当发送请求的客户端享有同样的Cookie时，即可认定客户端是同一个。Requests库的会话对象Session能够跨请求地保持某些参数，比如Cookie，它令发送请求的客户端享有相同的Cookie，保证表单数据的匹配。以POST请求方法为例，通过Session发送请求的基本语法格式如下。</p><pre><code>s = requests.Session()s.post(url, data=None, json=None, **kwargs)</code></pre><h2 id="使用浏览器Cookie登录"><a href="#使用浏览器Cookie登录" class="headerlink" title="使用浏览器Cookie登录"></a>使用浏览器Cookie登录</h2><h3 id="1-获取Cookie"><a href="#1-获取Cookie" class="headerlink" title="1.获取Cookie"></a>1.获取Cookie</h3><p>获取Cookie分以下两步进行。</p><ol><li>登录网站。输入账号、密码、验证码，保证成功登录网站。</li><li>找到登录成功后返回的页面地址的Cookie。步骤如下。</li><li>打开Chrome开发者工具后打开网络面板，按“F5”键刷新网页，出现资源。找到左侧的“index.html”资源，它代表的是本网页地址，可以看到Request URL信息与本网页地址相吻合，如图所示。</li></ol><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/709d776555f2f0177fafc75388cb3881.png" alt=""></p><p>观察右侧Headers标签，查看Request Headers信息，找到Cookie信息，它即为登录成功后的Cookie，将其保存下来，如图所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/fe5156ccd98a61e891aeb7ad1804c7d3.png" alt=""></p><h3 id="2-携带Cookie发送请求"><a href="#2-携带Cookie发送请求" class="headerlink" title="2.携带Cookie发送请求"></a>2.携带Cookie发送请求</h3><p>设置发送请求时携带Cookie的参数是cookies，它接收dict或CookieJar。从浏览器获取的Cookie为str类型，需要处理成dict。以GET请求方法为例，携带Cookie发送请求的基本语法格式如下。</p><pre><code>requests.get(url, cookies, **kwargs)</code></pre><h2 id="基于表单登录的Cookie登录"><a href="#基于表单登录的Cookie登录" class="headerlink" title="基于表单登录的Cookie登录"></a>基于表单登录的Cookie登录</h2><h3 id="1-存储Cookie"><a href="#1-存储Cookie" class="headerlink" title="1. 存储Cookie"></a>1. 存储Cookie</h3><p>存储和加载Cookie需要用到http库的cookiejar模块，它提供可存储Cookie的对象。cookiejar模块下的FileCookieJar用于将Cookie保存到本地磁盘和从本地磁盘加载Cookie文件，LWPCookieJar是FileCookieJar的子类。LWPCookieJar对象存储和加载的Cookie文件格式为Set-Cookie3，是比较常用的一种，也是本小节需要用的。创建LWPCookieJar对象的函数是LWPCookieJar，其基本语法格式如下。</p><pre><code>http.cookiejar.LWPCookieJar(filename,delayload = None</code></pre><p>LWPCookieJar函数的常用的参数及其说明，如下表所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/ce23715cc41e59462c1c5ec5f7b311a5.png" alt=""></p><p>LWPCookieJar对象的save方法用于保存Cookie，其基本语法格式如下。</p><pre><code>http.cookiejar.LWPCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)</code></pre><p>save方法常用的参数及其说明，如下表所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/808854d131c9494843f57affa365fd9e.png" alt=""></p><h3 id="2-加载Cookie"><a href="#2-加载Cookie" class="headerlink" title="2.　加载Cookie"></a>2.　加载Cookie</h3><p>LWPCookieJar对象的load方法用于加载Cookie，其基本语法格式如下。</p><pre><code>http.cookiejar.LWPCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)</code></pre><p>load方法常用的参数及其说明，如下表所示。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/10/14/46f5a323f3b033a322294419971af380.png" alt=""></p><ul><li>模拟登录主要有两种方法，即表单登录和Cookie登录。其中Cookie登录又分为使用浏览器Cookie登录和基于表单登录后的Cookie登录。</li><li>表单登录的基本流程为查找提交入口、查找并获取需要提交的表单数据、使用POST方法请求登录。在实际应用中，获取需要提交的表单数据会是重点，因为各个网站需要提交的表单数据不一样，获取的难度也不一样，但大致的流程不变。</li><li>Cookie登录的基本流程为保存已经成功登录的Cookie、使用保存的Cookie发送请求。</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;python模拟登陆&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="网站开发" scheme="https://blog.yinuxy.com/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="网站开发" scheme="https://blog.yinuxy.com/tags/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>网页前端基础</title>
    <link href="https://blog.yinuxy.com/post/Experience/webBasic/"/>
    <id>https://blog.yinuxy.com/post/Experience/webBasic/</id>
    <published>2020-06-18T04:06:04.000Z</published>
    <updated>2020-09-17T15:12:50.740Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">网页前端基础</font></center></blockquote><a id="more"></a><h2 id="HTTP请求方式与过程"><a href="#HTTP请求方式与过程" class="headerlink" title="HTTP请求方式与过程"></a>HTTP请求方式与过程</h2><p>爬虫在爬取数据时将会作为客户端模拟整个HTTP通信过程，该过程也需要通过HTTP协议实现。HTTP请求过程如下。</p><ul><li>由HTTP客户端向服务器发起一个请求，创建一个到服务器指定端口（默认是80端口）的TCP连接。</li><li>HTTP服务器从该端口监听客户端的请求。</li><li>一旦收到请求，服务器会向客户端返回一个状态，比如“HTTP/1.1 200 OK”，以及返回的响应内容，如请求的文件、错误消息、或其它信息。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/09/17/6dd53ff797fc765c8f42f377ef8a758e.png" alt=""></li></ul><h3 id="1-请求方法"><a href="#1-请求方法" class="headerlink" title="1. 请求方法"></a>1. 请求方法</h3><ul><li>在HTTP/1.1协议中共定义了8种方法（也叫“动作”）来以不同方式操作指定的资源，常用方法有GET、HEAD、POST等。</li></ul><table><thead><tr><th align="center">请求方法</th><th align="center">方法描述</th></tr></thead><tbody><tr><td align="center">GET</td><td align="center">请求指定的页面信息，并返回实体主体。GET可能会被网络爬虫等随意访问，因此GET方法应该只用在读取数据，而不应当被用于产生“副作用”的操作中，例如在Web Application中</td></tr><tr><td align="center">HEAD</td><td align="center">与GET方法一样，都是向服务器发出指定资源的请求。只不过服务器将不传回具体的内容，使用这个方法可以在不必传输全部内容的情况下，就可以获取其中该资源的相关信息（元信息或称元数据）</td></tr><tr><td align="center">POST</td><td align="center">向指定资源提交数据，请求服务器进行处理（例如提交表单或者上传文件）。数据会被包含在请求中，这个请求可能会创建新的资源或修改现有资源，或二者皆有</td></tr><tr><td align="center">PUT</td><td align="center">从客户端上传指定资源的最新内容，即更新服务器端的指定资源。</td></tr></tbody></table><h3 id="2-请求（request）与响应（response）"><a href="#2-请求（request）与响应（response）" class="headerlink" title="2. 请求（request）与响应（response）"></a>2. 请求（request）与响应（response）</h3><p>HTTP协议采用了请求／响应模型。</p><ul><li>客户端向服务器发送一个请求报文，请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。</li><li>服务器以一个状态行作为响应，响应的内容包括协议的版本、响应状态、服务器信息、响应头部和响应数据。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/09/17/e269e86976b6c83cef8bfbfe557a83c1.png" alt=""><br>客户端与服务器间的请求与响应的具体步骤如下。</li><li><strong>连接Web服务器</strong>：由一个HTTP客户端发起连接，与Web服务器的HTTP端口（默认为80）建立一个TCP套接字连接。</li><li><strong>发送HTTP请求</strong>：客户端经TCP套接字向Web服务器发送一个文本的请求报文。</li><li><strong>服务器接受请求并返回HTTP响应</strong>：Web服务器解析请求，定位该次的请求资源。之后将资源复本写至TCP套接字，由客户端进行读取。</li><li><strong>释放连接TCP连接</strong>：若连接的connection模式为close，则由服务器主动关闭TCP连接，客户端将被动关闭连接，释放TCP连接；若connection模式为keepalive，则该连接会保持一段时间。</li><li><strong>客户端解析HTML内容</strong>：客户端首先会对状态行进行解析，之后解析每一个响应头，最后读取响应数据。<h4 id="Request"><a href="#Request" class="headerlink" title="Request"></a>Request</h4></li><li>请求方式：主要有GET、POST两种类型，另外还有HEAD、PUT、DELETE、OPTIONS等。</li><li>请求URL：URL全称统一资源定位符，如一个网页文档、一张图片、一个视频等都可以用URL唯一确定。</li><li>请求头：包含请求时的头部信息，如User-Agent、Host、Cookies等信息。</li><li>请求体：请求时额外携带的数据，如表单提交时的表单数据<h4 id="Response"><a href="#Response" class="headerlink" title="Response"></a>Response</h4></li><li>响应状态：有多种响应状态，如200代表成功、301跳转、404找不到页面、502服务器错误</li><li>响应头：如内容类型、内容长度、服务器信息、设置Cookie等等。</li><li>响应体：最主要的部分，包含了请求资源的内容，如网页HTML、图片二进制数据等。<h2 id="常见HTTP状态码"><a href="#常见HTTP状态码" class="headerlink" title="常见HTTP状态码"></a>常见HTTP状态码</h2><h3 id="1-HTTP状态码种类"><a href="#1-HTTP状态码种类" class="headerlink" title="1. HTTP状态码种类"></a>1. HTTP状态码种类</h3>HTTP状态码是用来表示网页服务器响应状态的3位数字代码，按首位数字分为5类状态码。</li></ul><table><thead><tr><th align="center">状态码类型</th><th align="center">状态码意义</th></tr></thead><tbody><tr><td align="center">1XX</td><td align="center">表示请求已被接受，需接后续处理。这类响应是临时响应，只包含状态行和某些可选的响应头信息，并以空行结束</td></tr><tr><td align="center">2XX</td><td align="center">表示请求已成功被服务器接收、理解并接受</td></tr><tr><td align="center">3XX</td><td align="center">表示需要客户端采取进一步的操作才能完成请求。通常用来重定向，重定向目标需在本次响应中指明</td></tr><tr><td align="center">4XX</td><td align="center">表示客户端可能发生了错误，妨碍了服务器的处理。</td></tr><tr><td align="center">5XX</td><td align="center">表示服务器在处理请求的过程中有错误或者异常状态发生，也有可能是服务器以当前的软硬件资源无法完成对请求的处理。</td></tr></tbody></table><h3 id="2-常见HTTP状态码"><a href="#2-常见HTTP状态码" class="headerlink" title="2. 常见HTTP状态码"></a>2. 常见HTTP状态码</h3><p>HTTP状态码共有67种状态码，常见的状态码如下。</p><table><thead><tr><th align="center">常见状态码</th><th align="center">状态码含义</th></tr></thead><tbody><tr><td align="center">200 OK</td><td align="center">请求成功，请求所希望的响应头或数据体将随此响应返回。</td></tr><tr><td align="center">400 Bad Request</td><td align="center">由于客户端的语法错误、无效的请求或欺骗性路由请求，服务器不会处理该请求</td></tr><tr><td align="center">403 Forbidden</td><td align="center">服务器已经理解该请求，但是拒绝执行，将在返回的实体内描述拒绝的原因，也可以不描述仅返回404响应</td></tr><tr><td align="center">404 Not Found</td><td align="center">请求失败，请求所希望得到的资源未被在服务器上发现，但允许用户的后续请求</td></tr><tr><td align="center">500 Internal Server Error</td><td align="center">通用错误消息，服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理，不会给出具体错误信息</td></tr><tr><td align="center">503 Service Unavailable</td><td align="center">由于临时的服务器维护或者过载，服务器当前无法处理请求。这个状况是暂时的，并且将在一段时间以后恢复</td></tr></tbody></table><h2 id="HTTP头部信息"><a href="#HTTP头部信息" class="headerlink" title="HTTP头部信息"></a>HTTP头部信息</h2><p>HTTP头部信息（HTTP header fields）是指在超文本传输协议（HTTP）的请求和响应消息中的消息头部分。头部信息定义了一个超文本传输协议事务中的操作参数。在爬虫中需要使用头部信息向服务器发送模拟信息，通过发送模拟的头部信息将自己伪装成一般的客户端。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/09/17/3226126375f5fae46c8344d6f51cf433.png" alt=""><br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/09/17/d1f8f1254097cb52779198275c260e27.png" alt=""></p><h3 id="1-HTTP头部类型"><a href="#1-HTTP头部类型" class="headerlink" title="1. HTTP头部类型"></a>1. HTTP头部类型</h3><p>HTTP头部类型按用途可分为：通用头，请求头，响应头，实体头。</p><ul><li><strong>通用头</strong>：既适用于客户端的请求头，也适用于服务端的响应头。与HTTP消息体内最终传输的数据是无关的，只适用于要发送的消息。</li><li><strong>请求头</strong>：提供更为精确的描述信息，其对象为所请求的资源或请求本身。新版HTTP增加的请求头不能在更低版本的HTTP中使用，但服务器和客户端若都能对相关头进行处理，则可以在请求中使用。</li><li><strong>响应头</strong>：为响应消息提供了更多信息。例如，关于资源位置的描述Location字段，以及关于服务器本身的描述使用Server字段等。与请求头类似，新版增加的响应头也不能在更低版本的HTTP版本中使用。</li><li><strong>实体头</strong>：提供了关于消息体的描述。如消息体的长度Content-Length，消息体的MIME类型Content-Type。新版的实体头可以在更低版本的HTTP版本中使用。</li></ul><table><thead><tr><th align="center">字段名</th><th align="center">说明</th><th align="center">示例</th></tr></thead><tbody><tr><td align="center">Accept</td><td align="center">可接受的响应内容类型（Content-Types）</td><td align="center">Accept: text/plain</td></tr><tr><td align="center">Accept-Charset</td><td align="center">可接受的字符集</td><td align="center">Accept-Charset:utf-8</td></tr><tr><td align="center">Accept-Encoding</td><td align="center">可接受的响应内容的编码方式</td><td align="center">Accept-Encoding:gzip,deflate</td></tr><tr><td align="center">Accept-Language</td><td align="center">可接受的响应内容语言列表</td><td align="center">Accept-Language:en-US</td></tr><tr><td align="center">Cookie</td><td align="center">由之前服务器通过Set-Cookie设置的一个HTTP协议Cookie</td><td align="center">Cookie:$Version=1;Skin=new;</td></tr><tr><td align="center">Referer</td><td align="center">设置前一个页面的地址，并且前一个页面中的连接指向当前请求，意思就是如果当前请求是在A页面中发送的，那么referer就是A页面的url地址</td><td align="center">Referer:<a href="https://blog.yinuxy.com">https://blog.yinuxy.com</a></td></tr><tr><td align="center">User-Agent</td><td align="center">用户代理的字符串值</td><td align="center">User-Agent:Mozilla/5.0(X11;Linuxx86_64;rv:12.0)Gecko/20100101Firefox/21.0</td></tr></tbody></table><h2 id="熟悉Cookie"><a href="#熟悉Cookie" class="headerlink" title="熟悉Cookie"></a>熟悉Cookie</h2><ul><li>HTTP是一种无状态的协议，客户端与服务器建立连接并传输数据，在数据传输完成后，本次的连接将会关闭，并不会留存相关记录。</li><li>服务器无法依据连接来跟踪会话，也无法从连接上知晓用户的历史操作。这严重阻碍了基于Web应用程序的交互，也影响用户的交互体验。</li><li>某些网站需要用户登录才进一步操作，用户在输入账号密码登录后，才能浏览页面。对于服务器而言，由于HTTP的无状态性，服务器并不知道用户有没有登录过，当用户退出当前页面访问其他页面时，又需重新再次输入账号及密码。</li></ul><h3 id="1-Cookie机制"><a href="#1-Cookie机制" class="headerlink" title="1. Cookie机制"></a>1. Cookie机制</h3><p>为解决HTTP的无状态性带来的负面作用，Cookie机制应运而生。Cookie本质上是一段文本信息。</p><ul><li>当客户端请求服务器时，若服务器需要记录用户状态，就在响应用户请求时发送一段Cookie信息。</li><li>客户端浏览器会保存该Cookie信息，当用户再次访问该网站时，浏览器会把Cookie做为请求信息的一部分提交给服务器。</li><li>服务器对Cookie进行验证，以此来判断用户状态，当且仅当该Cookie合法且未过期时，用户才可直接登录网站。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/09/17/c8dd21d55064a8ec75e09b8bf87a4db4.png" alt=""></li></ul><h3 id="2-Cookie的存储方式"><a href="#2-Cookie的存储方式" class="headerlink" title="2. Cookie的存储方式"></a>2. Cookie的存储方式</h3><p>Cookie由用户客户端浏览器进行保存，按其存储位置可分为内存式存储和硬盘式存储。</p><ul><li>内存式存储将Cookie保存在内存中，在浏览器关闭后就会消失，由于其存储时间较短，因此也被称为非持久Cookie或会话Cookie。</li><li>硬盘式存储将Cookie保存在硬盘中，其不会随浏览器的关闭而消失，除非用户手工清理或到了过期时间。由于硬盘式Cookie存储时间是长期的，因此也被称为持久Cookie。<h3 id="3-Cookie的实现过程"><a href="#3-Cookie的实现过程" class="headerlink" title="3. Cookie的实现过程"></a>3. Cookie的实现过程</h3>客户端与服务器间的Cookie实现过程的具体步骤如下。</li><li>客户端请求服务器：客户端请求网站页面</li><li>服务器响应请求：Cookie是一种字符串，为key=value形式，服务器需要记录这个客户端请求的状态，在响应头中增加一个Set-Cookie字段。</li><li>客户端再次请求服务器：<br>客户端会对服务器响应的Set-Cookie头信息进行存储。<br>当再次请求时，将会在请求头中包含服务器响应的Cookie信息。<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/09/17/1c27c2ed44da3faa52acf0a807f4b54c.png" alt=""></li></ul><h2 id="可抓取的数据"><a href="#可抓取的数据" class="headerlink" title="可抓取的数据"></a>可抓取的数据</h2><ul><li>网页文本：如HTML文档、Json格式文本等。</li><li>图片：获取到的是二进制文件，保存为图片格式。</li><li>视频：同为二进制文件，保存为视频格式即可。</li><li>其他：只要是能请求到的，都能获取。</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;网页前端基础&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="网站开发" scheme="https://blog.yinuxy.com/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="网站开发" scheme="https://blog.yinuxy.com/tags/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Python格式化输出</title>
    <link href="https://blog.yinuxy.com/post/Python/Skill/Skills-2/"/>
    <id>https://blog.yinuxy.com/post/Python/Skill/Skills-2/</id>
    <published>2020-06-13T04:06:04.000Z</published>
    <updated>2020-08-08T12:36:14.095Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">Python格式化输出</font></center></blockquote><a id="more"></a><h2 id="Python格式化输出的三种方式"><a href="#Python格式化输出的三种方式" class="headerlink" title="Python格式化输出的三种方式"></a>Python格式化输出的三种方式</h2><h3 id="1-格式化"><a href="#1-格式化" class="headerlink" title="1. %-格式化"></a>1. <code>%-</code>格式化</h3><p>Python常用字符串格式化符号：</p><table><thead><tr><th align="center">符号</th><th align="left">含义</th></tr></thead><tbody><tr><td align="center">%s</td><td align="left">字符串</td></tr><tr><td align="center">%d</td><td align="left">有符号的十进制整数</td></tr><tr><td align="center">%f</td><td align="left">浮点数</td></tr></tbody></table><p>使用方法：</p><pre><code># 定义变量sales = 1000sell_well = &#39;苹果&#39;sell_bad = &#39;柠檬&#39;===========================================================================================&#39;农名伯伯每天销售水果 %d 千克，销量最好的是 %s，销量不好的是 %s。&#39; %(sales, sell_well, sell_bad)# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 苹果，销量不好的是 柠檬。&#39;===========================================================================================# 交换销量好坏的顺序&#39;农名伯伯每天销售水果 %d 千克，销量最好的是 %s，销量不好的是 %s。&#39; %(sales, sell_bad, sell_well)# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 柠檬，销量不好的是 苹果。&#39;</code></pre><p><code>%-</code>格式化方法要点：</p><ul><li>在字符串中以格式化符号占位，然后在字符串结尾以%()格式指定格式化符号代表的变量</li><li>%()括号里的内容存在顺序关系</li></ul><h3 id="2-str-format-格式化"><a href="#2-str-format-格式化" class="headerlink" title="2. str.format()格式化"></a>2. <code>str.format()</code>格式化</h3><p>使用方法：</p><pre><code># 默认顺序取值，使用 {} 占位&#39;农名伯伯每天销售水果 {} 千克，销量最好的是 {}，销量不好的是 {}。&#39;.format(sales, sell_well, sell_bad)# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 苹果，销量不好的是 柠檬。&#39;===========================================================================================# 通过(sales, sell_well, sell_bad)的索引进行取值&#39;农名伯伯每天销售水果 {0} 千克，销量最好的是 {2}，销量不好的是 {1}。&#39;.format(sales, sell_well, sell_bad)# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 柠檬，销量不好的是 苹果。&#39;===========================================================================================# 单独定义变量取值&#39;农名伯伯每天销售水果 {a} 千克，销量最好的是 {b}，销量不好的是 {c}。&#39;.format(a=sales, b=sell_well, c=sell_bad)# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 苹果，销量不好的是 柠檬。&#39;===========================================================================================# 使用字典取值data = {&#39;a&#39;: sales,        &#39;b&#39;: sell_well,        &#39;c&#39;: sell_bad}&#39;农名伯伯每天销售水果 {a} 千克，销量最好的是 {b}，销量不好的是 {c}。&#39;.format(**data)# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 苹果，销量不好的是 柠檬。&#39;</code></pre><h3 id="3-f‘’格式化"><a href="#3-f‘’格式化" class="headerlink" title="3. f‘’格式化"></a>3. <code>f‘’</code>格式化</h3><p>使用方法：</p><pre><code># 以f字符开头，{} 内直接使用变量f&#39;农名伯伯每天销售水果 {sales} 千克，销量最好的是 {sell_well}，销量不好的是 {sell_bad}。&#39;# 输出：&#39;农名伯伯每天销售水果 1000 千克，销量最好的是 苹果，销量不好的是 柠檬。&#39;===========================================================================================# 直接在 {} 内进行数学计算f&#39;{2 + 3 * 5 - 1}&#39;# 输出：&#39;16&#39;===========================================================================================# 调用Python内置函数fruit = &#39;APPLE&#39;f&#39;{fruit.lower()}&#39;# 输出：&#39;apple&#39;===========================================================================================# 调用自定义函数fun = lambda x : xf&#39;{fun(fruit)}&#39;# 输出：&#39;APPLE&#39;</code></pre><h2 id="Python格式化输出的精度和位数控制"><a href="#Python格式化输出的精度和位数控制" class="headerlink" title="Python格式化输出的精度和位数控制"></a>Python格式化输出的精度和位数控制</h2><h3 id="1-小数精度控制"><a href="#1-小数精度控制" class="headerlink" title="1. 小数精度控制"></a>1. 小数精度控制</h3><p>Python中对于小数精度的控制的使用方法：</p><pre><code># 定义变量a = 3.1415926===========================================================================================# 小数点后保留3位&#39;%.3f&#39;% a# 输出：&#39;3.142&#39;===========================================================================================# 小数点后保留6位&#39;%.6f&#39;% a# 输出：&#39;3.141593&#39;===========================================================================================# 最小宽度为7，小数点后保留2位，默认左边使用空格补位&#39;%7.2f&#39;% a# 输出：&#39;   3.14&#39;===========================================================================================# 最小宽度为7，小数点后保留2位，左边补零&#39;%07.2f&#39;% a# 输出：&#39;0003.14&#39;===========================================================================================# 最小宽度为7，小数点后保留2位，左边补零，带符号&#39;%+07.2f&#39;% a# 输出：&#39;+003.14&#39;===========================================================================================# 整数的最小宽度为6，左边补零b = 3&#39;%06d&#39;% b# 输出：&#39;000003&#39;</code></pre><h3 id="小数精度控制要点"><a href="#小数精度控制要点" class="headerlink" title="小数精度控制要点"></a>小数精度控制要点</h3><p>一般语法为<code>%a.bf</code> 或 <code>%.bf</code>两种，<code>a</code>表示字符串最小宽度，<code>b</code>表示数字精度，中间必须用<code>.</code>隔开。</p><h3 id="2-字符串位数控制"><a href="#2-字符串位数控制" class="headerlink" title="2. 字符串位数控制"></a>2. 字符串位数控制</h3><p>字符串输出位数的控制对于类似表格的输出结果非常有用。<br>使用方法：</p><pre><code># 定义一个字符串列表indexs = [&#39;apple&#39;, &#39;banana&#39;, &#39;strawberry&#39;, &#39;pear&#39;, &#39;pineapple&#39;]# 使用print()依次输出：===========================================================================================for index in indexs:    print(&quot;{} 索引输出结果&quot;.format(index))</code></pre><p>输出结果：<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/08/08/2de89e4539e4f4963582941dee8b175e.png" alt=""><br>可以看到，输出结果并未对齐。当数据量小时，还能勉强阅读，但如果数据量很大，字符串又都很长，阅读起来就很费眼睛了。所以，接下来将演示如何控制「输出位数」和「对齐方式」。</p><pre><code># 取10位，默认左对齐for index in indexs:    print(&quot;{:10s} 索引输出结果&quot;.format(index))</code></pre><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/08/08/e7bcbcaa98320b6d75a33ffa7c678281.png" alt=""></p><pre><code># 取20位，默认左对齐for index in indexs:    print(&quot;{:20s} 索引输出结果&quot;.format(index))</code></pre><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/08/08/f1892f46848c286873548b02e63ada73.png" alt=""></p><pre><code># 取10位，右对齐for index in indexs:    print(&quot;{:&gt;10s} 索引输出结果&quot;.format(index))</code></pre><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/08/08/354546d66a50736c7d3aedd166b736b9.png" alt=""></p><pre><code># 取10位，居中对齐for index in indexs:    print(&quot;{:^10s} 索引输出结果&quot;.format(index))</code></pre><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://gitee.com/yinuxy/cdn/raw/master/2020/08/08/cc921e58e68c34600eec17cb19884536.png" alt=""></p><p>控制输出字符串位数后的效果更加具有层次感。</p><p>常用对齐符号：</p><ul><li><code>&lt;：</code>左对齐（默认）</li><li><code>&gt;：</code>右对齐</li><li><code>^：</code>居中对齐</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;Python格式化输出&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Python" scheme="https://blog.yinuxy.com/categories/Python/"/>
    
    
      <category term="Python小技巧" scheme="https://blog.yinuxy.com/tags/Python%E5%B0%8F%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>Centos7下搭建Jupyter Notebook服务</title>
    <link href="https://blog.yinuxy.com/post/Python/Skill/jupyterCreated/"/>
    <id>https://blog.yinuxy.com/post/Python/Skill/jupyterCreated/</id>
    <published>2020-06-10T04:06:04.000Z</published>
    <updated>2020-10-16T09:41:50.353Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">Centos7下搭建Jupyter Notebook服务</font></center></blockquote><a id="more"></a><h2 id="安装python环境"><a href="#安装python环境" class="headerlink" title="安装python环境"></a>安装python环境</h2><h3 id="安装基础依赖环境"><a href="#安装基础依赖环境" class="headerlink" title="安装基础依赖环境"></a>安装基础依赖环境</h3><pre><code>yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel</code></pre><h3 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h3><p>浏览器打开 <a href="https://www.python.org/ftp/python/" target="_blank" rel="noopener">https://www.python.org/ftp/python/</a> 本文在此安装Python3.5.4</p><pre><code>wget https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz</code></pre><h3 id="创建Python3的目录"><a href="#创建Python3的目录" class="headerlink" title="创建Python3的目录"></a>创建Python3的目录</h3><pre><code>mkdir /usr/local/python3 </code></pre><h3 id="解压下载文件并进入解压后目录"><a href="#解压下载文件并进入解压后目录" class="headerlink" title="解压下载文件并进入解压后目录"></a>解压下载文件并进入解压后目录</h3><pre><code>tar -zxvf Python-3.5.4.tgzcd Python-3.5.4</code></pre><h3 id="执行自定义安装"><a href="#执行自定义安装" class="headerlink" title="执行自定义安装"></a>执行自定义安装</h3><pre><code>./configure --prefix=/usr/local/python3make &amp;&amp; make install</code></pre><h3 id="创建软链接"><a href="#创建软链接" class="headerlink" title="创建软链接"></a>创建软链接</h3><pre><code>ln -s /usr/local/python3/bin/python3 /usr/bin/python3ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3</code></pre><h3 id="测试命令"><a href="#测试命令" class="headerlink" title="测试命令"></a>测试命令</h3><pre><code>python3 -Vpip3 -V</code></pre><h2 id="安装jupyter"><a href="#安装jupyter" class="headerlink" title="安装jupyter"></a>安装jupyter</h2><h3 id="更新pip"><a href="#更新pip" class="headerlink" title="更新pip"></a>更新pip</h3><pre><code>pip3 install --upgrade pip</code></pre><h3 id="安装jupyter-1"><a href="#安装jupyter-1" class="headerlink" title="安装jupyter"></a>安装jupyter</h3><pre><code>pip3 install jupyter</code></pre><h3 id="生成配置文件"><a href="#生成配置文件" class="headerlink" title="生成配置文件"></a>生成配置文件</h3><pre><code>jupyter notebook --generate-config</code></pre><h3 id="使用systemd"><a href="#使用systemd" class="headerlink" title="使用systemd"></a>使用systemd</h3><p>生成秘钥有两种方式，这里统一介绍下：</p><ol><li>直接在命令行执行<pre><code>jupyter notebook password  # 自己造一个密码输入一确认一次</code></pre><pre><code>vim ~/.jupyter/jupyter_notebook_config.json</code></pre></li><li>先进入python环境，执行<pre><code>from notebook.auth import passwd passwd() # 此时会让你两次输入密码（该密码作为客户端登录jupyter用），然后就会生成秘钥 （秘# 钥作为配置文件用） </code></pre>记下密钥，sha1:03c74e2b144e:7…<h3 id="编辑配置文件"><a href="#编辑配置文件" class="headerlink" title="编辑配置文件"></a>编辑配置文件</h3><pre><code>vim ~/.jupyter/jupyter_notebook_config.py</code></pre>修改以下几项<pre><code>c.NotebookApp.ip=&#39;*&#39;                                  # 就是设置所有ip皆可访问  c.NotebookApp.password = u&#39;sha1:03...&#39;       # 刚才复制的那个密文&#39;  c.NotebookApp.open_browser = False       # 禁止自动打开浏览器  c.NotebookApp.port =1234                         #随便指定一个端口  c.NotebookApp.notebook_dir = &#39;/project/Jupyter_Notebook&#39;     #设置工作路径</code></pre>设置端口后要记得开放端口才能使用，具体过程可参考<a href="https://blog.yinuxy.com/post/Experience/centosFirewall/">CentOS防火墙配置</a><h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><pre><code>jupyter notebook --allow-root --ip=0.0.0.0</code></pre><h2 id="将Jupyter远程服务设置为守护进程"><a href="#将Jupyter远程服务设置为守护进程" class="headerlink" title="将Jupyter远程服务设置为守护进程"></a>将Jupyter远程服务设置为守护进程</h2><h3 id="使用systemd-1"><a href="#使用systemd-1" class="headerlink" title="使用systemd"></a>使用systemd</h3></li><li>编写<code>jupyter</code>启动脚本,在<code>/usr/sbin</code>目录下新建<code>jupyter.sh</code>文件<pre><code>sudo vim /usr/sbin/jupyter.sh</code></pre>在<code>jupyter.sh</code>中写入<pre><code>#!/bin/shjupyter notebook --allow-root --ip=0.0.0.0</code></pre>此时创建的脚本文件还没有执行权限，所以执行下面这条命令<pre><code>sudo chmod +x /usr/sbin/jupyter.sh</code></pre></li><li>编写守护进程配置文件:守护进程的配置文件存放在<code>/usr/lib/systemd/system/</code>目录下，在该目录下新建<code>jupyter.service</code>文件<pre><code>sudo vim /etc/systemd/system/jupyter.service  // centossudo vim /etc/systemd/system/jupyter.service .       // ubuntu</code></pre>打开<code>jupyter.service</code>文件并写入</li></ol><pre><code>[Unit]Description = remote jupyterAfter = network.target[Service]Type=simpleExecStart=/usr/sbin/jupyter.sh[Install]WantedBy=multi-user.target</code></pre><ol start="3"><li>启动进程:v启动进程主要用到<code>systemctl</code>相关命令</li></ol><pre><code># 重新加载配置文件systemctl daemon-reload# 启动进程systemctl start jupyter.service</code></pre><p>相关命令：</p><pre><code>systemctl start ctlist    # 启动systemctl stop ctlist     # 停止systemctl restart ctlist  # 重启systemctl status ctlist   # 查看状态</code></pre><h3 id="使用-nohup"><a href="#使用-nohup" class="headerlink" title="使用 nohup"></a>使用 nohup</h3><ol><li>创建启动文件<pre><code>vim /usr/sbin/jupyter.sh</code></pre></li><li>写入启动命令<pre><code>nohup jupyter notebook --allow-root --ip=0.0.0.0 &gt; deep.log &amp;</code></pre></li><li>运行启动文件<pre><code>./jupyter.sh</code></pre></li></ol><h2 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h2><blockquote><p>提示：有宝塔面板的直接使用宝塔就行，没有的就可以使用caddy，2选1即可。</p></blockquote><h3 id="宝塔面板"><a href="#宝塔面板" class="headerlink" title="宝塔面板"></a>宝塔面板</h3><p>先进入宝塔面板，然后点击左侧网站，添加站点，再点击添加好了的域名名称，这时候就进入了站点配置，点击反向代理，目标<code>URL</code>填入<code>http://127.0.0.1:8000</code>，不要设置缓存，再启用反向代理即可。</p><p>如果要启用<code>SSL</code>，就需要在设置反向代理之前，直接在站点配置点击<code>SSL</code>，申请免费<code>let</code>证书，然后再启用反代即可。</p><h3 id="Caddy绑定"><a href="#Caddy绑定" class="headerlink" title="Caddy绑定"></a>Caddy绑定</h3><p>安装<code>Caddy</code>：</p><pre><code>wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh &amp;&amp; chmod +x caddy_install.sh &amp;&amp; bash caddy_install.sh#备用地址wget -N --no-check-certificate https://www.moerats.com/usr/shell/Caddy/caddy_install.sh &amp;&amp; chmod +x caddy_install.sh &amp;&amp; bash caddy_install.sh</code></pre><p>配置<code>Caddy</code>：</p><pre><code>#以下全部内容是一个整体，请修改域名后一起复制到SSH运行！#http访问，该配置不会自动签发SSLecho &quot;jupyter.yinuxy.com { gzip tls admin@yinuxy.com proxy / 127.0.0.1:1234}&quot; &gt; /usr/local/caddy/Caddyfile#https访问，该配置会自动签发SSL，请提前解析域名到VPS服务器echo &quot;jupyter.yinuxy.com { gzip tls admin@yinuxy.com proxy / 127.0.0.1:1234}&quot; &gt; /usr/local/caddy/Caddyfile</code></pre><p>启动<code>Caddy</code>：</p><pre><code>/etc/init.d/caddy start</code></pre><p>就可以打开域名进行访问了。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;Centos7下搭建Jupyter Notebook服务&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Python" scheme="https://blog.yinuxy.com/categories/Python/"/>
    
    
      <category term="Python小技巧" scheme="https://blog.yinuxy.com/tags/Python%E5%B0%8F%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>服务器宝塔面板上设置防CC的方法</title>
    <link href="https://blog.yinuxy.com/post/Experience/vpsDeftcc/"/>
    <id>https://blog.yinuxy.com/post/Experience/vpsDeftcc/</id>
    <published>2020-05-16T14:06:04.000Z</published>
    <updated>2020-07-14T13:52:12.105Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">服务器宝塔面板上设置防CC的方法</font></center></blockquote><a id="more"></a><p>最好的防cc办法：别到处乱发自己的网站域名，不要到处求打，不要对自己的服务器有过大的信心。</p><h2 id="宝塔防火墙设置："><a href="#宝塔防火墙设置：" class="headerlink" title="宝塔防火墙设置："></a>宝塔防火墙设置：</h2><p>插件页面→全局配置→cc防御→初始规则</p><p>建议规则：个人博客：周期：1秒 频率：5次~15次 封锁时间：3600秒 增强模式：关闭 四层防御：开启 自动模式：开启</p><p>论坛：周期：1秒 频率：3次 封锁时间：360秒 增强模式：关闭 四层防御：开启 自动模式：开启</p><p>使用后，点击灰色的“全局应用”，否则对已添加站点无效，若服务器要站点个性化，仅修改站点即可。</p><p>规则说明：每个用户每秒可以访问站点*次，即为三个数字值的综合含义，正常用户1秒刷新5次几乎是不可能的事情，所以给出以下方案，对于论坛的不同方案是因为论坛访客数量大。</p><h2 id="宝塔5-9版本的设置方法："><a href="#宝塔5-9版本的设置方法：" class="headerlink" title="宝塔5.9版本的设置方法："></a>宝塔5.9版本的设置方法：</h2><p>进入Nginx→过滤器</p><p>建议规则：周期：1秒 频率：5次 封锁时间：3600秒</p><h2 id="流量控制："><a href="#流量控制：" class="headerlink" title="流量控制："></a>流量控制：</h2><p>网站→设置→流量限制</p><p>点击开启“启用流量控制”，限制方案依实际为准。</p><p>建议规则：个人博客：并发限制：30<del>60 单IP限制：5</del>10 流量限制：-</p><h2 id="最大并发连接数"><a href="#最大并发连接数" class="headerlink" title="最大并发连接数"></a>最大并发连接数</h2><p>Nginx→性能调整→最大并发链接数</p><p>设置为60~200，主要看你服务器多少站点，学生机不建议设置过高。</p><p>并发数代表每秒钟有几个用户同时访问你的站点，有点站点日IP都无法达到60，所以无需在意调高低。单IP限制的作用在于限制这个IP同时请求两个文件，防止这个IP把别的并发占用掉，影响正常访问。</p><p>该规则还是要看实际情况。一般小站这样设置就可以了</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;服务器宝塔面板上设置防CC的方法&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Linux" scheme="https://blog.yinuxy.com/categories/Linux/"/>
    
    
      <category term="DDOS" scheme="https://blog.yinuxy.com/tags/DDOS/"/>
    
  </entry>
  
  <entry>
    <title>【HTML+CSS】CSS3实现炫酷的流光按钮效果</title>
    <link href="https://blog.yinuxy.com/post/Experience/buttonStream/"/>
    <id>https://blog.yinuxy.com/post/Experience/buttonStream/</id>
    <published>2020-05-05T00:30:00.000Z</published>
    <updated>2020-05-06T12:04:51.646Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">【HTML+CSS】CSS3实现炫酷的流光按钮效果</font></center></blockquote><a id="more"></a><h2 id="效果预览"><a href="#效果预览" class="headerlink" title="效果预览"></a>效果预览</h2><style type="text/css">  a.button{    text-decoration: none;    position: absolute;    font-size: 24px;    background: linear-gradient(90deg, #03a9f4, #f441a5, #ffeb3b, #03a9f4);    background-size: 400%;    width: 400px;    height: 100px;    line-height: 100px;    text-align: center;    color: #fff;    text-transform: uppercase;    border-radius: 50px;    z-index: 1;  }  a.button::before{    content: "";    position: absolute;    left: -5px;    right: -5px;    top: -5px;    bottom: -5px;    background: linear-gradient(90deg, #03a9f4, #f441a5, #ffeb3b, #03a9f4);    background-size: 400%;    border-radius: 50px;    filter: blur(20px);    z-index: -1;  }  a.button:hover::before{    animation: sun 8s infinite;  }  a.button:hover{  animation: sun 8s infinite;  }  @keyframes sun{    100%{      background-position: -400% 0;    }  }</style><p><a class="button" href="https://blog.yinuxy.com">button</a></p><br/><br/><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><h2 id="CSS"><a href="#CSS" class="headerlink" title="CSS"></a>CSS</h2><pre><code>a{  text-decoration: none;  position: absolute;  left: 50%;  top: 50%;  transform: translate(-50%, -50%);  font-size: 24px;  background: linear-gradient(90deg, #03a9f4, #f441a5, #ffeb3b, #03a9f4);  background-size: 400%;  width: 400px;  height: 100px;  line-height: 100px;  text-align: center;  color: #fff;  text-transform: uppercase;  border-radius: 50px;  z-index: 1;}a::before{  content: &quot;&quot;;  position: absolute;  left: -5px;  right: -5px;  top: -5px;  bottom: -5px;  background: linear-gradient(90deg, #03a9f4, #f441a5, #ffeb3b, #03a9f4);  background-size: 400%;  border-radius: 50px;  filter: blur(20px);  z-index: -1;}a:hover::before{  animation: sun 8s infinite;}a:hover{animation: sun 8s infinite;}@keyframes sun{  100%{    background-position: -400% 0;  }}</code></pre><h2 id="HTML"><a href="#HTML" class="headerlink" title="HTML"></a>HTML</h2><pre><code>&lt;a href=&quot;https:blog.yinuxy.com&quot;&gt;button&lt;/a&gt;</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;【HTML+CSS】CSS3实现炫酷的流光按钮效果&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="网站开发" scheme="https://blog.yinuxy.com/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="HTML" scheme="https://blog.yinuxy.com/tags/HTML/"/>
    
  </entry>
  
  <entry>
    <title>“Shopee杯” E 起来编程暨武汉大学 2020 年大学生程序设计大赛（网络预选赛）解题报告</title>
    <link href="https://blog.yinuxy.com/post/OJContest/2020whuShopee/"/>
    <id>https://blog.yinuxy.com/post/OJContest/2020whuShopee/</id>
    <published>2020-04-13T00:30:00.000Z</published>
    <updated>2020-07-14T13:52:12.108Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5" face = "楷体">“Shopee杯” E 起来编程暨武汉大学 2020 年大学生程序设计大赛（网络预选赛）解题报告</font></center></blockquote><a id="more"></a><p>比赛地址：<a href="https://ac.nowcoder.com/acm/contest/5166#question" target="_blank" rel="noopener">“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛（网络预选赛）</a><br>整场比赛体验极差，英语杀我（题目都看不懂还做个屁啊！！！），结束后当天晚上讲题，对照题解自己又去做了一遍。</p><h2 id="E-Yu-is-a-Brutal-Creature"><a href="#E-Yu-is-a-Brutal-Creature" class="headerlink" title="E-Yu is a Brutal Creature"></a><a href="https://ac.nowcoder.com/acm/contest/5166/E" target="_blank" rel="noopener">E-Yu is a Brutal Creature</a></h2><h3 id="题意"><a href="#题意" class="headerlink" title="题意"></a>题意</h3><p>找出$0 \sim n$之间所有满足$(n+1)|(n^2+1)$的自然数</p><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>根据平方差公式：$n^2-1=(n+1)(n-1)$ 可知 $(n+1)|(n^2+1)$。<br>于是可知 $(n^2+1) - (n^2-1)=2$ 也应当是 $n+1$ 的倍数。<br>符合条件的数，只有 $0$ 和 $1$ 。<br>所以当$n = 0$时，答案为 $0$ ，当 $n &gt; 0$ 时，答案为 $n - 1$ 。 </p><pre><code>#include &lt;bits/stdc++.h&gt;using namespace std;int main() {    int T;    scanf(&quot;%d&quot;, &amp;T);    while (T--) {        int n;        scanf(&quot;%d&quot;, &amp;n);        printf(&quot;%d\n&quot;, n ? (n - 1) : n);    }    return 0;   }</code></pre><h2 id="B-Best-Match"><a href="#B-Best-Match" class="headerlink" title="B-Best Match"></a><a href="https://ac.nowcoder.com/acm/contest/5166/B" target="_blank" rel="noopener">B-Best Match</a></h2><h3 id="题意-1"><a href="#题意-1" class="headerlink" title="题意"></a>题意</h3><p>给定一个数组，求有多少个数对 $a_i$ , $a_j$ , $i \neq j$ 满足 $a_i + a_j == 0$。</p><h3 id="解题思路-1"><a href="#解题思路-1" class="headerlink" title="解题思路"></a>解题思路</h3><p>记录下数组中每个权值的出现次数，记数组中权值 $i$ 的出现次数为 $cnt_i$ 。那么答案就是：</p><center> $\sum\limits_{i=1}^{max(a)} cnt_i \times cnt_{-i} + cnt_0 \times (cnt_0 - 1)/2$ </center><pre><code>#include&lt;bits/stdc++.h&gt;using namespace std;int read(){    int c=0,nx,sign=1;    while(!isdigit(nx = getchar()))        if(nx==&#39;-&#39;)            sign=-1;    while(isdigit(nx))        c=c*10+nx-&#39;0&#39;,nx=getchar();    return sign*c;}const int N = 5e5 + 20;long long cnt[100];int main(){    int n = read();    for(int i=1;i&lt;=n;i++)        cnt[read() + 20]++;    long long ans = cnt[20] * (cnt[20] - 1) / 2;    for(int i=1;i&lt;=20;i++)        if(cnt[i + 20] and cnt[20 - i])            ans += cnt[i + 20]  * cnt[20 - i];    printf(&quot;%lld&quot;,ans);}</code></pre><h2 id="A-A-Monument-For-Heroes"><a href="#A-A-Monument-For-Heroes" class="headerlink" title="A-A Monument For Heroes"></a><a href="https://ac.nowcoder.com/acm/contest/5166/A" target="_blank" rel="noopener">A-A Monument For Heroes</a></h2><h3 id="题意-2"><a href="#题意-2" class="headerlink" title="题意"></a>题意</h3><p>给你若干字符串，求按照首尾字母相同的方式接龙能接上多少个，且必须按照题目输入的顺序接, 也就是先出现的字符串必须接在前面。</p><h3 id="解题思路-2"><a href="#解题思路-2" class="headerlink" title="解题思路"></a>解题思路</h3><p>使用 DP 实现，记 $dp[i][j]$ 表示以 $i$ 开头，$j$ 结尾的接龙的最长长度。<br>随后依次枚举每个字符串，假设字符串 $s$ 的开头是 $c_1$ ，结尾为 $c_2$ ，那么<br>更新所有 $dp[i][c_2]$，更新方式为 $dp[i][c_2] = max(dp[i][c_2] , dp[i][c_1]+|s|)$ 。</p><pre><code>#include&lt;bits/stdc++.h&gt;#define inf 1&lt;&lt;29#define maxn 1000010typedef long long ll;using namespace std;int n,mp[210][210],ans;char str[110];int main(){    cin&gt;&gt;n;    for(int i=1;i&lt;=n;++i){        scanf(&quot;%s&quot;,str);        int len=strlen(str);        char s=str[0],t=str[len-1];        for(int j=&#39;a&#39;;j&lt;=&#39;z&#39;;++j){            if(mp[j][s]){                mp[j][t]=max(mp[j][t],mp[j][s]+len);            }        }        mp[s][t]=max(mp[s][t],len);    }    for(int i=&#39;a&#39;;i&lt;=&#39;z&#39;;++i) ans=max(ans,mp[i][i]);    cout&lt;&lt;ans&lt;&lt;endl;    return 0;}</code></pre><h2 id="D-DIY-Masks-at-Home"><a href="#D-DIY-Masks-at-Home" class="headerlink" title="D-DIY Masks at Home"></a><a href="https://ac.nowcoder.com/acm/contest/5166/D" target="_blank" rel="noopener">D-DIY Masks at Home</a></h2><h3 id="题意-3"><a href="#题意-3" class="headerlink" title="题意"></a>题意</h3><p>给你一个由大写字母构成的二维矩阵，你需要找到一个最大的正方形，使得这个正方形内只包含一种字母。</p><h3 id="解题思路-3"><a href="#解题思路-3" class="headerlink" title="解题思路"></a>解题思路</h3><p>本题实际上有多种通过方法，下面介绍两种参考方法：</p><ol><li>（暴力哈希）将原矩阵内每一种字母都替换成一个素数，然后计算这个矩阵的二维前缀积（对大素数取模）。那么在给定二分长度 k 的前提下，我们每次可以枚举一个矩形的左上角 $(i,j)$ ，利用逆元计算出这么个矩形的积，再和这种字母的纯 $k ∗ k$ 正方形对应的哈希值比对。如果担心碰撞，只需改成双哈希就好。总复杂度为常数有点大的 $O(nmlog(n))$ 。</li><li>我们如果在原矩阵 F 的基础上预处理出一个新矩阵 $G$, 第 $i$ 行第 $j$ 列的值的意义为：这个值在这一行前面有多少个连续的数和它相同（包括自己）。<br>随后我们对于每一列从上到下遍历，如果一个边长为 $k$，右下角位于 $(i,j)$ 的矩形存在的话，一定会满足： ${\min\limits_{i-k &lt; t\leq i} {G[t][j]} \geq k}$ 可想而知，对于我们枚举的右下角，右上角也是具备单调性的，所以我们可以采用二分 + 对每一列维护 $RMQ$ 数组的方法获得一个 $O(nmlog(n))$ 的方法。</li></ol><pre><code>#include&lt;bits/stdc++.h&gt;#define inf 1&lt;&lt;29#define maxn 1000010typedef long long ll;using namespace std;int n,mp[210][210],ans;char str[110];int main(){    cin&gt;&gt;n;    for(int i=1;i&lt;=n;++i){        scanf(&quot;%s&quot;,str);        int len=strlen(str);        char s=str[0],t=str[len-1];        for(int j=&#39;a&#39;;j&lt;=&#39;z&#39;;++j){            if(mp[j][s]){                mp[j][t]=max(mp[j][t],mp[j][s]+len);            }        }        mp[s][t]=max(mp[s][t],len);    }    for(int i=&#39;a&#39;;i&lt;=&#39;z&#39;;++i) ans=max(ans,mp[i][i]);    cout&lt;&lt;ans&lt;&lt;endl;    return 0;}</code></pre><h2 id="C-Can-You-Help-ZSGW"><a href="#C-Can-You-Help-ZSGW" class="headerlink" title="C-Can You Help ZSGW"></a><a href="https://ac.nowcoder.com/acm/contest/5166/C" target="_blank" rel="noopener">C-Can You Help ZSGW</a></h2><h3 id="题意-4"><a href="#题意-4" class="headerlink" title="题意"></a>题意</h3><p>有一个排列，已知我们对于这个排列执行单调栈算法过程中，遍历到每一个位置之后单调栈的大小，有些位置缺失可以任意。求一个满足这种情况的字典序最小的排列。</p><h3 id="解题思路-4"><a href="#解题思路-4" class="headerlink" title="解题思路"></a>解题思路</h3><p>首先我们应该做的事，是补全这个单调栈数组 $b$。单调栈数组由于单调栈算法的特点，必然满足这么几个特点：</p><ol><li>$b[1] = 1$</li><li>若 $b[i] &gt; b[i − 1]$ ，则 $b[i] = b[i − 1] + 1$ ，且 $a[i] &gt; a[i − 1]$ 。</li><li>对于 $b[i] &lt;= b[i − 1]$ ，一定有 $a[i] &lt; a[i − 1]$ 。</li></ol><p>我们从左到右依次补全每一个为 $−1$ 的格子，那么策略应该是：</p><ol><li>若 $i = 1$ ，$b[i] = 1$ 。</li><li>否则，如果我们填一个比 $b[i − 1]$ 小的数的话，就意味着之后补全的时候 $a[i − 1] &gt; a[i]$ ，在字典序上不会是个好主意。所以应该填 $b[i − 1] + 1$ 。</li></ol><p>补全数组之后，规律如下：<br>首先我们可以发现所有为 $1$ 的位置组成了以 $1$ 截止的降序序列。然后对于每个被 $1$ 分割的子区间，$2$ 也会满足类似的规律。然后对于 $2$ 进一步分割的子区间 $3$ 也会如此。于是我们按照权值递增的顺序，依次填入每个数，然后分治递归填写子区间。标程的复杂度为 $O(nlog(n))$，实际上利用分治区间的单调性可以进一步优化到 $O(n)$。</p><pre><code>#include &lt;bits/stdc++.h&gt;using namespace std;int T, n;int p[200005];int lst[200005], tail;int pre[200005];int nxt[200005];int s[200005];int main() {    scanf(&quot;%d&quot;, &amp;T);    for(int k = 0; k &lt; T; ++k) {        scanf(&quot;%d&quot;, &amp;n);        for(int i = 0; i &lt;= n; ++i) nxt[i] = pre[i] = 0;        tail = 0;        for(int i = 1; i &lt;= n; ++i) scanf(&quot;%d&quot;, &amp;p[i]);        p[1] = 1;        for(int i = 2; i &lt;= n; ++i) if(p[i] == -1) {            if(p[i + 1] - p[i - 1] == 2) p[i] = p[i - 1] + 1;            else p[i] = p[i - 1] + 1;        }        for(int i = 1; i &lt;= n; ++i) {            if(p[i] &gt; p[i - 1]) {                nxt[tail] = i;                pre[i] = tail;                tail = i;            } else {                int x = lst[p[i]];                nxt[pre[x]] = i;                pre[i] = pre[x];                nxt[i] = x;                pre[x] = i;            }            lst[p[i]] = i;        }        for(int i = 1, j = nxt[0]; i &lt;= n; ++i, j = nxt[j]) s[j] = i;        for(int i = 1; i &lt;= n; ++i) printf(&quot;%d &quot;, s[i]);        printf(&quot;\n&quot;);    }    return 0;}</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot; face = &quot;楷体&quot;&gt;“Shopee杯” E 起来编程暨武汉大学 2020 年大学生程序设计大赛（网络预选赛）解题报告&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="ACM解题报告" scheme="https://blog.yinuxy.com/categories/ACM%E8%A7%A3%E9%A2%98%E6%8A%A5%E5%91%8A/"/>
    
    
  </entry>
  
  <entry>
    <title>视频切片后自动上传至国内免费CDN，无成本加速视频播放</title>
    <link href="https://blog.yinuxy.com/post/TechShare/videoSec/"/>
    <id>https://blog.yinuxy.com/post/TechShare/videoSec/</id>
    <published>2020-03-28T16:00:00.000Z</published>
    <updated>2020-07-14T13:52:12.153Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">视频切片后自动上传至国内免费CDN，无成本加速视频播放</font></center></blockquote><a id="more"></a><h2 id="更新"><a href="#更新" class="headerlink" title="更新"></a>更新</h2><pre><code>【2020.4.1】由于语雀修复了上传bug，所以移除语雀cdn，默认修改为阿里云图床</code></pre><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>Github地址：<a href="https://github.com/MoeClub/Note/tree/master/ffmpeg" target="_blank" rel="noopener">https://github.com/MoeClub/Note/tree/master/ffmpeg</a></p><ol><li>安装ffmpeg<pre><code>wget https://www.moerats.com/usr/down/ffmpeg/ffmpeg-git-$(getconf LONG_BIT)bit-static.tar.xztar xvf ffmpeg-git-*-static.tar.xzmv ffmpeg-git-*/ffmpeg  ffmpeg-git-*/ffprobe /usr/local/bin/rm -rf ffmpeg-git-*</code></pre></li><li>安装脚本<pre><code>#新建/opt/ffmpeg文件夹存放脚本等文件mkdir /opt/ffmpeg &amp;&amp; cd $_#下载并运行脚本wget https://raw.githubusercontent.com/MoeClub/Note/master/ffmpeg/Install.shbash Install.sh</code></pre></li><li>启动播放器<br>由于切片生成<code>m3u8</code>文件后，需要播放器才能播放，而上传脚本也会自动推送<code>m3u8</code>文件到播放器根目录，所以这里可以配合一起用，当然自己会播放<code>m3u8</code>的也可以不用搭建，自行选择。<br>安装<code>pip3</code>：<pre><code>#CenOS 6系统rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpmyum install python34 -ywget https://bootstrap.pypa.io/get-pip.pypython3 get-pip.py</code></pre></li></ol><p>#CenOS 7系统<br>rpm -Uvh <a href="https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm" target="_blank" rel="noopener">https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm</a><br>yum install python36 -y<br>wget <a href="https://bootstrap.pypa.io/get-pip.py" target="_blank" rel="noopener">https://bootstrap.pypa.io/get-pip.py</a><br>python3 get-pip.py</p><p>#Debian/Ubuntu系统<br>apt update<br>apt install python3-pip -y</p><pre><code>安装依赖：</code></pre><p>#进入到播放源码文件夹<br>cd /opt/ffmpeg/Player<br>pip3 install tornado</p><pre><code>后台启动：</code></pre><p>nohup python3 Player.py&amp;</p><pre><code>注意`Player.py`文件的`MasterKey`值需和`publish.sh`的`Token`值对应，别乱改就行。4. 脚本用法</code></pre><p>#命令示例<br>bash /path/to/media.sh &lt;不含特殊字符的文件名.mp4&gt; [特殊选项]</p><p>#特殊选项: 数字；可选参数，默认为0<br>#0：自动根据文件比特率计算合适的切片大小。(目标文件大小小于20M，一般情况下没问题)<br>#1：强制重新编码，重新编码比特率为2400k。(一般用于非H264编码，文件切片，速度较慢)<br>#2：自定义切片时间，当为2时切片时间为3秒，当大于等于3时切片时间为特殊选项数字。</p><pre><code>使用示例：</code></pre><p>#进入视频所在目录<br>cd /root/movies</p><p>#默认模式切片<br>bash /opt/ffmpeg/media.sh rats.mp4<br>#强制重新编码<br>bash /opt/ffmpeg/media.sh rats.mp4 1<br>#极速模式, 设置2s一个切片(源文件为H264编码情况下)<br>bash /opt/ffmpeg/media.sh rats.mp4 2</p><pre><code>5. 播放示例</code></pre><p>#查看推送到播放器这边的m3u8所有文件<br><a href="http://ip:5866/Player/list" target="_blank" rel="noopener">http://ip:5866/Player/list</a></p><p>#播放list显示的根目录下的rats.m3u8文件<br><a href="http://ip:5866/Player/rats.m3u8" target="_blank" rel="noopener">http://ip:5866/Player/rats.m3u8</a></p><pre><code>## 上传到语雀CDN ##</code></pre><p>提示：该方案可选，目前语雀默认免费10G，具体可参考官方说明。</p><pre><code>先前往语雀官网注册一个账号→[传送门](https://www.yuque.com/)，然后获取`ctoken`和`session`的值，这里说下大概获取方法，以谷歌浏览器为例。登录后，`F12`进入控制台选择`Network`，随便点击一个以`yuque`开头的链接文件，再选择`Cookies`即可看到所需要的2个参数。&lt;img src=&#39;https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/17.png&#39;&gt;然后复制`ctoken`和`session`的值。接下来查看语雀脚本→[传送门](https://github.com/MoeClub/Note/blob/master/ffmpeg/upload_yuque.sh)，将脚本所有的内容复制替换到`upload.sh`脚本里面，并填入`ctoken`和`session`的值，保存即可，上传方法参考上面。最后如果你是`vps`的话，就不建议强制转码，只切片就行了，不然长时间占用`cpu`的话，服务器可能会被`ban`，基本上大多数`mp4`都可以直接切片。转载于：https://www.moerats.com/archives/1024/</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;视频切片后自动上传至国内免费CDN，无成本加速视频播放&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>基于宝塔Docker自建Bitwarden密码管理服务</title>
    <link href="https://blog.yinuxy.com/post/TechShare/Bitwarden/"/>
    <id>https://blog.yinuxy.com/post/TechShare/Bitwarden/</id>
    <published>2020-03-24T16:00:00.000Z</published>
    <updated>2020-07-14T13:52:12.127Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Bitwarden是一个跨平台的密码管理软件，类似于 1Password、EnPass、LastPass 等。Bitwarden 是免费开源的，可以将服务端部署在自己的服务器上，比如群晖，并且支持 Docker 部署。但官方的&gt;镜像要求至少 2G 以上内存，要求比较高。有人用 Rust 实现了 Bitwarden 服务器，项目叫 bitwarden_rs，并且提供了 Docker 镜像，这个实现更进一步降低了对机器配置的要求，并且 Docker 镜像体积很小，部署非常方便。</p></blockquote><a id="more"></a><h2 id="宝塔安装Docker"><a href="#宝塔安装Docker" class="headerlink" title="宝塔安装Docker"></a>宝塔安装Docker</h2><p>进入到宝塔面板的软件商店，搜索docker安装即可。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/01.png'></p><h2 id="获取镜像"><a href="#获取镜像" class="headerlink" title="获取镜像"></a>获取镜像</h2><p>打开docker管理器，点击获取镜像，输入Bitwarden_rs的官方镜像<code>bitwardenrs/server</code>后点击获取镜像。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/02.png'></p><h2 id="创建容器"><a href="#创建容器" class="headerlink" title="创建容器"></a>创建容器</h2><ol><li>点击创建容器按钮</li><li>填写端口映射中的容器端口：80,服务端口：6666(6666可以自定义)</li><li>填写目录映射中的服务器目录：<code>/www/wwwroot/bitwarden.liubing.me</code>(该目录可以自定义)，容器目录：<code>/data</code></li><li>填写内存配额，根据自己服务器的配置按需填写</li><li>提交创建容器</li><li>点击容器名称，修改容器名称为Bitwarden以方便辨认<blockquote><p>端口映射和目录映射填写完成后一定要点击+号进行添加</p></blockquote></li></ol><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/03.png'><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/04.png'><h2 id="添加站点"><a href="#添加站点" class="headerlink" title="添加站点"></a>添加站点</h2><p>一般可以添加一个二级域名，按自己需要起名字即可，由于我用的<code>cloudflare</code>的服务，所以以这个为演示，阿里云、百度云等其他厂商添加二级域名都是差不多的。</p><p>添加一个A记录，名字为bitwarden，指向的IP为你服务器VPS的IP地址，最后的访问地址就是<code>bitwarden.liubing.me</code>了。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/05.png'></p><p>域名准备好后，在宝塔里面添加一个站点，FTP、数据库均不用创建，PHP版本选择纯静态。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/06.png'></p><p>网站添加完成后设置SSL，自己准备证书，或者用免费的，我用的一直是cloudflare颁发的证书。<br>设置完毕后开启强制Https<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/07.png'></p><p>最后添加一个反向代理，名称随意填，目标URL为<code>http://127.0.0.1:6666</code>，端口号和上面<code>创建容器</code>时<code>服务端口</code>保持一直。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/08.png'></p><h2 id="完成自建"><a href="#完成自建" class="headerlink" title="完成自建"></a>完成自建</h2><p>上述步骤都做完后别忘了在宝塔面板安全-防火墙中放行端口<code>6666</code>。<br>最后不出意外的话访问<code>https://bitwarden.liubing.me</code>就能看到界面了。<br>首次完成安装页面是英文的，自己可以创建一个账号登录进去，在设置-选项-语言中设置语言。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/09.png'></p><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/10.png'><h2 id="其他问题"><a href="#其他问题" class="headerlink" title="其他问题"></a>其他问题</h2><p>一般自建的服务都是自己用的，所以如果想关闭注册的话可以按照下面的方法做：</p><ol><li><p>在docker管理器中点击刚才创建的容器的状态绿色图标，停止容器运行，然后删除容器（删除容器后不会删除数据）</p><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/11.png'></li><li><p>在VPS中运行下面的命令重新运行容器，其中Bitwarden为容器的名字，<code>SIGNUPS_ALLOWED=false</code>代表禁止注册，<code>/www/wwwroot/bitwarden.liubing.me</code>为上面创建容器时所写的服务器目录,<code>/data</code>为容器目录，<code>6666:80</code>代表上面创建容器时的服务端口:容器端口</p></li></ol><pre><code>docker run -d --name Bitwarden \  -e SIGNUPS_ALLOWED=false \  -v /www/wwwroot/bitwarden.liubing.me/:/data/ \  -p 6666:80 \  bitwardenrs/server:latest</code></pre><h3 id="SHELL"><a href="#SHELL" class="headerlink" title="SHELL"></a>SHELL</h3><p>运行完成后在容器列表里就又能看到了。<br>然后再去试下创建账号就会出现一个不能创建账号的错误提示。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/12.png'></p><h3 id="其他配置"><a href="#其他配置" class="headerlink" title="其他配置"></a>其他配置</h3><p>参考项目的wiki即可：<br><a href="https://github.com/dani-garcia/bitwarden_rs/wiki" target="_blank" rel="noopener">https://github.com/dani-garcia/bitwarden_rs/wiki</a></p><h2 id="插件及App下载"><a href="#插件及App下载" class="headerlink" title="插件及App下载"></a>插件及App下载</h2><p>可以到bitwarden官网自行下载：<a href="https://bitwarden.com/#download" target="_blank" rel="noopener">https://bitwarden.com/#download</a></p><h2 id="连接自建的服务"><a href="#连接自建的服务" class="headerlink" title="连接自建的服务"></a>连接自建的服务</h2><p>以CHrome的插件为例子，如果之前有安装及登录过，可以在设置中退出登录。<br>点击左上角的设置图标，填写自建服务器的URL保存后登录即可。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/13.png'></p><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/14.png'><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>最后就可以愉快的在浏览器和手机上愉快的使用了，顺便说句：我的密码存储我做主，再也不用害怕密码忘记的事了，也可以记录些银行卡等隐私信息，随时复制。<br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/15.png'><br><img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.01/image/Article/2020-4-2/16.png'> </p><p>转自：<a href="">https://liubing.me/bt-docker-build-bitwarden.html</a> 作者：LiuBing</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;Bitwarden是一个跨平台的密码管理软件，类似于 1Password、EnPass、LastPass 等。Bitwarden 是免费开源的，可以将服务端部署在自己的服务器上，比如群晖，并且支持 Docker 部署。但官方的&amp;gt;镜像要求至少 2G 以上内存，要求比较高。有人用 Rust 实现了 Bitwarden 服务器，项目叫 bitwarden_rs，并且提供了 Docker 镜像，这个实现更进一步降低了对机器配置的要求，并且 Docker 镜像体积很小，部署非常方便。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Docker" scheme="https://blog.yinuxy.com/categories/Docker/"/>
    
    
  </entry>
  
  <entry>
    <title>使用Docker一键部署Cloudreve网盘</title>
    <link href="https://blog.yinuxy.com/post/TechShare/CloudreveOnDocker/"/>
    <id>https://blog.yinuxy.com/post/TechShare/CloudreveOnDocker/</id>
    <published>2020-03-22T11:43:16.000Z</published>
    <updated>2020-07-14T13:52:12.131Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">使用Docker一键部署Cloudreve网盘</font></center></blockquote><a id="more"></a><h2 id="Cloudreve-Docker简介"><a href="#Cloudreve-Docker简介" class="headerlink" title="Cloudreve-Docker简介"></a>Cloudreve-Docker简介</h2><p>项目地址：<a href="https://github.com/littleplus/Cloudreve-Docker" target="_blank" rel="noopener">https://github.com/littleplus/Cloudreve-Docker</a><br>容器地址：<a href="https://hub.docker.com/r/littleplus/cloudreve-3.0.0-rc-1" target="_blank" rel="noopener">https://hub.docker.com/r/littleplus/cloudreve-3.0.0-rc-1</a><br>本Docker容器基于redis:5-alpine基础镜像制作，在保证程序运行稳定的前提下，实现最小空间占用以及资源消耗<br>本Docker容器的Cloudreve版本为Cloudreve-3.0.0-RC-1，大概率镜像及Dockerfile将不会再更新</p><h2 id="容器特点"><a href="#容器特点" class="headerlink" title="容器特点"></a>容器特点</h2><ol><li>镜像大小仅70M左右，资源消耗极低</li><li>外挂程序运行目录，可以自行更新Cloudreve版本，修改配置文件</li><li>在初次使用时，会在<code>/etc/cloudreve</code>目录生成cloudreve二进制文件以及配置文件</li><li>在<code>/etc/cloudreve/cloudreve.db</code>不存在时，由cloudreve自行生成sqlite数据库，密码可以在<code>docker logs</code>里面看到</li></ol><h2 id="快速开始"><a href="#快速开始" class="headerlink" title="快速开始"></a>快速开始</h2><p>默认前提：已经安装好docker并使docker服务正常运行中</p><ol><li>git clone本项目或下载项目压缩包</li><li>运行scripts/下的start.sh脚本，保存管理员用户名及密码信息（仅在初次创建数据库时显示）</li><li>默认会将cloudreve本体、配置文件、数据库存放到/etc/cloudreve，将宿主机/data/cloudreve绑定到容器/data</li><li>在cloudreve内修改默认存储策略中的存储路径为<pre><code>/data/uploads/{uid}/{path}</code></pre></li></ol><h2 id="快速开始-1"><a href="#快速开始-1" class="headerlink" title="快速开始"></a>快速开始</h2><ol><li>忘记保存初始密码了怎么办<br>删除<code>/etc/cloudreve/cloudreve.db</code>文件（会丢失原有文件记录），运行scripts/的start.sh，会重新生成密码</li><li>如何升级Cloudreve<br>备份/etc/cloudreve文件夹，将新版Cloudreve二进制程序替换/etc/cloudreve的cloudreve文件，运行<pre><code>docker restart cloudreve</code></pre></li><li>如何修改Cloudreve基础配置<br>修改<code>/etc/cloudreve/cloudreve.conf</code>，运行<pre><code>docker restart cloudreve</code></pre>重启容器生效</li><li>如何修改Cloudreve主机监听端口<br>修改<code>scripts/start.sh</code>，将左边的端口号替换为需要要监听的端口，运行scripts/start.sh生效</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;使用Docker一键部署Cloudreve网盘&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Docker" scheme="https://blog.yinuxy.com/categories/Docker/"/>
    
    
  </entry>
  
  <entry>
    <title>十六进制颜色表</title>
    <link href="https://blog.yinuxy.com/post/TechShare/HexColor/"/>
    <id>https://blog.yinuxy.com/post/TechShare/HexColor/</id>
    <published>2020-03-20T09:13:57.000Z</published>
    <updated>2020-07-14T13:52:12.141Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">十六进制颜色表</font></center></blockquote><a id="more"></a><h2 id="文字查找"><a href="#文字查找" class="headerlink" title="文字查找"></a>文字查找</h2><table><tr align="center"><td><strong>颜 色</strong></a></td><td><strong>英文代码</strong></td><td><strong>形象描述</strong></td><td><strong>十六进制</strong></td><td><strong>RGB</strong></td></tr><tr align="center"><td bgcolor="#ffb6c1">　</td><td><center>LightPink</center></td><td>浅粉红</td><td>#FFB6C1</td><td>255,182,193</td></tr><tr align="center"><td bgcolor="#ffc0cb">　</td><td>Pink</td><td>粉红</td><td>#FFC0CB</td><td>255,192,203</td></tr><tr align="center"><td bgcolor="#dc143c">　</td><td>Crimson</td><td>猩红</td><td>#DC143C</td><td>220,20,60</td></tr><tr align="center"><td bgcolor="#fff0f5">　</td><td>LavenderBlush</td><td>脸红的淡紫色</td><td>#FFF0F5</td><td>255,240,245</td></tr><tr align="center"><td bgcolor="#db7093">　</td><td>PaleVioletRed</td><td>苍白的紫罗兰红色</td><td>#DB7093</td><td>219,112,147</td></tr><tr align="center"><td bgcolor="#ff69b4">　</td><td>HotPink</td><td>热情的粉红</td><td>#FF69B4</td><td>255,105,180</td></tr><tr align="center"><td bgcolor="#ff1493">　</td><td>DeepPink</td><td>深粉色</td><td>#FF1493</td><td>255,20,147</td></tr><tr align="center"><td bgcolor="#c71585">　</td><td>MediumVioletRed</td><td>适中的紫罗兰红色</td><td>#C71585</td><td>199,21,133</td></tr><tr align="center"><td bgcolor="#da70d6">　</td><td>Orchid</td><td>兰花的紫色</td><td>#DA70D6</td><td>218,112,214</td></tr><tr align="center"><td bgcolor="#d8bfd8">　</td><td>Thistle</td><td>蓟</td><td>#D8BFD8</td><td>216,191,216</td></tr><tr align="center"><td bgcolor="#dda0dd">　</td><td>plum</td><td>李子</td><td>#DDA0DD</td><td>221,160,221</td></tr><tr align="center"><td bgcolor="#ee82ee">　</td><td>Violet</td><td>紫罗兰</td><td>#EE82EE</td><td>238,130,238</td></tr><tr align="center"><td bgcolor="#ff00ff">　</td><td>Magenta</td><td>洋红</td><td>#FF00FF</td><td>255,0,255</td></tr><tr align="center"><td bgcolor="#ff00ff">　</td><td>Fuchsia</td><td>灯笼海棠(紫红色)</td><td>#FF00FF</td><td>255,0,255</td></tr><tr align="center"><td bgcolor="#8b008b">　</td><td>DarkMagenta</td><td>深洋红色</td><td>#8B008B</td><td>139,0,139</td></tr><tr align="center"><td bgcolor="#800080">　</td><td>Purple</td><td>紫色</td><td>#800080</td><td>128,0,128</td></tr><tr align="center"><td bgcolor="#ba55d3">　</td><td>MediumOrchid</td><td>适中的兰花紫</td><td>#BA55D3</td><td>186,85,211</td></tr><tr align="center"><td bgcolor="#9400d3">　</td><td>DarkVoilet</td><td>深紫罗兰色</td><td>#9400D3</td><td>148,0,211</td></tr><tr align="center"><td bgcolor="#9932cc">　</td><td>DarkOrchid</td><td>深兰花紫</td><td>#9932CC</td><td>153,50,204</td></tr><tr align="center"><td bgcolor="#4b0082">　</td><td>Indigo</td><td>靛青</td><td>#4B0082</td><td>75,0,130</td></tr><tr align="center"><td bgcolor="#8a2be2">　</td><td>BlueViolet</td><td>深紫罗兰的蓝色</td><td>#8A2BE2</td><td>138,43,226</td></tr><tr align="center"><td bgcolor="#9370db">　</td><td>MediumPurple</td><td>适中的紫色</td><td>#9370DB</td><td>147,112,219</td></tr><tr align="center"><td bgcolor="#7b68ee">　</td><td>MediumSlateBlue</td><td>适中的板岩暗蓝灰色</td><td>#7B68EE</td><td>123,104,238</td></tr><tr align="center"><td bgcolor="#6a5acd">　</td><td>SlateBlue</td><td>板岩暗蓝灰色</td><td>#6A5ACD</td><td>106,90,205</td></tr><tr align="center"><td bgcolor="#483d8b">　</td><td>DarkSlateBlue</td><td>深岩暗蓝灰色</td><td>#483D8B</td><td>72,61,139</td></tr><tr align="center"><td bgcolor="#e6e6fa">　</td><td>Lavender</td><td>熏衣草花的淡紫色</td><td>#E6E6FA</td><td>230,230,250</td></tr><tr align="center"><td bgcolor="#f8f8ff">　</td><td>GhostWhite</td><td>幽灵的白色</td><td>#F8F8FF</td><td>248,248,255</td></tr><tr align="center"><td bgcolor="#0000ff">　</td><td>Blue</td><td>纯蓝</td><td>#0000FF</td><td>0,0,255</td></tr><tr align="center"><td bgcolor="#0000cd">　</td><td>MediumBlue</td><td>适中的蓝色</td><td>#0000CD</td><td>0,0,205</td></tr><tr align="center"><td bgcolor="#191970">　</td><td>MidnightBlue</td><td>午夜的蓝色</td><td>#191970</td><td>25,25,112</td></tr><tr align="center"><td bgcolor="#00008b">　</td><td>DarkBlue</td><td>深蓝色</td><td>#00008B</td><td>0,0,139</td></tr><tr align="center"><td bgcolor="#000080">　</td><td>Navy</td><td>海军蓝</td><td>#000080</td><td>0,0,128</td></tr><tr align="center"><td bgcolor="#4169e1">　</td><td>RoyalBlue</td><td>皇军蓝</td><td>#4169E1</td><td>65,105,225</td></tr><tr align="center"><td bgcolor="#6495ed">　</td><td>CornflowerBlue</td><td>矢车菊的蓝色</td><td>#6495ED</td><td>100,149,237</td></tr><tr align="center"><td bgcolor="#b0c4de">　</td><td>LightSteelBlue</td><td>淡钢蓝</td><td>#B0C4DE</td><td>176,196,222</td></tr><tr align="center"><td bgcolor="#778899">　</td><td>LightSlateGray</td><td>浅石板灰</td><td>#778899</td><td>119,136,153</td></tr><tr align="center"><td bgcolor="#708090">　</td><td>SlateGray</td><td>石板灰</td><td>#708090</td><td>112,128,144</td></tr><tr align="center"><td bgcolor="#1e90ff">　</td><td>DoderBlue</td><td>道奇蓝</td><td>#1E90FF</td><td>30,144,255</td></tr><tr align="center"><td bgcolor="#f0f8ff">　</td><td>AliceBlue</td><td>爱丽丝蓝</td><td>#F0F8FF</td><td>240,248,255</td></tr><tr align="center"><td bgcolor="#4682b4">　</td><td>SteelBlue</td><td>钢蓝</td><td>#4682B4</td><td>70,130,180</td></tr><tr align="center"><td bgcolor="#87cefa">　</td><td>LightSkyBlue</td><td>淡蓝色</td><td>#87CEFA</td><td>135,206,250</td></tr><tr align="center"><td bgcolor="#87ceeb">　</td><td>SkyBlue</td><td>天蓝色</td><td>#87CEEB</td><td>135,206,235</td></tr><tr align="center"><td bgcolor="#00bfff">　</td><td>DeepSkyBlue</td><td>深天蓝</td><td>#00BFFF</td><td>0,191,255</td></tr><tr align="center"><td bgcolor="#add8e6">　</td><td>LightBLue</td><td>淡蓝</td><td>#ADD8E6</td><td>173,216,230</td></tr><tr align="center"><td bgcolor="#b0e0e6">　</td><td>PowDerBlue</td><td>火药蓝</td><td>#B0E0E6</td><td>176,224,230</td></tr><tr align="center"><td bgcolor="#5f9ea0">　</td><td>CadetBlue</td><td>军校蓝</td><td>#5F9EA0</td><td>95,158,160</td></tr><tr align="center"><td bgcolor="#f0ffff">　</td><td>Azure</td><td>蔚蓝色</td><td>#F0FFFF</td><td>240,255,255</td></tr><tr align="center"><td bgcolor="#e1ffff">　</td><td>LightCyan</td><td>淡青色</td><td>#E1FFFF</td><td>225,255,255</td></tr><tr align="center"><td bgcolor="#afeeee">　</td><td>PaleTurquoise</td><td>苍白的绿宝石</td><td>#AFEEEE</td><td>175,238,238</td></tr><tr align="center"><td bgcolor="#00ffff">　</td><td>Cyan</td><td>青色</td><td>#00FFFF</td><td>0,255,255</td></tr><tr align="center"><td bgcolor="#00ffff">　</td><td>Aqua</td><td>水绿色</td><td>#00FFFF</td><td>0,255,255</td></tr><tr align="center"><td bgcolor="#00ced1">　</td><td>DarkTurquoise</td><td>深绿宝石</td><td>#00CED1</td><td>0,206,209</td></tr><tr align="center"><td bgcolor="#2f4f4f">　</td><td>DarkSlateGray</td><td>深石板灰</td><td>#2F4F4F</td><td>47,79,79</td></tr><tr align="center"><td bgcolor="#008b8b">　</td><td>DarkCyan</td><td>深青色</td><td>#008B8B</td><td>0,139,139</td></tr><tr align="center"><td bgcolor="#008080">　</td><td>Teal</td><td>水鸭色</td><td>#008080</td><td>0,128,128</td></tr><tr align="center"><td bgcolor="#48d1cc">　</td><td>MediumTurquoise</td><td>适中的绿宝石</td><td>#48D1CC</td><td>72,209,204</td></tr><tr align="center"><td bgcolor="#20b2aa">　</td><td>LightSeaGreen</td><td>浅海洋绿</td><td>#20B2AA</td><td>32,178,170</td></tr><tr align="center"><td bgcolor="#40e0d0">　</td><td>Turquoise</td><td>绿宝石</td><td>#40E0D0</td><td>64,224,208</td></tr><tr align="center"><td bgcolor="#7fffaa">　</td><td>Auqamarin</td><td>绿玉\碧绿色</td><td>#7FFFAA</td><td>127,255,170</td></tr><tr align="center"><td bgcolor="#00fa9a">　</td><td>MediumAquamarine</td><td>适中的碧绿色</td><td>#00FA9A</td><td>0,250,154</td></tr><tr align="center"><td bgcolor="#00ff7f">　</td><td>MediumSpringGreen</td><td>适中的春天的绿色</td><td>#00FF7F</td><td>0,255,127</td></tr><tr align="center"><td bgcolor="#f5fffa">　</td><td>MintCream</td><td>薄荷奶油</td><td>#F5FFFA</td><td>245,255,250</td></tr><tr align="center"><td bgcolor="#3cb371">　</td><td>SpringGreen</td><td>春天的绿色</td><td>#3CB371</td><td>60,179,113</td></tr><tr align="center"><td bgcolor="#2e8b57">　</td><td>SeaGreen</td><td>海洋绿</td><td>#2E8B57</td><td>46,139,87</td></tr><tr align="center"><td bgcolor="#f0fff0">　</td><td>Honeydew</td><td>蜂蜜</td><td>#F0FFF0</td><td>240,255,240</td></tr><tr align="center"><td bgcolor="#90ee90">　</td><td>LightGreen</td><td>淡绿色</td><td>#90EE90</td><td>144,238,144</td></tr><tr align="center"><td bgcolor="#98fb98">　</td><td>PaleGreen</td><td>苍白的绿色</td><td>#98FB98</td><td>152,251,152</td></tr><tr align="center"><td bgcolor="#8fbc8f">　</td><td>DarkSeaGreen</td><td>深海洋绿</td><td>#8FBC8F</td><td>143,188,143</td></tr><tr align="center"><td bgcolor="#32cd32">　</td><td>LimeGreen</td><td>酸橙绿</td><td>#32CD32</td><td>50,205,50</td></tr><tr align="center"><td bgcolor="#00ff00">　</td><td>Lime</td><td>酸橙色</td><td>#00FF00</td><td>0,255,0</td></tr><tr align="center"><td bgcolor="#228b22">　</td><td>ForestGreen</td><td>森林绿</td><td>#228B22</td><td>34,139,34</td></tr><tr align="center"><td bgcolor="#008000">　</td><td>Green</td><td>纯绿</td><td>#008000</td><td>0,128,0</td></tr><tr align="center"><td bgcolor="#006400">　</td><td>DarkGreen</td><td>深绿色</td><td>#006400</td><td>0,100,0</td></tr><tr align="center"><td bgcolor="#7fff00">　</td><td>Chartreuse</td><td>查特酒绿</td><td>#7FFF00</td><td>127,255,0</td></tr><tr align="center"><td bgcolor="#7cfc00">　</td><td>LawnGreen</td><td>草坪绿</td><td>#7CFC00</td><td>124,252,0</td></tr><tr align="center"><td bgcolor="#adff2f">　</td><td>GreenYellow</td><td>绿黄色</td><td>#ADFF2F</td><td>173,255,47</td></tr><tr align="center"><td bgcolor="#556b2f">　</td><td>OliveDrab</td><td>橄榄土褐色</td><td>#556B2F</td><td>85,107,47</td></tr><tr align="center"><td bgcolor="#f5f5dc">　</td><td>Beige</td><td>米色(浅褐色)</td><td>#F5F5DC</td><td>245,245,220</td></tr><tr align="center"><td bgcolor="#fafad2">　</td><td>LightGoldenrodYellow</td><td>浅秋麒麟黄</td><td>#FAFAD2</td><td>250,250,210</td></tr><tr align="center"><td bgcolor="#fffff0">　</td><td>Ivory</td><td>象牙</td><td>#FFFFF0</td><td>255,255,240</td></tr><tr align="center"><td bgcolor="#ffffe0">　</td><td>LightYellow</td><td>浅黄色</td><td>#FFFFE0</td><td>255,255,224</td></tr><tr align="center"><td bgcolor="#ffff00">　</td><td>Yellow</td><td>纯黄</td><td>#FFFF00</td><td>255,255,0</td></tr><tr align="center"><td bgcolor="#808000">　</td><td>Olive</td><td>橄榄</td><td>#808000</td><td>128,128,0</td></tr><tr align="center"><td bgcolor="#bdb76b">　</td><td>DarkKhaki</td><td>深卡其布</td><td>#BDB76B</td><td>189,183,107</td></tr><tr align="center"><td bgcolor="#fffacd">　</td><td>LemonChiffon</td><td>柠檬薄纱</td><td>#FFFACD</td><td>255,250,205</td></tr><tr align="center"><td bgcolor="#eee8aa">　</td><td>PaleGodenrod</td><td>灰秋麒麟</td><td>#EEE8AA</td><td>238,232,170</td></tr><tr align="center"><td bgcolor="#f0e68c">　</td><td>Khaki</td><td>卡其布</td><td>#F0E68C</td><td>240,230,140</td></tr><tr align="center"><td bgcolor="#ffd700">　</td><td>Gold</td><td>金</td><td>#FFD700</td><td>255,215,0</td></tr><tr align="center"><td bgcolor="#fff8dc">　</td><td>Cornislk</td><td>玉米色</td><td>#FFF8DC</td><td>255,248,220</td></tr><tr align="center"><td bgcolor="#daa520">　</td><td>GoldEnrod</td><td>秋麒麟</td><td>#DAA520</td><td>218,165,32</td></tr><tr align="center"><td bgcolor="#fffaf0">　</td><td>FloralWhite</td><td>花的白色</td><td>#FFFAF0</td><td>255,250,240</td></tr><tr align="center"><td bgcolor="#fdf5e6">　</td><td>OldLace</td><td>老饰带</td><td>#FDF5E6</td><td>253,245,230</td></tr><tr align="center"><td bgcolor="#f5deb3">　</td><td>Wheat</td><td>小麦色</td><td>#F5DEB3</td><td>245,222,179</td></tr><tr align="center"><td bgcolor="#ffe4b5">　</td><td>Moccasin</td><td>鹿皮鞋</td><td>#FFE4B5</td><td>255,228,181</td></tr><tr align="center"><td bgcolor="#ffa500">　</td><td>Orange</td><td>橙色</td><td>#FFA500</td><td>255,165,0</td></tr><tr align="center"><td bgcolor="#ffefd5">　</td><td>PapayaWhip</td><td>番木瓜</td><td>#FFEFD5</td><td>255,239,213</td></tr><tr align="center"><td bgcolor="#ffebcd">　</td><td>BlanchedAlmond</td><td>漂白的杏仁</td><td>#FFEBCD</td><td>255,235,205</td></tr><tr align="center"><td bgcolor="#ffdead">　</td><td>NavajoWhite</td><td>纳瓦霍白</td><td>#FFDEAD</td><td>255,222,173</td></tr><tr align="center"><td bgcolor="#faebd7">　</td><td>AntiqueWhite</td><td>古代的白色</td><td>#FAEBD7</td><td>250,235,215</td></tr><tr align="center"><td bgcolor="#d2b48c">　</td><td>Tan</td><td>晒黑</td><td>#D2B48C</td><td>210,180,140</td></tr><tr align="center"><td bgcolor="#deb887">　</td><td>BrulyWood</td><td>结实的树</td><td>#DEB887</td><td>222,184,135</td></tr><tr align="center"><td bgcolor="#ffe4c4">　</td><td>Bisque</td><td>(浓汤)乳脂,番茄等</td><td>#FFE4C4</td><td>255,228,196</td></tr><tr align="center"><td bgcolor="#ff8c00">　</td><td>DarkOrange</td><td>深橙色</td><td>#FF8C00</td><td>255,140,0</td></tr><tr align="center"><td bgcolor="#faf0e6">　</td><td>Linen</td><td>亚麻布</td><td>#FAF0E6</td><td>250,240,230</td></tr><tr align="center"><td bgcolor="#cd853f">　</td><td>Peru</td><td>秘鲁</td><td>#CD853F</td><td>205,133,63</td></tr><tr align="center"><td bgcolor="#ffdab9">　</td><td>PeachPuff</td><td>桃色</td><td>#FFDAB9</td><td>255,218,185</td></tr><tr align="center"><td bgcolor="#f4a460">　</td><td>SandyBrown</td><td>沙棕色</td><td>#F4A460</td><td>244,164,96</td></tr><tr align="center"><td bgcolor="#d2691e">　</td><td>Chocolate</td><td>巧克力</td><td>#D2691E</td><td>210,105,30</td></tr><tr align="center"><td bgcolor="#8b4513">　</td><td>SaddleBrown</td><td>马鞍棕色</td><td>#8B4513</td><td>139,69,19</td></tr><tr align="center"><td bgcolor="#fff5ee">　</td><td>SeaShell</td><td>海贝壳</td><td>#FFF5EE</td><td>255,245,238</td></tr><tr align="center"><td bgcolor="#a0522d">　</td><td>Sienna</td><td>黄土赭色</td><td>#A0522D</td><td>160,82,45</td></tr><tr align="center"><td bgcolor="#ffa07a">　</td><td>LightSalmon</td><td>浅鲜肉(鲑鱼)色</td><td>#FFA07A</td><td>255,160,122</td></tr><tr align="center"><td bgcolor="#ff7f50">　</td><td>Coral</td><td>珊瑚</td><td>#FF7F50</td><td>255,127,80</td></tr><tr align="center"><td bgcolor="#ff4500">　</td><td>OrangeRed</td><td>橙红色</td><td>#FF4500</td><td>255,69,0</td></tr><tr align="center"><td bgcolor="#e9967a">　</td><td>DarkSalmon</td><td>深鲜肉(鲑鱼)色</td><td>#E9967A</td><td>233,150,122</td></tr><tr align="center"><td bgcolor="#ff6347">　</td><td>Tomato</td><td>番茄</td><td>#FF6347</td><td>255,99,71</td></tr><tr align="center"><td bgcolor="#ffe4e1">　</td><td>MistyRose</td><td>薄雾玫瑰</td><td>#FFE4E1</td><td>255,228,225</td></tr><tr align="center"><td bgcolor="#fa8072">　</td><td>Salmon</td><td>鲜肉(鲑鱼)色</td><td>#FA8072</td><td>250,128,114</td></tr><tr align="center"><td bgcolor="#fffafa">　</td><td>Snow</td><td>雪</td><td>#FFFAFA</td><td>255,250,250</td></tr><tr align="center"><td bgcolor="#f08080">　</td><td>LightCoral</td><td>淡珊瑚色</td><td>#F08080</td><td>240,128,128</td></tr><tr align="center"><td bgcolor="#bc8f8f">　</td><td>RosyBrown</td><td>玫瑰棕色</td><td>#BC8F8F</td><td>188,143,143</td></tr><tr align="center"><td bgcolor="#cd5c5c">　</td><td>IndianRed</td><td>印度红</td><td>#CD5C5C</td><td>205,92,92</td></tr><tr align="center"><td bgcolor="#ff0000">　</td><td>Red</td><td>纯红</td><td>#FF0000</td><td>255,0,0</td></tr><tr align="center"><td bgcolor="#a52a2a">　</td><td>Brown</td><td>棕色</td><td>#A52A2A</td><td>165,42,42</td></tr><tr align="center"><td bgcolor="#b22222">　</td><td>FireBrick</td><td>耐火砖</td><td>#B22222</td><td>178,34,34</td></tr><tr align="center"><td bgcolor="#8b0000">　</td><td>DarkRed</td><td>深红色</td><td>#8B0000</td><td>139,0,0</td></tr><tr align="center"><td bgcolor="#800000">　</td><td>Maroon</td><td>栗色</td><td>#800000</td><td>128,0,0</td></tr><tr align="center"><td bgcolor="#ffffff">　</td><td>White</td><td>纯白</td><td>#FFFFFF</td><td>255,255,255</td></tr><tr align="center"><td bgcolor="#f5f5f5">　</td><td>WhiteSmoke</td><td>白烟</td><td>#F5F5F5</td><td>245,245,245</td></tr><tr align="center"><td bgcolor="#dcdcdc">　</td><td>Gainsboro</td><td>亮灰色</td><td>#DCDCDC</td><td>220,220,220</td></tr><tr align="center"><td bgcolor="#d3d3d3">　</td><td>LightGrey</td><td>浅灰色</td><td>#D3D3D3</td><td>211,211,211</td></tr><tr align="center"><td bgcolor="#c0c0c0">　</td><td>Silver</td><td>银白色</td><td>#C0C0C0</td><td>192,192,192</td></tr><tr align="center"><td bgcolor="#a9a9a9">　</td><td>DarkGray</td><td>深灰色</td><td>#A9A9A9</td><td>169,169,169</td></tr><tr align="center"><td bgcolor="#808080">　</td><td>Gray</td><td>灰色</td><td>#808080</td><td>128,128,128</td></tr><tr align="center"><td bgcolor="#696969">　</td><td>DimGray</td><td>暗淡的灰色</td><td>#696969</td><td>105,105,105</td></tr><tr align="center"><td bgcolor="#000000">　</td><td>Black</td><td>纯黑</td><td>#000000</td><td>0,0,0</td></tr></table><h2 id="颜色细分"><a href="#颜色细分" class="headerlink" title="颜色细分"></a>颜色细分</h2><table><tr><td><table style="height: 1560px; width: 161px;" border="0" cellspacing="2" cellpadding="2"><tbody><tr><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #ffffff; color: #000000;"><strong>16位进制代码</strong></span></td><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #ffffff; color: #000000;"><strong>颜色效果</strong></span></td></tr><tr><td style="text-align: center;">&nbsp;</td><td style="text-align: center;">&nbsp;</td></tr><tr><td style="text-align: center;">#FFFFFF</td><td style="text-align: center;" bgcolor="#ffffff">&nbsp;</td></tr><tr><td style="text-align: center;">#FFFFCC</td><td style="text-align: center;" bgcolor="#ffffcc">&nbsp;</td></tr><tr><td style="text-align: center;">#FFFF99</td><td style="text-align: center;" bgcolor="#ffff99">&nbsp;</td></tr><tr><td style="text-align: center;">#FFFF66</td><td style="text-align: center;" bgcolor="#ffff66">&nbsp;</td></tr><tr><td style="text-align: center;">#FFFF33</td><td style="text-align: center;" bgcolor="#ffff33">&nbsp;</td></tr><tr><td style="text-align: center;">#FFFF00</td><td style="text-align: center;" bgcolor="#ffff00">&nbsp;</td></tr><tr><td style="text-align: center;">#FFCCFF</td><td style="text-align: center;" bgcolor="#ffccff">&nbsp;</td></tr><tr><td style="text-align: center;">#FFCCCC</td><td style="text-align: center;" bgcolor="#ffcccc">&nbsp;</td></tr><tr><td style="text-align: center;">#FFCC99</td><td style="text-align: center;" bgcolor="#ffcc99">&nbsp;</td></tr><tr><td style="text-align: center;">#FFCC66</td><td style="text-align: center;" bgcolor="#ffcc66">&nbsp;</td></tr><tr><td style="text-align: center;">#FFCC33</td><td style="text-align: center;" bgcolor="#ffcc33">&nbsp;</td></tr><tr><td style="text-align: center;">#FFCC00</td><td style="text-align: center;" bgcolor="#ffcc00">&nbsp;</td></tr><tr><td style="text-align: center;">#FF99FF</td><td style="text-align: center;" bgcolor="#ff99ff">&nbsp;</td></tr><tr><td style="text-align: center;">#FF99CC</td><td style="text-align: center;" bgcolor="#ff99cc">&nbsp;</td></tr><tr><td style="text-align: center;">#FF9999</td><td style="text-align: center;" bgcolor="#ff9999">&nbsp;</td></tr><tr><td style="text-align: center;">#FF9966</td><td style="text-align: center;" bgcolor="#ff9966">&nbsp;</td></tr><tr><td style="text-align: center;">#FF9933</td><td style="text-align: center;" bgcolor="#ff9933">&nbsp;</td></tr><tr><td style="text-align: center;">#FF9900</td><td style="text-align: center;" bgcolor="#ff9900">&nbsp;</td></tr><tr><td style="text-align: center;">#FF66FF</td><td style="text-align: center;" bgcolor="#ff66ff">&nbsp;</td></tr><tr><td style="text-align: center;">#FF66CC</td><td style="text-align: center;" bgcolor="#ff66cc">&nbsp;</td></tr><tr><td style="text-align: center;">#FF6699</td><td style="text-align: center;" bgcolor="#ff6699">&nbsp;</td></tr><tr><td style="text-align: center;">#FF6666</td><td style="text-align: center;" bgcolor="#ff6666">&nbsp;</td></tr><tr><td style="text-align: center;">#FF6633</td><td style="text-align: center;" bgcolor="#ff6633">&nbsp;</td></tr><tr><td style="text-align: center;">#FF6600</td><td style="text-align: center;" bgcolor="#ff6600">&nbsp;</td></tr><tr><td style="text-align: center;">#FF33FF</td><td style="text-align: center;" bgcolor="#ff33ff">&nbsp;</td></tr><tr><td style="text-align: center;">#FF33CC</td><td style="text-align: center;" bgcolor="#ff33cc">&nbsp;</td></tr><tr><td style="text-align: center;">#FF3399</td><td style="text-align: center;" bgcolor="#ff3399">&nbsp;</td></tr><tr><td style="text-align: center;">#FF3366</td><td style="text-align: center;" bgcolor="#ff3366">&nbsp;</td></tr><tr><td style="text-align: center;">#FF3333</td><td style="text-align: center;" bgcolor="#ff3333">&nbsp;</td></tr><tr><td style="text-align: center;">#FF3300</td><td style="text-align: center;" bgcolor="#ff3300">&nbsp;</td></tr><tr><td style="text-align: center;">#FF00FF</td><td style="text-align: center;" bgcolor="#ff00ff">&nbsp;</td></tr><tr><td style="text-align: center;">#FF00CC</td><td style="text-align: center;" bgcolor="#ff00cc">&nbsp;</td></tr><tr><td style="text-align: center;">#FF0099</td><td style="text-align: center;" bgcolor="#ff0099">&nbsp;</td></tr><tr><td style="text-align: center;">#FF0066</td><td style="text-align: center;" bgcolor="#ff0066">&nbsp;</td></tr><tr><td style="text-align: center;">#FF0033</td><td style="text-align: center;" bgcolor="#ff0033">&nbsp;</td></tr><tr><td style="text-align: center;">#FF0000</td><td style="text-align: center;" bgcolor="#ff0000">&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #c0c0c0;"><strong>Hex Code</strong></span></td><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #c0c0c0;"><strong>Color</strong></span></td></tr><tr><td style="text-align: center;">#66FFFF</td><td style="text-align: center;" bgcolor="#66ffff">&nbsp;</td></tr><tr><td style="text-align: center;">#66FFCC</td><td style="text-align: center;" bgcolor="#66ffcc">&nbsp;</td></tr><tr><td style="text-align: center;">#66FF99</td><td style="text-align: center;" bgcolor="#66ff99">&nbsp;</td></tr><tr><td style="text-align: center;">#66FF66</td><td style="text-align: center;" bgcolor="#66ff66">&nbsp;</td></tr><tr><td style="text-align: center;">#66FF33</td><td style="text-align: center;" bgcolor="#66ff33">&nbsp;</td></tr><tr><td style="text-align: center;">#66FF00</td><td style="text-align: center;" bgcolor="#66ff00">&nbsp;</td></tr><tr><td style="text-align: center;">#66CCFF</td><td style="text-align: center;" bgcolor="#66ccff">&nbsp;</td></tr><tr><td style="text-align: center;">#66CCCC</td><td style="text-align: center;" bgcolor="#66cccc">&nbsp;</td></tr><tr><td style="text-align: center;">#66CC99</td><td style="text-align: center;" bgcolor="#66cc99">&nbsp;</td></tr><tr><td style="text-align: center;">#66CC66</td><td style="text-align: center;" bgcolor="#66cc66">&nbsp;</td></tr><tr><td style="text-align: center;">#66CC33</td><td style="text-align: center;" bgcolor="#66cc33">&nbsp;</td></tr><tr><td style="text-align: center;">#66CC00</td><td style="text-align: center;" bgcolor="#66cc00">&nbsp;</td></tr><tr><td style="text-align: center;">#6699FF</td><td style="text-align: center;" bgcolor="#6699ff">&nbsp;</td></tr><tr><td style="text-align: center;">#6699CC</td><td style="text-align: center;" bgcolor="#6699cc">&nbsp;</td></tr><tr><td style="text-align: center;">#669999</td><td style="text-align: center;" bgcolor="#669999">&nbsp;</td></tr><tr><td style="text-align: center;">#669966</td><td style="text-align: center;" bgcolor="#669966">&nbsp;</td></tr><tr><td style="text-align: center;">#669933</td><td style="text-align: center;" bgcolor="#669933">&nbsp;</td></tr><tr><td style="text-align: center;">#669900</td><td style="text-align: center;" bgcolor="#669900">&nbsp;</td></tr><tr><td style="text-align: center;">#6666FF</td><td style="text-align: center;" bgcolor="#6666ff">&nbsp;</td></tr><tr><td style="text-align: center;">#6666CC</td><td style="text-align: center;" bgcolor="#6666cc">&nbsp;</td></tr><tr><td style="text-align: center;">#666699</td><td style="text-align: center;" bgcolor="#666699">&nbsp;</td></tr><tr><td style="text-align: center;">#666666</td><td style="text-align: center;" bgcolor="#666666">&nbsp;</td></tr><tr><td style="text-align: center;">#666633</td><td style="text-align: center;" bgcolor="#666633">&nbsp;</td></tr><tr><td style="text-align: center;">#666600</td><td style="text-align: center;" bgcolor="#666600">&nbsp;</td></tr><tr><td style="text-align: center;">#6633FF</td><td style="text-align: center;" bgcolor="#6633ff">&nbsp;</td></tr><tr><td style="text-align: center;">#6633CC</td><td style="text-align: center;" bgcolor="#6633cc">&nbsp;</td></tr><tr><td style="text-align: center;">#663399</td><td style="text-align: center;" bgcolor="#663399">&nbsp;</td></tr><tr><td style="text-align: center;">#663366</td><td style="text-align: center;" bgcolor="#663366">&nbsp;</td></tr><tr><td style="text-align: center;">#663333</td><td style="text-align: center;" bgcolor="#663333">&nbsp;</td></tr><tr><td style="text-align: center;">#663300</td><td style="text-align: center;" bgcolor="#663300">&nbsp;</td></tr><tr><td style="text-align: center;">#6600FF</td><td style="text-align: center;" bgcolor="#6600ff">&nbsp;</td></tr><tr><td style="text-align: center;">#6600CC</td><td style="text-align: center;" bgcolor="#6600cc">&nbsp;</td></tr><tr><td style="text-align: center;">#660099</td><td style="text-align: center;" bgcolor="#660099">&nbsp;</td></tr><tr><td style="text-align: center;">#660066</td><td style="text-align: center;" bgcolor="#660066">&nbsp;</td></tr><tr><td style="text-align: center;">#660033</td><td style="text-align: center;" bgcolor="#660033">&nbsp;</td></tr><tr><td style="text-align: center;">#660000</td><td style="text-align: center;" bgcolor="#660000">&nbsp;</td></tr></tbody></table><p>&nbsp;</p></td><td>&nbsp;</td><td valign="top"><table style="height: 1491px; width: 169px;" border="0" cellspacing="2" cellpadding="2"><tbody><tr><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #ffffff; color: #000000;"><strong>16位进制代码</strong></span></td><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #ffffff; color: #000000;"><strong>颜色效果</strong></span></td></tr><tr><td style="text-align: center;">&nbsp;</td><td style="text-align: center;">&nbsp;</td></tr><tr><td style="text-align: center;">#CCFFFF</td><td style="text-align: center;" bgcolor="#ccffff">&nbsp;</td></tr><tr><td style="text-align: center;">#CCFFCC</td><td style="text-align: center;" bgcolor="#ccffcc">&nbsp;</td></tr><tr><td style="text-align: center;">#CCFF99</td><td style="text-align: center;" bgcolor="#ccff99">&nbsp;</td></tr><tr><td style="text-align: center;">#CCFF66</td><td style="text-align: center;" bgcolor="#ccff66">&nbsp;</td></tr><tr><td style="text-align: center;">#CCFF33</td><td style="text-align: center;" bgcolor="#ccff33">&nbsp;</td></tr><tr><td style="text-align: center;">#CCFF00</td><td style="text-align: center;" bgcolor="#ccff00">&nbsp;</td></tr><tr><td style="text-align: center;">#CCCCFF</td><td style="text-align: center;" bgcolor="#ccccff">&nbsp;</td></tr><tr><td style="text-align: center;">#CCCCCC</td><td style="text-align: center;" bgcolor="#cccccc">&nbsp;</td></tr><tr><td style="text-align: center;">#CCCC99</td><td style="text-align: center;" bgcolor="#cccc99">&nbsp;</td></tr><tr><td style="text-align: center;">#CCCC66</td><td style="text-align: center;" bgcolor="#cccc66">&nbsp;</td></tr><tr><td style="text-align: center;">#CCCC33</td><td style="text-align: center;" bgcolor="#cccc33">&nbsp;</td></tr><tr><td style="text-align: center;">#CCCC00</td><td style="text-align: center;" bgcolor="#cccc00">&nbsp;</td></tr><tr><td style="text-align: center;">#CC99FF</td><td style="text-align: center;" bgcolor="#cc99ff">&nbsp;</td></tr><tr><td style="text-align: center;">#CC99CC</td><td style="text-align: center;" bgcolor="#cc99cc">&nbsp;</td></tr><tr><td style="text-align: center;">#CC9999</td><td style="text-align: center;" bgcolor="#cc9999">&nbsp;</td></tr><tr><td style="text-align: center;">#CC9966</td><td style="text-align: center;" bgcolor="#cc9966">&nbsp;</td></tr><tr><td style="text-align: center;">#CC9933</td><td style="text-align: center;" bgcolor="#cc9933">&nbsp;</td></tr><tr><td style="text-align: center;">#CC9900</td><td style="text-align: center;" bgcolor="#cc9900">&nbsp;</td></tr><tr><td style="text-align: center;">#CC66FF</td><td style="text-align: center;" bgcolor="#cc66ff">&nbsp;</td></tr><tr><td style="text-align: center;">#CC66CC</td><td style="text-align: center;" bgcolor="#cc66cc">&nbsp;</td></tr><tr><td style="text-align: center;">#CC6699</td><td style="text-align: center;" bgcolor="#cc6699">&nbsp;</td></tr><tr><td style="text-align: center;">#CC6666</td><td style="text-align: center;" bgcolor="#cc6666">&nbsp;</td></tr><tr><td style="text-align: center;">#CC6633</td><td style="text-align: center;" bgcolor="#cc6633">&nbsp;</td></tr><tr><td style="text-align: center;">#CC6600</td><td style="text-align: center;" bgcolor="#cc6600">&nbsp;</td></tr><tr><td style="text-align: center;">#CC33FF</td><td style="text-align: center;" bgcolor="#cc33ff">&nbsp;</td></tr><tr><td style="text-align: center;">#CC33CC</td><td style="text-align: center;" bgcolor="#cc33cc">&nbsp;</td></tr><tr><td style="text-align: center;">#CC3399</td><td style="text-align: center;" bgcolor="#cc3399">&nbsp;</td></tr><tr><td style="text-align: center;">#CC3366</td><td style="text-align: center;" bgcolor="#cc3366">&nbsp;</td></tr><tr><td style="text-align: center;">#CC3333</td><td style="text-align: center;" bgcolor="#cc3333">&nbsp;</td></tr><tr><td style="text-align: center;">#CC3300</td><td style="text-align: center;" bgcolor="#cc3300">&nbsp;</td></tr><tr><td style="text-align: center;">#CC00FF</td><td style="text-align: center;" bgcolor="#cc00ff">&nbsp;</td></tr><tr><td style="text-align: center;">#CC00CC</td><td style="text-align: center;" bgcolor="#cc00cc">&nbsp;</td></tr><tr><td style="text-align: center;">#CC0099</td><td style="text-align: center;" bgcolor="#cc0099">&nbsp;</td></tr><tr><td style="text-align: center;">#CC0066</td><td style="text-align: center;" bgcolor="#cc0066">&nbsp;</td></tr><tr><td style="text-align: center;">#CC0033</td><td style="text-align: center;" bgcolor="#cc0033">&nbsp;</td></tr><tr><td style="text-align: center;">#CC0000</td><td style="text-align: center;" bgcolor="#cc0000">&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td bgcolor="#336699"><span style="background-color: #c0c0c0;"><strong>Hex Code</strong></span></td><td bgcolor="#336699"><span style="background-color: #c0c0c0;"><strong>Color</strong></span></td></tr><tr><td style="text-align: center;">#33FFFF</td><td style="text-align: center;" bgcolor="#33ffff">&nbsp;</td></tr><tr><td style="text-align: center;">#33FFCC</td><td style="text-align: center;" bgcolor="#33ffcc">&nbsp;</td></tr><tr><td style="text-align: center;">#33FF99</td><td style="text-align: center;" bgcolor="#33ff99">&nbsp;</td></tr><tr><td style="text-align: center;">#33FF66</td><td style="text-align: center;" bgcolor="#33ff66">&nbsp;</td></tr><tr><td style="text-align: center;">#33FF33</td><td style="text-align: center;" bgcolor="#33ff33">&nbsp;</td></tr><tr><td style="text-align: center;">#33FF00</td><td style="text-align: center;" bgcolor="#33ff00">&nbsp;</td></tr><tr><td style="text-align: center;">#33CCFF</td><td style="text-align: center;" bgcolor="#33ccff">&nbsp;</td></tr><tr><td style="text-align: center;">#33CCCC</td><td style="text-align: center;" bgcolor="#33cccc">&nbsp;</td></tr><tr><td style="text-align: center;">#33CC99</td><td style="text-align: center;" bgcolor="#33cc99">&nbsp;</td></tr><tr><td style="text-align: center;">#33CC66</td><td style="text-align: center;" bgcolor="#33cc66">&nbsp;</td></tr><tr><td style="text-align: center;">#33CC33</td><td style="text-align: center;" bgcolor="#33cc33">&nbsp;</td></tr><tr><td style="text-align: center;">#33CC00</td><td style="text-align: center;" bgcolor="#33cc00">&nbsp;</td></tr><tr><td style="text-align: center;">#3399FF</td><td style="text-align: center;" bgcolor="#3399ff">&nbsp;</td></tr><tr><td style="text-align: center;">#3399CC</td><td style="text-align: center;" bgcolor="#3399cc">&nbsp;</td></tr><tr><td style="text-align: center;">#339999</td><td style="text-align: center;" bgcolor="#339999">&nbsp;</td></tr><tr><td style="text-align: center;">#339966</td><td style="text-align: center;" bgcolor="#339966">&nbsp;</td></tr><tr><td style="text-align: center;">#339933</td><td style="text-align: center;" bgcolor="#339933">&nbsp;</td></tr><tr><td style="text-align: center;">#339900</td><td style="text-align: center;" bgcolor="#339900">&nbsp;</td></tr><tr><td style="text-align: center;">#3366FF</td><td style="text-align: center;" bgcolor="#3366ff">&nbsp;</td></tr><tr><td style="text-align: center;">#3366CC</td><td style="text-align: center;" bgcolor="#3366cc">&nbsp;</td></tr><tr><td style="text-align: center;">#336699</td><td style="text-align: center;" bgcolor="#336699">&nbsp;</td></tr><tr><td style="text-align: center;">#336666</td><td style="text-align: center;" bgcolor="#336666">&nbsp;</td></tr><tr><td style="text-align: center;">#336633</td><td style="text-align: center;" bgcolor="#336633">&nbsp;</td></tr><tr><td style="text-align: center;">#336600</td><td style="text-align: center;" bgcolor="#336600">&nbsp;</td></tr><tr><td style="text-align: center;">#3333FF</td><td style="text-align: center;" bgcolor="#3333ff">&nbsp;</td></tr><tr><td style="text-align: center;">#3333CC</td><td style="text-align: center;" bgcolor="#3333cc">&nbsp;</td></tr><tr><td style="text-align: center;">#333399</td><td style="text-align: center;" bgcolor="#333399">&nbsp;</td></tr><tr><td style="text-align: center;">#333366</td><td style="text-align: center;" bgcolor="#333366">&nbsp;</td></tr><tr><td style="text-align: center;">#333333</td><td style="text-align: center;" bgcolor="#333333">&nbsp;</td></tr><tr><td style="text-align: center;">#333300</td><td style="text-align: center;" bgcolor="#333300">&nbsp;</td></tr><tr><td style="text-align: center;">#3300FF</td><td style="text-align: center;" bgcolor="#3300ff">&nbsp;</td></tr><tr><td style="text-align: center;">#3300CC</td><td style="text-align: center;" bgcolor="#3300cc">&nbsp;</td></tr><tr><td style="text-align: center;">#330099</td><td style="text-align: center;" bgcolor="#330099">&nbsp;</td></tr><tr><td style="text-align: center;">#330066</td><td style="text-align: center;" bgcolor="#330066">&nbsp;</td></tr><tr><td style="text-align: center;">#330033</td><td style="text-align: center;" bgcolor="#330033">&nbsp;</td></tr><tr><td style="text-align: center;">#330000</td><td style="text-align: center;" bgcolor="#330000">&nbsp;</td></tr></tbody></table></td><td>&nbsp;</td><td valign="top"><table style="height: 1491px; width: 169px;" border="0" cellspacing="2" cellpadding="2"><tbody><tr><td bgcolor="#336699"><span style="background-color: #ffffff; color: #000000;"><strong>16位进制代码</strong></span></td><td bgcolor="#336699"><span style="background-color: #ffffff; color: #000000;"><strong>颜色效果</strong></span></td></tr><tr><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td style="text-align: center;">#99FFFF</td><td style="text-align: center;" bgcolor="#99ffff">&nbsp;</td></tr><tr><td style="text-align: center;">#99FFCC</td><td style="text-align: center;" bgcolor="#99ffcc">&nbsp;</td></tr><tr><td style="text-align: center;">#99FF99</td><td style="text-align: center;" bgcolor="#99ff99">&nbsp;</td></tr><tr><td style="text-align: center;">#99FF66</td><td style="text-align: center;" bgcolor="#99ff66">&nbsp;</td></tr><tr><td style="text-align: center;">#99FF33</td><td style="text-align: center;" bgcolor="#99ff33">&nbsp;</td></tr><tr><td style="text-align: center;">#99FF00</td><td style="text-align: center;" bgcolor="#99ff00">&nbsp;</td></tr><tr><td style="text-align: center;">#99CCFF</td><td style="text-align: center;" bgcolor="#99ccff">&nbsp;</td></tr><tr><td style="text-align: center;">#99CCCC</td><td style="text-align: center;" bgcolor="#99cccc">&nbsp;</td></tr><tr><td style="text-align: center;">#99CC99</td><td style="text-align: center;" bgcolor="#99cc99">&nbsp;</td></tr><tr><td style="text-align: center;">#99CC66</td><td style="text-align: center;" bgcolor="#99cc66">&nbsp;</td></tr><tr><td style="text-align: center;">#99CC33</td><td style="text-align: center;" bgcolor="#99cc33">&nbsp;</td></tr><tr><td style="text-align: center;">#99CC00</td><td style="text-align: center;" bgcolor="#99cc00">&nbsp;</td></tr><tr><td style="text-align: center;">#9999FF</td><td style="text-align: center;" bgcolor="#9999ff">&nbsp;</td></tr><tr><td style="text-align: center;">#9999CC</td><td style="text-align: center;" bgcolor="#9999cc">&nbsp;</td></tr><tr><td style="text-align: center;">#999999</td><td style="text-align: center;" bgcolor="#999999">&nbsp;</td></tr><tr><td style="text-align: center;">#999966</td><td style="text-align: center;" bgcolor="#999966">&nbsp;</td></tr><tr><td style="text-align: center;">#999933</td><td style="text-align: center;" bgcolor="#999933">&nbsp;</td></tr><tr><td style="text-align: center;">#999900</td><td style="text-align: center;" bgcolor="#999900">&nbsp;</td></tr><tr><td style="text-align: center;">#9966FF</td><td style="text-align: center;" bgcolor="#9966ff">&nbsp;</td></tr><tr><td style="text-align: center;">#9966CC</td><td style="text-align: center;" bgcolor="#9966cc">&nbsp;</td></tr><tr><td style="text-align: center;">#996699</td><td style="text-align: center;" bgcolor="#996699">&nbsp;</td></tr><tr><td style="text-align: center;">#996666</td><td style="text-align: center;" bgcolor="#996666">&nbsp;</td></tr><tr><td style="text-align: center;">#996633</td><td style="text-align: center;" bgcolor="#996633">&nbsp;</td></tr><tr><td style="text-align: center;">#996600</td><td style="text-align: center;" bgcolor="#996600">&nbsp;</td></tr><tr><td style="text-align: center;">#9933FF</td><td style="text-align: center;" bgcolor="#9933ff">&nbsp;</td></tr><tr><td style="text-align: center;">#9933CC</td><td style="text-align: center;" bgcolor="#9933cc">&nbsp;</td></tr><tr><td style="text-align: center;">#993399</td><td style="text-align: center;" bgcolor="#993399">&nbsp;</td></tr><tr><td style="text-align: center;">#993366</td><td style="text-align: center;" bgcolor="#993366">&nbsp;</td></tr><tr><td style="text-align: center;">#993333</td><td style="text-align: center;" bgcolor="#993333">&nbsp;</td></tr><tr><td style="text-align: center;">#993300</td><td style="text-align: center;" bgcolor="#993300">&nbsp;</td></tr><tr><td style="text-align: center;">#9900FF</td><td style="text-align: center;" bgcolor="#9900ff">&nbsp;</td></tr><tr><td style="text-align: center;">#9900CC</td><td style="text-align: center;" bgcolor="#9900cc">&nbsp;</td></tr><tr><td style="text-align: center;">#990099</td><td style="text-align: center;" bgcolor="#990099">&nbsp;</td></tr><tr><td style="text-align: center;">#990066</td><td style="text-align: center;" bgcolor="#990066">&nbsp;</td></tr><tr><td style="text-align: center;">#990033</td><td style="text-align: center;" bgcolor="#990033">&nbsp;</td></tr><tr><td style="text-align: center;">#990000</td><td style="text-align: center;" bgcolor="#990000">&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td style="text-align: center;" bgcolor="#336699"><span style="background-color: #c0c0c0;"><strong>Hex Code</strong></span></td><td bgcolor="#336699"><span style="background-color: #c0c0c0;"><strong>Color</strong></span></td></tr><tr><td style="text-align: center;">#00FFFF</td><td bgcolor="#00ffff">&nbsp;</td></tr><tr><td style="text-align: center;">#00FFCC</td><td bgcolor="#00ffcc">&nbsp;</td></tr><tr><td style="text-align: center;">#00FF99</td><td bgcolor="#00ff99">&nbsp;</td></tr><tr><td style="text-align: center;">#00FF66</td><td bgcolor="#00ff66">&nbsp;</td></tr><tr><td style="text-align: center;">#00FF33</td><td bgcolor="#00ff33">&nbsp;</td></tr><tr><td style="text-align: center;">#00FF00</td><td bgcolor="#00ff00">&nbsp;</td></tr><tr><td style="text-align: center;">#00CCFF</td><td bgcolor="#00ccff">&nbsp;</td></tr><tr><td style="text-align: center;">#00CCCC</td><td bgcolor="#00cccc">&nbsp;</td></tr><tr><td style="text-align: center;">#00CC99</td><td bgcolor="#00cc99">&nbsp;</td></tr><tr><td style="text-align: center;">#00CC66</td><td bgcolor="#00cc66">&nbsp;</td></tr><tr><td style="text-align: center;">#00CC33</td><td bgcolor="#00cc33">&nbsp;</td></tr><tr><td style="text-align: center;">#00CC00</td><td bgcolor="#00cc00">&nbsp;</td></tr><tr><td style="text-align: center;">#0099FF</td><td bgcolor="#0099ff">&nbsp;</td></tr><tr><td style="text-align: center;">#0099CC</td><td bgcolor="#0099cc">&nbsp;</td></tr><tr><td style="text-align: center;">#009999</td><td bgcolor="#009999">&nbsp;</td></tr><tr><td style="text-align: center;">#009966</td><td bgcolor="#009966">&nbsp;</td></tr><tr><td style="text-align: center;">#009933</td><td bgcolor="#009933">&nbsp;</td></tr><tr><td style="text-align: center;">#009900</td><td bgcolor="#009900">&nbsp;</td></tr><tr><td style="text-align: center;">#0066FF</td><td bgcolor="#0066ff">&nbsp;</td></tr><tr><td style="text-align: center;">#0066CC</td><td bgcolor="#0066cc">&nbsp;</td></tr><tr><td style="text-align: center;">#006699</td><td bgcolor="#006699">&nbsp;</td></tr><tr><td style="text-align: center;">#006666</td><td bgcolor="#006666">&nbsp;</td></tr><tr><td style="text-align: center;">#006633</td><td bgcolor="#006633">&nbsp;</td></tr><tr><td style="text-align: center;">#006600</td><td bgcolor="#006600">&nbsp;</td></tr><tr><td style="text-align: center;">#0033FF</td><td bgcolor="#0033ff">&nbsp;</td></tr><tr><td style="text-align: center;">#0033CC</td><td bgcolor="#0033cc">&nbsp;</td></tr><tr><td style="text-align: center;">#003399</td><td bgcolor="#003399">&nbsp;</td></tr><tr><td style="text-align: center;">#003366</td><td bgcolor="#003366">&nbsp;</td></tr><tr><td style="text-align: center;">#003333</td><td bgcolor="#003333">&nbsp;</td></tr><tr><td style="text-align: center;">#003300</td><td bgcolor="#003300">&nbsp;</td></tr><tr><td style="text-align: center;">#0000FF</td><td bgcolor="#0000ff">&nbsp;</td></tr><tr><td style="text-align: center;">#0000CC</td><td bgcolor="#0000cc">&nbsp;</td></tr><tr><td style="text-align: center;">#000099</td><td bgcolor="#000099">&nbsp;</td></tr><tr><td style="text-align: center;">#000066</td><td bgcolor="#000066">&nbsp;</td></tr><tr><td style="text-align: center;">#000033</td><td bgcolor="#000033">&nbsp;</td></tr><tr><td style="text-align: center;">#000000</td><td bgcolor="#000000">&nbsp;</td></tr></tbody></table></td></tr></table>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;十六进制颜色表&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Hexo" scheme="https://blog.yinuxy.com/categories/Hexo/"/>
    
    
      <category term="Hexo主题美化" scheme="https://blog.yinuxy.com/tags/Hexo%E4%B8%BB%E9%A2%98%E7%BE%8E%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Python读取Excel数据转化为字典并另存为josn文件</title>
    <link href="https://blog.yinuxy.com/post/Python/Skill/Skills-1/"/>
    <id>https://blog.yinuxy.com/post/Python/Skill/Skills-1/</id>
    <published>2020-03-13T04:06:04.000Z</published>
    <updated>2020-07-14T13:52:12.156Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">Python读取Excel数据转化为字典并另存为josn文件</font></center></blockquote><a id="more"></a><h2 id="导入Python所需要的包"><a href="#导入Python所需要的包" class="headerlink" title="导入Python所需要的包"></a>导入Python所需要的包</h2><pre><code class="python">import pandas as pdimport json</code></pre><h2 id="使用pandas读取Excel文件"><a href="#使用pandas读取Excel文件" class="headerlink" title="使用pandas读取Excel文件"></a>使用pandas读取Excel文件</h2><ol><li>样例数据采集于网上新冠肺炎中药处方，点击此<btn><a href="https://www.lanzous.com/ia7bvva" target="_blank" rel="noopener">按钮</a></btn>下载，</li><li>因为样例数据中有时间格式的文本，所以在读取Excel文件中加入了<code>parse_dates</code>读取日期格式的文本。<pre><code class="python">df=pd.read_excel(filepath ,parse_dates = [&#39;发布时间&#39;])df.head()</code></pre><details><summary>读取的Excel文件格式👇</summary></li></ol><overflow><div><style scoped>    .dataframe tbody tr th:only-of-type {        vertical-align: middle;    }<pre><code>.dataframe tbody tr th {    vertical-align: top;}.dataframe thead th {    text-align: right;}</code></pre><p></style></p><table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>发布医院/机构</th>      <th>省份</th>      <th>早中极恢复期</th>      <th>症状</th>      <th>发布时间</th>      <th>方剂组成</th>    </tr>  </thead>  <tbody>    <tr>      <th>0</th>      <td>广东省中医药局</td>      <td>广东省</td>      <td>早</td>      <td>湿邪郁肺，枢机不利</td>      <td>2020-01-26</td>      <td>藿香10g、 厚朴10g 、法下10g、 茯苓15g、 柴胡15g、 黄芩10g、 党参10...</td>    </tr>    <tr>      <th>1</th>      <td>广东省中医药局</td>      <td>广东省</td>      <td>早</td>      <td>邪热入肺，肺湿宣讲</td>      <td>2020-01-26</td>      <td>炙麻黄8g、 杏仁10g、 生石膏30g、 甘草10g、 槟榔10g、 厚朴10g、 草果1...</td>    </tr>    <tr>      <th>2</th>      <td>广东省中医药局</td>      <td>广东省</td>      <td>中</td>      <td>热闭肺，腑气不通</td>      <td>2020-01-26</td>      <td>生麻黄 8g、杏仁12g、 生石膏30g、 生大黄10g、 瓜蒌仁30g、 桃仁 10g、赤...</td>    </tr>    <tr>      <th>3</th>      <td>广东省中医药局</td>      <td>广东省</td>      <td>中</td>      <td>湿热蕴毒，肺气闭塞</td>      <td>2020-01-26</td>      <td>生麻黄 8g、杏仁12g、 生石膏30g、 生甘草 10g、滑石30g、 茵陈20g、 黄芩...</td>    </tr>    <tr>      <th>4</th>      <td>广东省中医药局</td>      <td>广东省</td>      <td>极</td>      <td>NaN</td>      <td>2020-01-26</td>      <td>红参 10g、炮附子10g、 山萸肉30g、 麦冬20g、 三七10g</td>    </tr>  </tbody></table></div></overflow></details><h2 id="转换代码"><a href="#转换代码" class="headerlink" title="转换代码"></a>转换代码</h2><pre><code class="python">def excelToDict(path):    # 创建最终返回的空字典    df_dict = {}    # 读取Excel文件#    df = pd.read_excel(path)    # 替换Excel表格内的空单元格，否则在下一步处理中将会报错    df.fillna(&quot;&quot;, inplace=True)    df_list = []    for i in df.index.values:        # loc为按列名索引 iloc 为按位置索引，使用的是 [[行号], [列名]]        df_line = df.loc[i, [&#39;发布医院/机构&#39;, &#39;省份&#39;, &#39;早中极恢复期&#39;, &#39;症状&#39;,&#39;发布时间&#39;,&#39;方剂组成&#39;]].to_dict()        # 将每一行转换成字典后添加到列表        df_list.append(df_line)    df_dict[&#39;data&#39;] = df_list    return df_list#     return df_dictdata = excelToDict(df)print(data)</code></pre><details><summary>转换后的数据👇</summary><pre><code>[{&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;湿邪郁肺，枢机不利&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;藿香10g、 厚朴10g 、法下10g、 茯苓15g、 柴胡15g、 黄芩10g、 党参10g、 杏仁10g、 薏苡仁20g、 猪苓10g、 泽泻10g、 白蔻仁10g、 淡豆鼓10g、 通草 10g、生姜5g、 大枣5g&#39;}, {&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;邪热入肺，肺湿宣讲&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;炙麻黄8g、 杏仁10g、 生石膏30g、 甘草10g、 槟榔10g、 厚朴10g、 草果10g、 知母10g、 白芍10g、 黄芩15g&#39;}, {&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;热闭肺，腑气不通&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生麻黄 8g、杏仁12g、 生石膏30g、 生大黄10g、 瓜蒌仁30g、 桃仁 10g、赤芍15g、 葶苈子20g、 黄连30g、 黄芩10g、 桑白皮10g、 重楼10g、 丹皮15g、 郁金15g、 石菖蒲15g、 生地15g、玄参15g&#39;}, {&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;湿热蕴毒，肺气闭塞&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生麻黄 8g、杏仁12g、 生石膏30g、 生甘草 10g、滑石30g、 茵陈20g、 黄芩15g、 白蔻仁10g、 藿香15g、 法夏15g、 苍术15g、 葶苈子20g、 连翘15g、 白僵蚕5g、 蝉蜕5g、 姜黄10g、 生大黄5g、 重楼10g、 丹皮 15g、赤芍15g、 郁金15g、 石菖蒲15g、 生地15g、 玄参15g&#39;}, {&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;极&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;红参 10g、炮附子10g、 山萸肉30g、 麦冬20g、 三七10g&#39;}, {&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;恢复&#39;, &#39;症状&#39;: &#39;肺脾两虚&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生晒参10g、 炒白术15g、 茯苓15g、 白扁豆30g、 砂仁6g、 莲子30g、 炙甘草6g、 桔梗10g、 山药15g、 薏苡仁30g、 炒麦芽30g、 神曲10g&#39;}, {&#39;发布医院/机构&#39;: &#39;广东省中医药局&#39;, &#39;省份&#39;: &#39;广东省&#39;, &#39;早中极恢复期&#39;: &#39;恢复&#39;, &#39;症状&#39;: &#39;气阴两伤，余邪未尽&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;西洋参20g、 石斛10g、 麦冬10g、 知母10g、 淡竹叶10g、 黄连3g、 甘草6g、 茯苓15g、 法半夏10g、 橘红10g、 陈皮10g、 炒麦芽30g&#39;}, {&#39;发布医院/机构&#39;: &#39;国家卫健委&#39;, &#39;省份&#39;: &#39;&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;寒湿郁肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-28 00:00:00&#39;), &#39;方剂组成&#39;: &#39;苍术15g、陈皮10g、厚朴10g、藿香10g、草果6g、生麻黄6g、羌活10g、生姜10g、槟郎10g&#39;}, {&#39;发布医院/机构&#39;: &#39;国家卫健委&#39;, &#39;省份&#39;: &#39;&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;疫毒闭肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-28 00:00:00&#39;), &#39;方剂组成&#39;: &#39;杏仁10g、生石膏30g、瓜萎30g、生大黄6g、生炙麻黄各6g、葶苈子10g、桃仁10g、草果6g、槟郎10g、苍术10g&#39;}, {&#39;发布医院/机构&#39;: &#39;国家卫健委&#39;, &#39;省份&#39;: &#39;&#39;, &#39;早中极恢复期&#39;: &#39;重&#39;, &#39;症状&#39;: &#39;内闭外脱&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-28 00:00:00&#39;), &#39;方剂组成&#39;: &#39;人参15g，黑顺片10g，山茱萸15g， 送服苏合香丸或安宫牛黄丸&#39;}, {&#39;发布医院/机构&#39;: &#39;国家卫健委&#39;, &#39;省份&#39;: &#39;&#39;, &#39;早中极恢复期&#39;: &#39;恢复期&#39;, &#39;症状&#39;: &#39;肺脾气虚&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-28 00:00:00&#39;), &#39;方剂组成&#39;: &#39;法半夏9g、陈皮10g、党参15g、炙黄芪30g、茯苓15g、藿香10g、砂仁6g&#39;}, {&#39;发布医院/机构&#39;: &#39;宝鸡市中医医院&#39;, &#39;省份&#39;: &#39;陕西省&#39;, &#39;早中极恢复期&#39;: &#39;预防&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生黄芪 9g 炒白术 6g 防 风 3g 玄 参 6g 炙百合 30g 石 斛 10g 梨 皮 30g 桔 梗 10g 芦 根 30g 生甘草 6g&#39;}, {&#39;发布医院/机构&#39;: &#39;宝鸡市中医医院&#39;, &#39;省份&#39;: &#39;陕西省&#39;, &#39;早中极恢复期&#39;: &#39;预防&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;太子参 15g 贯 众 6g 银 花 10g 连 翘 10g 大青叶 10g 苏 叶 6g 葛 根 10g 藿 香 10g 苍 术 6g 佩 兰 10g 沙 参 20g 芦 根 10g &#39;}, {&#39;发布医院/机构&#39;: &#39;贵州省中医药管理局&#39;, &#39;省份&#39;: &#39;贵州省&#39;, &#39;早中极恢复期&#39;: &#39;预防&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-23 00:00:00&#39;), &#39;方剂组成&#39;: &#39;北沙参10g、玉竹20g、石斛20g、贯众20g、苍术10g、石菖蒲10g。&#39;}, {&#39;发布医院/机构&#39;: &#39;贵州省中医药管理局&#39;, &#39;省份&#39;: &#39;贵州省&#39;, &#39;早中极恢复期&#39;: &#39;儿童预防&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-23 00:00:00&#39;), &#39;方剂组成&#39;: &#39;板蓝根20g 贯众15g 藿香10g 薄荷10g\n菊花15g 荆芥10g 葛根6g 芦根10g\n甘草6g&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;麻黄9g、炙甘草6g、杏仁9g、生石膏15-30g、桂枝9g、泽泻9g、猪苓9g、白术9g、茯苓15g、柴胡16g、黄芩6g、姜半夏9g、生姜9g、紫菀9g、冬花9g、射干9g、细辛6g、山药12g、枳实6g、陈皮6g、藿香9g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;风热犯肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;金银花15g、连翘15g、防风9g、黄芩15g、牛蒡子9g、桔梗9g、芦根18g、柴胡9g、陈皮9g、生甘草6g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;寒湿郁肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生麻黄6g、生石膏15g、杏仁9g、羌活15g、葶苈子15g、贯众9g、地龙15g、徐长卿15g、藿香15g、佩兰9g、苍术15g、云苓45g、生白术30g、焦三仙各9g、厚朴15g、槟榔9g、草果9g、生姜15g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;湿热蕴肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;槟榔10g、草果10g、厚朴10g、知母10g、黄芩10g、柴胡10g、赤芍10g、连翘15g、青蒿10g、苍术10g、大青叶10g、生甘草5g。呕恶者加黄连3g、苏叶6g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;湿毒郁肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生麻黄6g、苦杏仁15g、生石膏30g、生薏苡仁30g、苍术10g、藿香15g、青蒿12g、虎杖20g、马鞭草30g、干芦根30g、葶苈子15g、化橘红15g、生甘草10g。呕恶者加黄连3g、苏叶6g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;寒湿阻肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;苍术15g、陈皮10g、厚朴10g、藿香10g、草果6g、生麻黄6g、羌活10g、生姜10g、槟榔10g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;重&#39;, &#39;症状&#39;: &#39;热毒闭肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生麻黄6g、杏仁9g、生石膏15g、甘草3g、藿香10g、厚朴10g、苍术15g、草果10g、法半夏9g、茯苓15g、生大黄5g、生黄芪10g、葶苈子10g、赤芍10g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;重&#39;, &#39;症状&#39;: &#39;气营两燔&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生石膏30-60g、知母30g、生地30-60g、水牛角30g、赤芍30g、玄参30g、连翘15g、丹皮15g、黄连6g、竹叶12g、葶苈子15g、生甘草6g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;危重&#39;, &#39;症状&#39;: &#39;内闭外脱&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;人参15g、黑顺片10g、山茱萸15g，送服苏合香丸或安宫牛黄丸。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;恢复&#39;, &#39;症状&#39;: &#39;气阴两虚&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;南北沙参各10g、麦冬15g、西洋参6g，五味子6g、生石膏15g、淡竹叶10g、桑叶10g、芦根15g、丹参15g、生甘草6g。&#39;}, {&#39;发布医院/机构&#39;: &#39;上海市中医药管理局&#39;, &#39;省份&#39;: &#39;江苏省&#39;, &#39;早中极恢复期&#39;: &#39;恢复&#39;, &#39;症状&#39;: &#39;肺脾气虚&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;法半夏9g、陈皮10g、党参15g、炙黄芪30g、炒白术10g、茯苓15g、藿香10g、砂仁6g、甘草6g。&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;风热夹湿&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;银花30g连翘30g荆芥15g牛蒡子15g薄荷15g桔梗30g杏仁15g广藿香15g厚朴15g茯苓30g法半夏15g豆蔻15g薏苡仁30g白扁豆30g焦山楂30g建曲15g芦根30g&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;风寒夹湿&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;荆芥15g防风15g川芎15g白芷15g薄荷15g桔梗30g广藿香15g紫苏叶15g厚朴15g炒白术30g法半夏15g建曲15g薏苡仁30g茯苓30g豆蔻15g杏仁15g焦山楂30g白扁豆30g芦根30g&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;湿邪郁肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;蜜麻黄10g杏仁15g草果10-20g槟榔10-15g蝉蜕5-10g连翘10-30g苍术10-15g桔梗20-30g黄芩15g牛蒡子15g生甘草5-10g。&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;湿热蕴肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;陈皮10-15g杏仁10-15g黄芩10-15g瓜蒌皮10-15g茯苓15-30g藿香15g厚朴10-20g青蒿20-30g芦根20-30g金银花15-30g太子参30g生甘草5-10g&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;邪热壅肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;蜜麻黄10g杏仁10-15g石膏20-30g桑白皮15g金银花20-30g连翘20-30g黄芩15g浙贝母15g生甘草5-10g&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;邪毒闭肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;杏仁15g生石膏20-30g瓜蒌皮15g大黄5g蜜麻黄10g葶苈子15-20g桃仁10g赤芍15g生甘草5-10g&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;急性期&#39;, &#39;症状&#39;: &#39;内闭外脱&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生晒参20-30g,炙附片30-60g，山茱萸15-20g,送服安宫牛黄丸或紫雪散&#39;}, {&#39;发布医院/机构&#39;: &#39;四川省中医药管理局&#39;, &#39;省份&#39;: &#39;四川省&#39;, &#39;早中极恢复期&#39;: &#39;恢复期&#39;, &#39;症状&#39;: &#39;余邪未尽、气阴两虚&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-01-24 00:00:00&#39;), &#39;方剂组成&#39;: &#39;竹叶15g石膏15-20g太子参20-30g麦冬10-15g半夏10g白术15-20g茯苓15-20g炙甘草5-10g&#39;}, {&#39;发布医院/机构&#39;: &#39;江西中医药管理局&#39;, &#39;省份&#39;: &#39;江西省&#39;, &#39;早中极恢复期&#39;: &#39;预防&#39;, &#39;症状&#39;: &#39;&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-03 00:00:00&#39;), &#39;方剂组成&#39;: &#39;生黄芪12g、防风\n\n10g、白术10g、银花10g、连翘10g、贯众6g、佩兰10g、陈皮10g、苍术10g、桔梗10g。&#39;}, {&#39;发布医院/机构&#39;: &#39;江西中医药管理局&#39;, &#39;省份&#39;: &#39;江西省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;寒湿郁肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-03 00:00:00&#39;), &#39;方剂组成&#39;: &#39;苍术15g、陈皮10g、厚朴10g、藿香10g、草果6g、生麻黄6g、羌活10g、生姜10g、槟郎10g&#39;}, {&#39;发布医院/机构&#39;: &#39;江西中医药管理局&#39;, &#39;省份&#39;: &#39;江西省&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;疫毒闭肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-03 00:00:00&#39;), &#39;方剂组成&#39;: &#39;杏仁10g、生石膏30g、瓜萎30g、生大黄6g、生炙麻黄各6g、葶苈子10g、桃仁10g、草果6g、槟郎10g、苍术10g&#39;}, {&#39;发布医院/机构&#39;: &#39;江西中医药管理局&#39;, &#39;省份&#39;: &#39;江西省&#39;, &#39;早中极恢复期&#39;: &#39;重&#39;, &#39;症状&#39;: &#39;内闭外脱&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-03 00:00:00&#39;), &#39;方剂组成&#39;: &#39;人参15g、黑顺片10g、山茱萸15g，送服苏合香丸或安宫牛黄丸&#39;}, {&#39;发布医院/机构&#39;: &#39;江西中医药管理局&#39;, &#39;省份&#39;: &#39;江西省&#39;, &#39;早中极恢复期&#39;: &#39;恢复&#39;, &#39;症状&#39;: &#39;肺脾气虚&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-03 00:00:00&#39;), &#39;方剂组成&#39;: &#39;法半夏9g、陈皮10g、党参15g、炙黄芪30g、茯苓15g、藿香10g、砂仁6g&#39;}, {&#39;发布医院/机构&#39;: &#39;黑龙江省中医药管理局&#39;, &#39;省份&#39;: &#39;黑龙江省&#39;, &#39;早中极恢复期&#39;: &#39;早&#39;, &#39;症状&#39;: &#39;寒湿郁肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;藿香15g、苏叶15g、桔梗15g、枳壳15g、生麻黄6g、杏仁10g、陈皮15g、茯苓20g、白术15g、佩兰15g、苍术15g、厚朴15g、半夏15g、草果仁15g、白芷15g、黄芩10g、大青叶15g、葛根15g、甘草15g。&#39;}, {&#39;发布医院/机构&#39;: &#39;黑龙江省中医药管理局&#39;, &#39;省份&#39;: &#39;黑龙江省&#39;, &#39;早中极恢复期&#39;: &#39;中&#39;, &#39;症状&#39;: &#39;疫毒闭肺&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;水牛角20g、生地15g、丹参25g、玄参20g、金银花30g、连翘20g、桔梗20g、枳壳20g、川芎15g、赤芍25g、地龙20g、桃仁15g、太子参25g、炒白术20g、茯苓25g、生麻黄10g、白果20g、葶苈子20g、黄芩15g、杏仁10g、紫苏子20g、瓜蒌20g、浙贝母15g、生薏米20g、甘草15g。&#39;}, {&#39;发布医院/机构&#39;: &#39;黑龙江省中医药管理局&#39;, &#39;省份&#39;: &#39;黑龙江省&#39;, &#39;早中极恢复期&#39;: &#39;重&#39;, &#39;症状&#39;: &#39;内闭外脱&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;人参15g、干姜10g、附子10g、甘草10g，煎汤送服紫雪丹或至宝丹、安宫牛黄丸、苏合香丸酌情选用。&#39;}, {&#39;发布医院/机构&#39;: &#39;黑龙江省中医药管理局&#39;, &#39;省份&#39;: &#39;黑龙江省&#39;, &#39;早中极恢复期&#39;: &#39;恢复期&#39;, &#39;症状&#39;: &#39;余邪未尽，气阴两伤&#39;, &#39;发布时间&#39;: Timestamp(&#39;2020-02-26 00:00:00&#39;), &#39;方剂组成&#39;: &#39;竹叶15g、石膏20g、太子参15g、麦冬20g、半夏10g、枇杷叶15g、玉竹15g、玄参15g、杏仁10g、陈皮15g、甘草10g。&#39;}]</code></pre>{% raw %}</details>{% endraw %}<h2 id="保存为json文件格式"><a href="#保存为json文件格式" class="headerlink" title="保存为json文件格式"></a>保存为json文件格式</h2><pre><code class="python">print(filepath + &#39;共有%d&#39; % (len(data)) + &#39;行数据&#39;)for i in data:    i[&#39;发布时间&#39;] = i[&#39;发布时间&#39;].strftime(&quot;%Y %b %d %H:%M:%S&quot;)for i in range(len(data)):    filename = filepath+&#39;outfile/&#39; + str(i+1)+&#39;.json&#39;    with open(filename, &#39;w&#39;, encoding=&#39;utf-8&#39;) as  f:        json.dump(data[i], f, ensure_ascii=False, indent=4)  # ensure_ascii=False(输出中文)， indent=4(缩进为4)</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;Python读取Excel数据转化为字典并另存为josn文件&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Python" scheme="https://blog.yinuxy.com/categories/Python/"/>
    
    
      <category term="Python小技巧" scheme="https://blog.yinuxy.com/tags/Python%E5%B0%8F%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>CentOS防火墙配置</title>
    <link href="https://blog.yinuxy.com/post/Experience/centosFirewall/"/>
    <id>https://blog.yinuxy.com/post/Experience/centosFirewall/</id>
    <published>2020-03-11T14:06:04.000Z</published>
    <updated>2020-07-14T13:52:12.080Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">CentOS防火墙配置</font></center></blockquote><a id="more"></a><h2 id="查看防火墙服务状态"><a href="#查看防火墙服务状态" class="headerlink" title="查看防火墙服务状态"></a>查看防火墙服务状态</h2><pre><code>systemctl status firewalld</code></pre><h2 id="查看防火墙的状态"><a href="#查看防火墙的状态" class="headerlink" title="查看防火墙的状态"></a>查看防火墙的状态</h2><pre><code>firewall-cmd --state</code></pre><h2 id="开启、重启、关闭firewalld-service服务"><a href="#开启、重启、关闭firewalld-service服务" class="headerlink" title="开启、重启、关闭firewalld.service服务"></a>开启、重启、关闭firewalld.service服务</h2><ol><li>开启<pre><code>service firewalld start</code></pre></li><li>重启<pre><code>service firewalld restart</code></pre></li><li>关闭<pre><code>service firewalld stop</code></pre><h2 id="查看防火墙规则"><a href="#查看防火墙规则" class="headerlink" title="查看防火墙规则"></a>查看防火墙规则</h2><pre><code>firewall-cmd --list-all</code></pre><h2 id="查询、开放、关闭端口"><a href="#查询、开放、关闭端口" class="headerlink" title="查询、开放、关闭端口"></a>查询、开放、关闭端口</h2></li><li>查询端口是否开放<pre><code>firewall-cmd --query-port=8080/tcp</code></pre></li><li>开放端口（以3306端口为例）<pre><code>firewall-cmd --permanent --add-port=3306/tcp</code></pre></li><li>移除端口<pre><code>firewall-cmd --permanent --remove-port=3306/tcp</code></pre><h2 id="参数说明"><a href="#参数说明" class="headerlink" title="参数说明"></a>参数说明</h2>firewall-cmd:是linux提供的操作firewall的一个工具<br>–permanent:表示设置为持久<br>–add-port:标识添加的端口<h2 id="防火墙配置文件"><a href="#防火墙配置文件" class="headerlink" title="防火墙配置文件"></a>防火墙配置文件</h2><pre><code>/etc/firewalld/zones/public.xml</code></pre></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;CentOS防火墙配置&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Linux" scheme="https://blog.yinuxy.com/categories/Linux/"/>
    
    
      <category term="CentOS" scheme="https://blog.yinuxy.com/tags/CentOS/"/>
    
      <category term="防火墙" scheme="https://blog.yinuxy.com/tags/%E9%98%B2%E7%81%AB%E5%A2%99/"/>
    
  </entry>
  
  <entry>
    <title>Hexo主题美化 | 给你的博客加上GITHUB日历云和分类雷达图</title>
    <link href="https://blog.yinuxy.com/post/TechShare/HexoPersonal/"/>
    <id>https://blog.yinuxy.com/post/TechShare/HexoPersonal/</id>
    <published>2020-03-10T09:13:57.000Z</published>
    <updated>2020-07-14T13:52:12.143Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">Hexo主题美化 | 给你的博客加上GITHUB日历云和分类雷达图</font></center></blockquote><a id="more"></a><h2 id="Previous"><a href="#Previous" class="headerlink" title="Previous"></a>Previous</h2><ol><li>环境：Hexo4.2</li><li>主题：<a href="https://volantis.js.org/" target="_blank" rel="noopener">Volantis</a></li><li>本次主题美化基于<a href="https://blinkfox.github.io/" target="_blank" rel="noopener">blinkfox</a>的<a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank" rel="noopener">hexo-theme-matery</a></li><li>演示</li></ol><btns center rounded   grid5><a href='https://blog.yinuxy.com/archives/'><i class='fas fa-globe-asia'></i>GITHUB日历云</a><a href='https://blog.yinuxy.com/tags/'><i class='fas fa-globe-asia'></i>标签云和文章分类雷达图</a></btns><h2 id="GITHUB日历云"><a href="#GITHUB日历云" class="headerlink" title="GITHUB日历云"></a>GITHUB日历云</h2><ol><li>点击此<btn><a href="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/echarts.min.js" target="_blank" rel="noopener">按钮</a></btn>下载<code>echarts.min.js</code>文件放置于<code>../volantis/source/js</code>文件夹中</li><li>点击此<btn><a href="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/post-calendar.ejs" target="_blank" rel="noopener">按钮</a></btn>下载<code>post-calendar.ejs</code>文件放置于<code>../volantis/layout/_widget</code>文件夹中</li><li>打开刚刚下载的<code>post-calendar.ejs</code>文件，将第七行<fancybox> <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/img/themePersonalization/output_3.png'></fancybox></li></ol><p>替换为</p><pre><code>&lt;script type=&quot;text/javascript&quot; src=&quot;/js/echarts.min.js&quot;&gt;&lt;/script&gt;</code></pre><ol start="4"><li>在<code>../volantis/source/less/archive.less</code>里面最后一个括号之前添加如下代码：<pre><code>/*日历云*/#post-calendar { width: 100%; height: 200px;}</code></pre></li></ol><pre><code>或者下载此&lt;btn&gt;[CSS](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/matery.css)&lt;/btn&gt;文件后放置于`../volantis/source/css`文件夹中，然后在`../volantis/layout/_partial/head.ejs`中引入css文件，在`&lt;!-- link --&gt;`标记下方添加一行</code></pre><link rel="stylesheet" type="text/css" href="/css/matery.css">```::: danger使用`volantis`主题的直接在`archive.less`里面添加代码，不要引入`matery.css`文件，`matery.css`与`volantis`主题配置文件`archive.less`部分标签名相同，引入后会更改主题外观。:::5. 在你想让它显示的位置添加如下代码就行啦，例如我是将它放在`../volantis/layout/archive.ejs`中<fancybox>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/img/themePersonalization/output_4.png'></fancybox>```<%- partial('_widget/post-calendar') %>```6. 演示图：<fancybox>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/img/themePersonalization/output_1.png'></fancybox><h2 id="标签云"><a href="#标签云" class="headerlink" title="标签云"></a>标签云</h2><ol><li>点击此<btn><a href="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/echarts.min.js" target="_blank" rel="noopener">按钮</a></btn>下载<code>echarts.min.js</code>文件放置于<code>../volantis/source/js</code>文件夹中</li><li>点击此<btn><a href="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/tag-cloud.ejs" target="_blank" rel="noopener">按钮</a></btn>下载<code>tag-cloud.ejs</code>文件放置于<code>../volantis/layout/_widget</code>文件夹中</li><li>打开刚刚下载的<code>tag-cloud.ejs</code>文件，将<pre><code>&lt;script type=&quot;text/javascript&quot; src=&quot;&lt;%- theme.jsDelivr.url %&gt;&lt;%- theme.libs.js.echarts %&gt;&quot;&gt;&lt;/script&gt;</code></pre>替换为</li></ol><pre><code>&lt;script type=&quot;text/javascript&quot; src=&quot;/js/echarts.min.js&quot;&gt;&lt;/script&gt;</code></pre><ol start="4"><li>使用<code>volantis</code>主题的可以点击<btn><a href="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/myfile/tag.ejs" target="_blank" rel="noopener">下载</a></btn>按钮替换即可</li><li>非<code>volantis</code>主题的需要下载此<btn><a href="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/matery.css" target="_blank" rel="noopener">CSS</a></btn>文件后放置于<code>../volantis/source/css</code>文件夹中，然后在<code>../volantis/layout/_partial/head.ejs</code>中引入css文件，在<code>&lt;!-- link --&gt;</code>标记下方添加一行<pre><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/css/matery.css&quot;&gt;</code></pre>若引入后博客外观发生改变，则将如下代码复制粘贴于<code>../volantis/source/less/archive.less</code>文件最后一个括号之前。<pre><code>/*tag-cloud*/.chip .tag-length { margin-left: 5px; margin-right: -2px; font-size: 0.5rem;}.chip-default .tag-length { color: #e91e63; margin-top: 1px;}.chip-active .tag-length { color: #fff;}.chip-container .tag-chips { margin: 1rem auto 0.5rem; max-width: 850px; text-align: center;}/*tags边框*/.chip-container .chip { margin: 10px 10px; padding: 19px 14px; display: inline-flex; line-height: 0; font-size: 1rem; font-weight: 500; border-radius: 5px; cursor: pointer; box-shadow: 0 3px 5px rgba(0, 0, 0, .12); z-index: 0;}.chip-container .chip:hover { color: #fff; background: linear-gradient(to right, #4cbf30 0%, #0f9d58 100%) !important;}</code></pre></li></ol><pre><code>6. 在你想让它显示的位置添加如下代码，例如我是将它放在`../volantis/layout/tag.ejs`中</code></pre><p>&lt;%- partial(‘_widget/tag-cloud’) %&gt;</p><pre><code>添加排版后可能会出现跟主题不搭的情况，可以根据我的&lt;btn&gt;[tag](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/myfile/tag.ejs)&lt;/btn&gt;文件适当修改。7. 演示图&lt;fancybox&gt;    &lt;img src=&#39;https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/img/themePersonalization/output_2.png&#39;&gt;&lt;/fancybox&gt;## 文章分类雷达图 ##1. 点击此&lt;btn&gt;[按钮](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/echarts.min.js)&lt;/btn&gt;下载`echarts.min.js`文件放置于`../volantis/source/js`文件夹中2. 点击此&lt;btn&gt;[按钮](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/Hexo/themeConfig/category-radar.ejs)&lt;/btn&gt;下载`category-radar.ejs`文件放置于`../volantis/layout/_widget`文件夹中3. 打开刚刚下载的`category-radar.ejs`文件，将&lt;fancybox&gt;    &lt;img src=&#39;https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/img/themePersonalization/output_3.png&#39;&gt;&lt;/fancybox&gt;替换为</code></pre><script type="text/javascript" src="/js/echarts.min.js"></script><pre><code>4. 在你想让它显示的位置添加如下代码，例如我是将它放在`../volantis/layout/tag.ejs`中</code></pre><p>&lt;%- partial(‘_widget/category-radar’) %&gt;</p><pre><code>5. 演示图&lt;fancybox&gt;    &lt;img src=&#39;https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.44/img/themePersonalization/output_2.png&#39;&gt;&lt;/fancybox&gt;## 其它个性化配置 ##更多个性化配置可参考[TRHX](https://www.itrhx.com/)的博文[Hexo 博客主题个性化](https://www.itrhx.com/2018/08/27/A04-Hexo-blog-topic-personalization/)</code></pre>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;Hexo主题美化 | 给你的博客加上GITHUB日历云和分类雷达图&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Hexo" scheme="https://blog.yinuxy.com/categories/Hexo/"/>
    
    
      <category term="Hexo主题美化" scheme="https://blog.yinuxy.com/tags/Hexo%E4%B8%BB%E9%A2%98%E7%BE%8E%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>使用 Python可视化神器 Plotly 动态演示全球疫情变化趋势</title>
    <link href="https://blog.yinuxy.com/post/Python/Visual/2020nCovVisualization/"/>
    <id>https://blog.yinuxy.com/post/Python/Visual/2020nCovVisualization/</id>
    <published>2020-03-09T09:13:57.000Z</published>
    <updated>2020-07-14T13:52:12.175Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">使用 Python可视化神器 Plotly 动态演示全球疫情变化趋势</font></center></blockquote><a id="more"></a><h2 id="数据来源"><a href="#数据来源" class="headerlink" title="数据来源"></a>数据来源</h2><p>疫情的数据来源于开源项目 <a href="https://pypi.org/project/akshare/" target="_blank" rel="noopener">Akshare</a>。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>运行环境：</p><ol><li>Windows 10系统</li><li>Anaconda（Python 3.7）</li><li>Jupyter Notebook<br>本次使用到的Python库： <code>akshare</code>, <code>pandas</code>, <code>plotly</code></li></ol><h2 id="数据导入"><a href="#数据导入" class="headerlink" title="数据导入"></a>数据导入</h2><pre><code>import akshare as akimport pandas as pdimport plotlyfrom plotly.offline import iplot, init_notebook_modeimport plotly.express as pxfrom datetime import datetimeinit_notebook_mode()</code></pre><p><code>init_notebook_mode()</code>是离线使用<code>plotly</code>，不需注册账号即可使用，但是功能没有在线模式全，下面简单的介绍一下两种模式：<br>plotly的两种模式</p><blockquote><p>离线模式：没有数量限制，图片都在本地。<br>在线模式：最多可以上传25张，可以通过浏览器在线编辑、观看。更好的分享给别，有分为三种情况——公开(public)、私人(private)、秘密(secret)。</p></blockquote><pre><code># 从 akshare 获取数# df_all_history = ak.epidemic_history()# 从csv文件获取数据df_all_history = pd.read_csv(&#39;epidemic_all_20200307.csv&#39;,index_col=0)df_all_history</code></pre><p>由于使用该项目获取数据时，有时不太稳定，可能会遇到连接失败的情况，所以，这里选用保存好的数据。</p><h2 id="提取数据"><a href="#提取数据" class="headerlink" title="提取数据"></a>提取数据</h2><p>从上面获取的数据，有些数据格式需要加以调整，对于日期，我们这里会组织两列数据，一列是时间格式的日期（ <code>[&#39;date&#39;]</code>），一列是字符串格式的日期 (<code>[&#39;dates&#39;]</code>)。这样设置的原因，是因为我们后续分别需要用到这两种格式的日期。</p><pre><code>df_all = df_all_history# 将字符串格式的日期 另保存为一列df_all[&#39;dates&#39;] = df_all_history[&#39;date&#39;]# 将字符串格式的日期转换为 日期格式df_all[&#39;date&#39;] = pd.to_datetime(df_all[&#39;date&#39;])</code></pre><h2 id="获取国外的疫情数据"><a href="#获取国外的疫情数据" class="headerlink" title="获取国外的疫情数据"></a>获取国外的疫情数据</h2><p>上面的数据，是全球的数据，我们可以把其中属于中国的剔除，就可以得到国外的数据了。</p><pre><code># 国外，按国家统计df_oversea = df_all.query(&quot;country!=&#39;中国&#39;&quot;)df_oversea.fillna(value=&quot;&quot;, inplace=True)df_oversea</code></pre><h2 id="数据可视化"><a href="#数据可视化" class="headerlink" title="数据可视化"></a>数据可视化</h2><p>先来用 plotly express 看下国外疫情分国家的整体走势。</p><pre><code>fig_oversea = px.line(df_oversea, x=&#39;dates&#39;, y=&#39;confirmed&#39;,                      line_group=&#39;country&#39;,                      color=&#39;country&#39;,                      color_discrete_sequence=px.colors.qualitative.D3,                      hover_name=&#39;country&#39;,                     )fig_oversea.show()</code></pre><p>效果如下<br><fancybox><br>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.42/img/2020nCovVisualization/output_1.png'><br></fancybox><br>从上图可以看出，国外的疫情发展情况，大部分国家从2月10日期，发展趋势较为明显，因此，后面我们重点分析这段时间之后的情况。</p><pre><code># 现有数据演示从 2020年2月10日开始df_oversea_recent = df_oversea.set_index(&#39;date&#39;)df_oversea_recent = df_oversea_recent[&#39;2020-02-10&#39;:]df_oversea_recent</code></pre><p>由于部分国家的数据不是从2020年2月10日开始记录的，所以要补充数据。我们可以手动新建一个 excel数据表，将补充日期的数值填充为 0 。<br>这里主要补充的是伊朗的数据，因为伊朗实在是发展太快了，必须纳入分析的范围内。其他国家，如果有需要补充的，后续可以继续完善。</p><pre><code># 由于部分国家，数据不是从2020年2月10日开始的，所以要补充数据，数值为 0# 数据在 excel 表格中进行补充，这里进行读取df_oversea_buchong = pd.read_excel(&#39;epidemic_buchong.xlsx&#39;)df_oversea_buchong[&#39;dates&#39;] = df_oversea_buchong[&#39;date&#39;].apply(lambda x:x.strftime(&#39;%Y-%m-%d&#39;))df_oversea_buchong.set_index(&#39;date&#39;, inplace=True)df_oversea_buchong.fillna(value=&quot;&quot;, inplace=True)print(df_oversea_buchong.info())df_oversea_buchong</code></pre><p>将需要补充的数据弄好后，我们可以合并上面这两部分数据，一起进行分析。</p><pre><code># 合并补充数据df_oversea_recent_new = df_oversea_recent.append(df_oversea_buchong)df_oversea_recent_new.sort_index(inplace=True)df_oversea_recent_new</code></pre><p>得到合并的数据后，首先，用气泡图来对变化情况进行可视化，这里用的是 plotly express 的散点图。</p><pre><code>fig_oversea_recent = px.scatter(df_oversea_recent_new, x=&#39;dead&#39;, y=&#39;confirmed&#39;,                                size=&#39;confirmed&#39;, text=&#39;country&#39;, color=&#39;country&#39;,                                color_discrete_sequence=px.colors.qualitative.Light24,                                animation_frame=&#39;dates&#39;,animation_group=&#39;country&#39;,                                hover_name=&#39;country&#39;,                                range_x=[-10,260],                                range_y=[0,8000],                                size_max=50,                                template=&#39;plotly_white&#39;,)fig_oversea_recent.show()</code></pre><p>效果如下<br><fancybox><br>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.42/img/2020nCovVisualization/outpur_3.png'><br></fancybox></p><h2 id="源码及数据文件"><a href="#源码及数据文件" class="headerlink" title="源码及数据文件"></a>源码及数据文件</h2><btns center rounded   grid5><a href='https://github.com/InfiniteYinux/Python/tree/master/Visualization/Epidemic-analysis' target="_blank" rel="noopener"><i class='fas fa-download'></i>下载源码</a><a href='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.42/img/2020nCovVisualization/data/' target="_blank" rel="noopener"><i class='fas fa-download'></i>下载数据</a></btns>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;使用 Python可视化神器 Plotly 动态演示全球疫情变化趋势&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="可视化" scheme="https://blog.yinuxy.com/categories/%E5%8F%AF%E8%A7%86%E5%8C%96/"/>
    
    
      <category term="Python可视化" scheme="https://blog.yinuxy.com/tags/Python%E5%8F%AF%E8%A7%86%E5%8C%96/"/>
    
      <category term="Plotly" scheme="https://blog.yinuxy.com/tags/Plotly/"/>
    
  </entry>
  
  <entry>
    <title>自用的一些Linux一键脚本（持续更新中···）</title>
    <link href="https://blog.yinuxy.com/post/Experience/LinuxScript/"/>
    <id>https://blog.yinuxy.com/post/Experience/LinuxScript/</id>
    <published>2020-03-07T15:55:16.000Z</published>
    <updated>2020-07-14T13:52:12.044Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">Linux一键脚本</font></center></blockquote><a id="more"></a><h2 id="VPS-性能测试一键脚本"><a href="#VPS-性能测试一键脚本" class="headerlink" title="VPS 性能测试一键脚本"></a>VPS 性能测试一键脚本</h2><h3 id="SuperBench-sh"><a href="#SuperBench-sh" class="headerlink" title="SuperBench.sh"></a>SuperBench.sh</h3><h4 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h4><pre><code>wget -qO- --no-check-certificate https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bash</code></pre><p>或</p><pre><code>curl -Lso- -no-check-certificate https://raw.githubusercontent.com/oooldking/script/master/superbench.sh | bash</code></pre><h4 id="演示图"><a href="#演示图" class="headerlink" title="演示图"></a>演示图</h4><fancybox>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.40/img/LinuxScript/output_1.jpg'></fancybox><h4 id="下载地址"><a href="#下载地址" class="headerlink" title="下载地址"></a>下载地址</h4><p><a href="https://github.com/oooldking/script/blob/master/superbench.sh" target="_blank" rel="noopener">https://github.com/oooldking/script/blob/master/superbench.sh</a></p><h3 id="bench-sh"><a href="#bench-sh" class="headerlink" title="bench.sh"></a>bench.sh</h3><h4 id="使用方法-1"><a href="#使用方法-1" class="headerlink" title="使用方法"></a>使用方法</h4><pre><code>wget -qO- bench.sh | bash</code></pre><p>或</p><pre><code>curl -Lso- bench.sh | bash</code></pre><h4 id="演示图-1"><a href="#演示图-1" class="headerlink" title="演示图"></a>演示图</h4><fancybox>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.04/image/Article/2020/06/10/bench.png'></fancybox><h4 id="下载地址-1"><a href="#下载地址-1" class="headerlink" title="下载地址"></a>下载地址</h4><p><a href="https://github.com/teddysun/across/blob/master/bench.sh" target="_blank" rel="noopener">https://github.com/teddysun/across/blob/master/bench.sh</a></p><h3 id="ZBench-sh"><a href="#ZBench-sh" class="headerlink" title="ZBench.sh"></a>ZBench.sh</h3><p>ZBench 基本上是把上面两个脚本的功能合并了一下，再自己加了些许新的功能，可以说是集大成者，可以一次性测试上面两个脚本的测试项。</p><h4 id="使用方法-2"><a href="#使用方法-2" class="headerlink" title="使用方法"></a>使用方法</h4><p>中文版：</p><pre><code>wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench-CN.sh &amp;&amp; bash ZBench-CN.sh</code></pre><p>英文版：</p><pre><code>wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench.sh &amp;&amp; bash ZBench.sh</code></pre><h4 id="演示图-2"><a href="#演示图-2" class="headerlink" title="演示图"></a>演示图</h4><fancybox>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.04/image/Article/2020/06/10/ZBebnch.png'></fancybox><h4 id="下载地址-2"><a href="#下载地址-2" class="headerlink" title="下载地址"></a>下载地址</h4><p><a href="https://github.com/FunctionClub/ZBench/blob/master/ZBench.sh" target="_blank" rel="noopener">https://github.com/FunctionClub/ZBench/blob/master/ZBench.sh</a></p><h3 id="VPS-回程路由一键测试"><a href="#VPS-回程路由一键测试" class="headerlink" title="VPS 回程路由一键测试"></a>VPS 回程路由一键测试</h3><h4 id="使用方法-3"><a href="#使用方法-3" class="headerlink" title="使用方法"></a>使用方法</h4><pre><code>wget -qO- git.io/besttrace | bash</code></pre><h4 id="演示图-3"><a href="#演示图-3" class="headerlink" title="演示图"></a>演示图</h4><fancybox>    <img src='https://cdn.jsdelivr.net/gh/InfiniteYinux/yinuxypic@1.04/image/Article/2020/06/10/besttrace.png'></fancybox><h4 id="下载地址-3"><a href="#下载地址-3" class="headerlink" title="下载地址"></a>下载地址</h4><p><a href="https://github.com/teddysun/across/blob/master/bench.sh" target="_blank" rel="noopener">https://github.com/teddysun/across/blob/master/bench.sh</a></p><h2 id="VPS-一键安装脚本"><a href="#VPS-一键安装脚本" class="headerlink" title="VPS 一键安装脚本"></a>VPS 一键安装脚本</h2><h3 id="一键安装KMS服务脚本"><a href="#一键安装KMS服务脚本" class="headerlink" title="一键安装KMS服务脚本"></a>一键安装KMS服务脚本</h3><h4 id="适用环境"><a href="#适用环境" class="headerlink" title="适用环境"></a>适用环境</h4><blockquote><p>系统支持：CentOS 6+，Debian 7+，Ubuntu 12+<br>虚拟技术：任意<br>内存要求：≥128M</p></blockquote><h4 id="关于本脚本"><a href="#关于本脚本" class="headerlink" title="关于本脚本"></a>关于本脚本</h4><ol><li>本脚本适用于三大 Linux 发行版，其他版本则不支持。</li><li>KMS 服务安装完成后会加入开机自启动。</li><li>默认记录日志，其日志位于 <code>/var/log/vlmcsd.log</code>。<h4 id="使用方法-4"><a href="#使用方法-4" class="headerlink" title="使用方法"></a>使用方法</h4>使用root用户登录，运行以下命令：<pre><code>wget --no-check-certificate https://github.com/teddysun/across/raw/master/kms.sh &amp;&amp; chmod +x kms.sh &amp;&amp; ./kms.sh</code></pre>安装完成后，输入以下命令查看端口号 1688 的监听情况<pre><code>netstat -nxtlp | grep 1688</code></pre>返回值类似于如下这样就表示 OK 了：<pre><code>tcp        0      0 0.0.0.0:1688                0.0.0.0:*                   LISTEN      3200/vlmcsd         tcp        0      0 :::1688                     :::*                        LISTEN      3200/vlmcsd </code></pre>脚本安装完成后，会将 KMS 服务加入开机自启动。</li></ol><h4 id="使用命令"><a href="#使用命令" class="headerlink" title="使用命令"></a>使用命令</h4><pre><code>/etc/init.d/kms start           # 启动/etc/init.d/kms stop            # 停止/etc/init.d/kms restart         # 重启/etc/init.d/kms status          # 状态</code></pre><h4 id="卸载"><a href="#卸载" class="headerlink" title="卸载"></a>卸载</h4><p>使用 root 用户登录，运行以下命令：</p><pre><code>./kms.sh uninstall</code></pre><h4 id="使用-KMS-服务"><a href="#使用-KMS-服务" class="headerlink" title="使用 KMS 服务"></a>使用 KMS 服务</h4><p>KMS 服务，用于在线激活 VOL 版本的 Windows 和 Office。<br>激活的前提是你的系统是批量授权版本，即 VL 版，一般企业版都是 VL 版。而 VL 版本的镜像一般内置 GVLK key，用于 KMS 激活。<br>下面列表里面含有的产品的 VL 版本或者能使用 key 进入 KMS 通道的产品，都支持使用 KMS 激活。<br>使用管理员权限运行 cmd 查看系统版本，命令如下：</p><pre><code>wmic os get caption</code></pre><p>使用管理员权限运行 cmd 安装从上面列表得到的 key，命令如下：</p><pre><code>slmgr /ipk xxxxx-xxxxx-xxxxx-xxxxx-xxxxx</code></pre><p>使用管理员权限运行 cmd 将 KMS 服务器地址设置为你自己的 IP 或 域名，后面最好再加上端口号（:1688），命令如下：</p><pre><code>slmgr /skms Your IP or Domain:1688</code></pre><p>注意：本脚本所做的工作就是此步骤。当你的 KMS 服务出于启动状态，那么此处就可以设置为你自己的 KMS 服务器地址。<br>使用管理员权限运行 cmd 手动激活系统，命令如下：</p><pre><code>slmgr /ato</code></pre><p>关于 <code>Office</code> 的激活，要求必须是 VOL 版本，否则无法激活。<br>找到你的 <code>Office</code> 安装目录，32 位默认一般为 <code>C:\Program Files (x86)\Microsoft Office\Office16</code><br>64 位默认一般为<code>C:\Program Files\Microsoft Office\Office16</code><br><code>Office16</code> 是 <code>Office 2016</code>，<code>Office15</code> 就是 <code>Office 2013</code>，<code>Office14</code> 就是<code>Office 2010</code>。<br>打开以上所说的目录，应该有个 <code>OSPP.VBS</code> 文件。<br>使用管理员权限运行 <code>cmd</code> 进入 <code>Office</code> 目录，命令如下：</p><pre><code>cd &quot;C:\Program Files (x86)\Microsoft Office\Office16&quot;</code></pre><p>使用管理员权限运行 cmd 注册 KMS 服务器地址：</p><pre><code>cscript ospp.vbs /sethst:Your IP or Domain</code></pre><p>使用管理员权限运行 cmd 手动激活 Office，命令如下：</p><pre><code>cscript ospp.vbs /act</code></pre><p>注意： KMS 方式激活，其有效期只有 180 天。<br>每隔一段时间系统会自动向 KMS 服务器请求续期，请确保你自己的 KMS 服务正常运行。<br>参考链接:<a href="https://03k.org/kms.html" target="_blank" rel="noopener">https://03k.org/kms.html</a></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;Linux一键脚本&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Linux" scheme="https://blog.yinuxy.com/categories/Linux/"/>
    
    
      <category term="Linux Shell" scheme="https://blog.yinuxy.com/tags/Linux-Shell/"/>
    
  </entry>
  
  <entry>
    <title>Linux常用命令大全（整理自用）</title>
    <link href="https://blog.yinuxy.com/post/Experience/LinuxShell/"/>
    <id>https://blog.yinuxy.com/post/Experience/LinuxShell/</id>
    <published>2020-03-07T14:48:21.000Z</published>
    <updated>2020-07-14T13:52:12.059Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">Linux常用命令大全（整理自用）</font></center></blockquote><a id="more"></a><h2 id="ls命令"><a href="#ls命令" class="headerlink" title="ls命令"></a>ls命令</h2><ol><li>查看 linux 文件夹包含的文件</li><li>查看文件权限(包括目录、文件夹、文件权限)</li><li>查看目录信息<h3 id="常用参数搭配"><a href="#常用参数搭配" class="headerlink" title="常用参数搭配"></a>常用参数搭配</h3><pre><code>ls -a 列出目录所有文件，包含以.开始的隐藏文件ls -A 列出除.及..的其它文件ls -r 反序排列ls -t 以文件修改时间排序ls -S 以文件大小排序ls -h 以易读大小显示ls -l 除了文件名之外，还将文件的权限、所有者、文件大小等信息详细列出来</code></pre><h3 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h3>按易读方式按时间反序排序，并显示文件详细信息<pre><code>ls -lhrt</code></pre>按大小反序显示文件详细信息<pre><code>ls -lrS</code></pre>列出当前目录中所有以”t”开头的目录的详细内容<pre><code>ls -l t*</code></pre>列出文件绝对路径（不包含隐藏文件）<pre><code>ls | sed &quot;s:^:`pwd`/:&quot;</code></pre>列出文件绝对路径（包含隐藏文件）<pre><code>find $pwd -maxdepth 1 | xargs ls -ld</code></pre></li></ol><h2 id="cd-命令"><a href="#cd-命令" class="headerlink" title="cd 命令"></a>cd 命令</h2><p>cd(changeDirectory) 命令语法：</p><pre><code>cd [dirName]     #切换当前目录至 dirName。</code></pre><h3 id="实例-1"><a href="#实例-1" class="headerlink" title="实例"></a>实例</h3><p>进入上一次工作路径</p><pre><code>cd -</code></pre><p>把上个命令的参数作为cd参数使用。</p><pre><code>cd !$</code></pre><h2 id="pwd-命令"><a href="#pwd-命令" class="headerlink" title="pwd 命令"></a>pwd 命令</h2><p>pwd 命令用于查看当前工作目录路径。</p><h3 id="实例-2"><a href="#实例-2" class="headerlink" title="实例"></a>实例</h3><p>查看当前路径</p><pre><code>pwd</code></pre><p>查看软链接的实际路径</p><pre><code>pwd -P</code></pre><h2 id="mkdir-命令"><a href="#mkdir-命令" class="headerlink" title="mkdir 命令"></a>mkdir 命令</h2><p>mkdir 命令用于创建文件夹。<br>可用选项：<br>    -m: 对新建目录设置存取权限，也可以用 chmod 命令设置;<br>    -p: 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后，系统将自动建立好那些尚不在的目录，即一次可以建立多个目录。</p><h2 id="rm-命令"><a href="#rm-命令" class="headerlink" title="rm 命令"></a>rm 命令</h2><p>删除一个目录中的一个或多个文件或目录，如果没有使用 -r 选项，则 rm 不会删除目录。如果使用 rm 来删除文件，通常仍可以将该文件恢复原状。</p><pre><code>rm [选项] 文件…</code></pre><h3 id="实例-3"><a href="#实例-3" class="headerlink" title="实例"></a>实例</h3><p>删除任何 .log 文件，删除前逐一询问确认：</p><pre><code>rm -i *.log</code></pre><p>删除 test 子目录及子目录中所有档案删除，并且不用一一确认：</p><pre><code>rm -rf test</code></pre><p>删除以 -f 开头的文件</p><pre><code>rm -- -f*</code></pre><h2 id="rmdir-命令"><a href="#rmdir-命令" class="headerlink" title="rmdir 命令"></a>rmdir 命令</h2><p>从一个目录中删除一个或多个子目录项，删除某目录时也必须具有对其父目录的写权限。</p><p>::: warning<br>不能删除非空目录<br>:::</p><h3 id="实例-4"><a href="#实例-4" class="headerlink" title="实例"></a>实例</h3><p>当 parent 子目录被删除后使它也成为空目录的话，则顺便一并删除：</p><pre><code>rmdir -p parent/child/child11</code></pre><h2 id="mv-命令"><a href="#mv-命令" class="headerlink" title="mv 命令"></a>mv 命令</h2><p>移动文件或修改文件名，根据第二参数类型（如目录，则移动文件；如为文件则重命令该文件）。</p><h3 id="实例-5"><a href="#实例-5" class="headerlink" title="实例"></a>实例</h3><p>将文件 test.log 重命名为 test1.txt</p><pre><code>mv test.log test1.txt</code></pre><p>将文件 log1.txt,log2.txt,log3.txt 移动到根的 test3 目录中</p><pre><code>mv llog1.txt log2.txt log3.txt /test3</code></pre><p>将文件 file1 改名为 file2，如果 file2 已经存在，则询问是否覆盖</p><pre><code>mv -i log1.txt log2.txt</code></pre><p>移动当前文件夹下的所有文件到上一级目录</p><pre><code>mv * ../</code></pre><h2 id="cp-命令"><a href="#cp-命令" class="headerlink" title="cp 命令"></a>cp 命令</h2><p>将源文件复制至目标文件，或将多个源文件复制至目标目录。<br>::: warning<br>命令行复制，如果目标文件已经存在会提示是否覆盖，而在 shell 脚本中，如果不加 -i 参数，则不会提示，而是直接覆盖！<br>:::</p><h3 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h3><pre><code>-i 提示-r 复制目录及目录内所有项目-a 复制的文件与原文件时间一样</code></pre><h3 id="实例-6"><a href="#实例-6" class="headerlink" title="实例"></a>实例</h3><p>复制 a.txt 到 test 目录下，保持原文件时间，如果原文件存在提示是否覆盖。</p><pre><code>cp -ai a.txt test</code></pre><p>为 a.txt 建议一个链接（快捷方式）</p><pre><code>cp -s a.txt link_a.txt</code></pre><h2 id="cat-命令"><a href="#cat-命令" class="headerlink" title="cat 命令"></a>cat 命令</h2><p>cat 主要有三大功能：</p><ol><li>一次显示整个文件:<pre><code>cat filename</code></pre></li><li>从键盘创建一个文件:<pre><code>cat &gt; filename</code></pre></li><li>将几个文件合并为一个文件:<pre><code>cat file1 file2 &gt; file</code></pre> -b 对非空输出行号<br> -n 输出所有行号</li></ol><h3 id="实例-7"><a href="#实例-7" class="headerlink" title="实例"></a>实例</h3><p>把 log2012.log 的文件内容加上行号后输入 log2013.log 这个文件里</p><pre><code>cat -n log2012.log log2013.log</code></pre><p>把 log2012.log 和 log2013.log 的文件内容加上行号（空白行不加）之后将内容附加到 log.log 里</p><pre><code>cat -b log2012.log log2013.log log.log</code></pre><p>使用 here doc 生成新文件</p><pre><code>cat &gt;log.txt &lt;&lt;EOF&gt;Hello&gt;World&gt;PWD=$(pwd)&gt;EOFls -l log.txtcat log.txtHelloWorldPWD=/opt/soft/test</code></pre><p>反向列示</p><pre><code>tac log.txtPWD=/opt/soft/testWorldHello</code></pre><h2 id="more-命令"><a href="#more-命令" class="headerlink" title="more 命令"></a>more 命令</h2><h3 id="命令参数"><a href="#命令参数" class="headerlink" title="命令参数"></a>命令参数</h3><p>功能类似于 cat, more 会以一页一页的显示方便使用者逐页阅读，而最基本的指令就是按空白键（space）就往下一页显示，按 b 键就会往回（back）一页显示。</p><pre><code>+n      从笫 n 行开始显示-n       定义屏幕大小为n行+/pattern 在每个档案显示前搜寻该字串（pattern），然后从该字串前两行之后开始显示 -c       从顶部清屏，然后显示-d       提示“Press space to continue，’q’ to quit（按空格键继续，按q键退出）”，禁用响铃功能-l        忽略Ctrl+l（换页）字符-p       通过清除窗口而不是滚屏来对文件进行换页，与-c选项相似-s       把连续的多个空行显示为一行-u       把文件内容中的下画线去掉</code></pre><h3 id="常用操作命令"><a href="#常用操作命令" class="headerlink" title="常用操作命令"></a>常用操作命令</h3><pre><code>Enter    向下 n 行，需要定义。默认为 1 行Ctrl+F   向下滚动一屏空格键  向下滚动一屏Ctrl+B  返回上一屏=       输出当前行的行号:f     输出文件名和当前行的行号V      调用vi编辑器!命令   调用Shell，并执行命令q       退出more</code></pre><h3 id="实例-8"><a href="#实例-8" class="headerlink" title="实例"></a>实例</h3><p>显示文件中从第3行起的内容</p><pre><code>more +3 text.txt</code></pre><p>在所列出文件目录详细信息，借助管道使每次显示 5 行</p><pre><code>ls -l | more -5</code></pre><h2 id="less-命令"><a href="#less-命令" class="headerlink" title="less 命令"></a>less 命令</h2><p>less 与 more 类似，但使用 less 可以随意浏览文件，而 more 仅能向前移动，却不能向后移动，而且 less 在查看之前不会加载整个文件。</p><h3 id="常用命令参数"><a href="#常用命令参数" class="headerlink" title="常用命令参数"></a>常用命令参数</h3><pre><code>-i  忽略搜索时的大小写-N  显示每行的行号-o  &lt;文件名&gt; 将less 输出的内容在指定文件中保存起来-s  显示连续空行为一行/字符串：向下搜索“字符串”的功能?字符串：向上搜索“字符串”的功能n：重复前一个搜索（与 / 或 ? 有关）N：反向重复前一个搜索（与 / 或 ? 有关）-x &lt;数字&gt; 将“tab”键显示为规定的数字空格b  向后翻一页d  向后翻半页h  显示帮助界面Q  退出less 命令u  向前滚动半页y  向前滚动一行空格键 滚动一行回车键 滚动一页[pagedown]： 向下翻动一页[pageup]：   向上翻动一页</code></pre><h3 id="实例-9"><a href="#实例-9" class="headerlink" title="实例"></a>实例</h3><p>ps 查看进程信息并通过 less 分页显示</p><pre><code>ps -aux | less -N</code></pre><p>查看多个文件</p><pre><code>less 1.log 2.log</code></pre><p>可以使用 n 查看下一个，使用 p 查看前一个。</p><h2 id="tail-命令"><a href="#tail-命令" class="headerlink" title="tail 命令"></a>tail 命令</h2><p>用于显示指定文件末尾内容，不指定文件时，作为输入信息进行处理。常用查看日志文件。</p><h3 id="常用参数"><a href="#常用参数" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-f 循环读取（常用于查看递增的日志文件）-n&lt;行数&gt; 显示行数（从后向前）</code></pre><h3 id="实例-10"><a href="#实例-10" class="headerlink" title="实例"></a>实例</h3><p>循环读取逐渐增加的文件内容</p><pre><code>ping 127.0.0.1 &gt; ping.log &amp;</code></pre><p>后台运行：可使用 jobs -l 查看，也可使用 fg 将其移到前台运行。</p><pre><code>tail -f ping.log</code></pre><h2 id="which-命令"><a href="#which-命令" class="headerlink" title="which 命令"></a>which 命令</h2><p>在 linux 要查找某个文件，但不知道放在哪里了，可以使用下面的一些命令来搜索：</p><pre><code>which     查看可执行文件的位置。whereis 查看文件的位置。locate  配合数据库查看文件位置。find        实际搜寻硬盘查询文件名称。</code></pre><p>which 是在 PATH 就是指定的路径中，搜索某个系统命令的位置，并返回第一个搜索结果。使用 which 命令，就可以看到某个系统命令是否存在，以及执行的到底是哪一个位置的命令。</p><h3 id="常用参数-1"><a href="#常用参数-1" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-n 　指定文件名长度，指定的长度必须大于或等于所有文件中最长的文件名。</code></pre><h3 id="实例-11"><a href="#实例-11" class="headerlink" title="实例"></a>实例</h3><p>查看 ls 命令是否存在，执行哪个</p><pre><code>which ls</code></pre><p>查看 which</p><pre><code>which which</code></pre><p>查看 cd</p><pre><code>which cd（显示不存在，因为 cd 是内建命令，而 which 查找显示是 PATH 中的命令）</code></pre><p>查看当前 PATH 配置</p><pre><code>echo $PATH</code></pre><p>或使用 env 查看所有环境变量及对应值</p><h2 id="whereis-命令"><a href="#whereis-命令" class="headerlink" title="whereis 命令"></a>whereis 命令</h2><p>whereis 命令只能用于程序名的搜索，而且只搜索二进制文件（参数-b）、man说明文件（参数-m）和源代码文件（参数-s）。如果省略参数，则返回所有信息。whereis 及 locate 都是基于系统内建的数据库进行搜索，因此效率很高，而find则是遍历硬盘查找文件。</p><h3 id="常用参数-2"><a href="#常用参数-2" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-b   定位可执行文件。-m   定位帮助文件。-s   定位源代码文件。-u   搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。</code></pre><h3 id="实例-12"><a href="#实例-12" class="headerlink" title="实例"></a>实例</h3><p>查找 locate 程序相关文件</p><pre><code>whereis locate</code></pre><p>查找 locate 的源码文件</p><pre><code>whereis -s locate</code></pre><h2 id="locate-命令"><a href="#locate-命令" class="headerlink" title="locate 命令"></a>locate 命令</h2><p>locate 通过搜寻系统内建文档数据库达到快速找到档案，数据库由 updatedb 程序来更新，updatedb 是由 cron daemon 周期性调用的。默认情况下 locate 命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快，但较差劲的是 locate 所找到的档案若是最近才建立或 刚更名的，可能会找不到，在内定值中，updatedb 每天会跑一次，可以由修改 crontab 来更新设定值 (etc/crontab)。<br>locate 与 find 命令相似，可以使用如 *、? 等进行正则匹配查找</p><h3 id="常用参数-3"><a href="#常用参数-3" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-l num（要显示的行数）-f   将特定的档案系统排除在外，如将proc排除在外-r   使用正则运算式做为寻找条件</code></pre><h3 id="实例-13"><a href="#实例-13" class="headerlink" title="实例"></a>实例</h3><p>查找和 pwd 相关的所有文件(文件名中包含 pwd）</p><pre><code>locate pwd</code></pre><p>搜索 etc 目录下所有以 sh 开头的文件</p><pre><code>locate /etc/sh</code></pre><p>查找 /var 目录下，以 reason 结尾的文件</p><pre><code>locate -r &#39;^/var.*reason$&#39;      #其中.表示一个字符，*表示任务多个；.*表示任意多个字符</code></pre><h2 id="find-命令"><a href="#find-命令" class="headerlink" title="find 命令"></a>find 命令</h2><p>用于在文件树中查找文件，并作出相应的处理。<br>命令格式：</p><pre><code>find pathname -options [-print -exec -ok ...]</code></pre><h3 id="命令参数-1"><a href="#命令参数-1" class="headerlink" title="命令参数"></a>命令参数</h3><pre><code>pathname: find命令所查找的目录路径。例如用.来表示当前目录，用/来表示系统根目录。-print： find命令将匹配的文件输出到标准输出。-exec： find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为&#39;command&#39; {  } \;，注意{   }和\；之间的空格。-ok： 和-exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。</code></pre><h3 id="命令选项"><a href="#命令选项" class="headerlink" title="命令选项"></a>命令选项</h3><pre><code>-name 按照文件名查找文件-perm 按文件权限查找文件-user 按文件属主查找文件-group  按照文件所属的组来查找文件。-type  查找某一类型的文件，诸如：   b - 块设备文件   d - 目录   c - 字符设备文件   l - 符号链接文件   p - 管道文件   f - 普通文件-size n :[c] 查找文件长度为n块文件，带有c时表文件字节大小-amin n   查找系统中最后N分钟访问的文件-atime n  查找系统中最后n*24小时访问的文件-cmin n   查找系统中最后N分钟被改变文件状态的文件-ctime n  查找系统中最后n*24小时被改变文件状态的文件-mmin n   查找系统中最后N分钟被改变文件数据的文件-mtime n  查找系统中最后n*24小时被改变文件数据的文件(用减号-来限定更改时间在距今n日以内的文件，而用加号+来限定更改时间在距今n日以前的文件。 )-maxdepth n 最大查找目录深度-prune 选项来指出需要忽略的目录。在使用-prune选项时要当心，因为如果你同时使用了-depth选项，那么-prune选项就会被find命令忽略-newer 如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件，可以使用-newer选项</code></pre><h2 id="chmod-命令"><a href="#chmod-命令" class="headerlink" title="chmod 命令"></a>chmod 命令</h2><p>用于改变 linux 系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法；另一种是包含数字的数字设定法。</p><p>每一文件或目录的访问权限都有三组，每组用三位表示，分别为文件属主的读、写和执行权限；与属主同组的用户的读、写和执行权限；系统中其他用户的读、写和执行权限。可使用 ls -l test.txt 查找。<br>以文件 log2012.log 为例：</p><pre><code>-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log</code></pre><p>第一列共有 10 个位置，第一个字符指定了文件类型。在通常意义上，一个目录也是一个文件。如果第一个字符是横线，表示是一个非目录的文件。如果是 d，表示是一个目录。从第二个字符开始到第十个 9 个字符，3 个字符一组，分别表示了 3 组用户对文件或者目录的权限。权限字符用横线代表空许可，r 代表只读，w 代表写，x 代表可执行。</p><h3 id="常用参数-4"><a href="#常用参数-4" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-c 当发生改变时，报告处理信息-R 处理指定目录以及其子目录下所有文件</code></pre><h3 id="权限范围"><a href="#权限范围" class="headerlink" title="权限范围"></a>权限范围</h3><pre><code>u ：目录或者文件的当前的用户g ：目录或者文件的当前的群组o ：除了目录或者文件的当前用户或群组之外的用户或者群组a ：所有的用户及群组</code></pre><h3 id="权限代号"><a href="#权限代号" class="headerlink" title="权限代号"></a>权限代号</h3><pre><code>r ：读权限，用数字4表示w ：写权限，用数字2表示x ：执行权限，用数字1表示- ：删除权限，用数字0表示s ：特殊权限</code></pre><h3 id="实例-14"><a href="#实例-14" class="headerlink" title="实例"></a>实例</h3><p>增加文件 t.log 所有用户可执行权限</p><pre><code>chmod a+x t.log</code></pre><p>撤销原来所有的权限，然后使拥有者具有可读权限,并输出处理信息</p><pre><code>chmod u=r t.log -c</code></pre><p>给 file 的属主分配读、写、执行(7)的权限，给file的所在组分配读、执行(5)的权限，给其他用户分配执行(1)的权限</p><pre><code>chmod 751 t.log -c（或者：chmod u=rwx,g=rx,o=x t.log -c)</code></pre><p>将 test 目录及其子目录所有文件添加可读权限</p><pre><code>chmod u+r,g+r,o+r -R text/ -c</code></pre><h2 id="tar-命令"><a href="#tar-命令" class="headerlink" title="tar 命令"></a>tar 命令</h2><p>用来压缩和解压文件。</p><h3 id="常用参数-5"><a href="#常用参数-5" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-c 建立新的压缩文件-f 指定压缩文件-r 添加文件到已经压缩文件包中-u 添加改了和现有的文件到压缩包中-x 从压缩包中抽取文件-t 显示压缩文件中的内容-z 支持gzip压缩-j 支持bzip2压缩-Z 支持compress解压文件-v 显示操作过程</code></pre><h3 id="实例-15"><a href="#实例-15" class="headerlink" title="实例"></a>实例</h3><p>将文件全部打包成 tar 包</p><pre><code>tar -cvf log.tar 1.log,2.log 或tar -cvf log.*</code></pre><p>/etc 下的所有文件及目录打包到指定目录，并使用 gz 压缩</p><pre><code>tar -zcvf /tmp/etc.tar.gz /etc</code></pre><p>查看刚打包的文件内容（一定加z，因为是使用 gzip 压缩的）</p><pre><code>tar -ztvf /tmp/etc.tar.gz</code></pre><p>要压缩打包 /home, /etc ，但不要 /home/dmtsai</p><pre><code>tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc</code></pre><h2 id="ln-命令"><a href="#ln-命令" class="headerlink" title="ln 命令"></a>ln 命令</h2><p>功能是为文件在另外一个位置建立一个同步的链接，当在不同目录需要该问题时，就不需要为每一个目录创建同样的文件，通过 ln 创建的链接（link）减少磁盘占用量。</p><h3 id="常用参数-6"><a href="#常用参数-6" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-b 删除，覆盖以前建立的链接-s 软链接（符号链接）-v 显示详细处理过程</code></pre><h3 id="实例-16"><a href="#实例-16" class="headerlink" title="实例"></a>实例</h3><p>给文件创建软链接，并显示操作信息</p><pre><code>ln -sv source.log link.log</code></pre><p>给文件创建硬链接，并显示操作信息</p><pre><code>ln -v source.log link1.log</code></pre><p>给目录创建软链接</p><pre><code>ln -sv /opt/soft/test/test3 /opt/soft/test/test5</code></pre><h2 id="grep-命令"><a href="#grep-命令" class="headerlink" title="grep 命令"></a>grep 命令</h2><p>强大的文本搜索命令，grep(Global Regular Expression Print) 全局正则表达式搜索。</p><h3 id="命令格式"><a href="#命令格式" class="headerlink" title="命令格式"></a>命令格式</h3><pre><code>grep [option] pattern file|dir</code></pre><h3 id="常用参数-7"><a href="#常用参数-7" class="headerlink" title="常用参数"></a>常用参数</h3><pre><code>-A n --after-context显示匹配字符后n行-B n --before-context显示匹配字符前n行-C n --context 显示匹配字符前后n行-c --count 计算符合样式的列数-i 忽略大小写-l 只列出文件内容符合指定的样式的文件名称-f 从文件中读取关键词-n 显示匹配内容的所在文件中行数-R 递归查找文件夹</code></pre><h3 id="grep-的规则表达式"><a href="#grep-的规则表达式" class="headerlink" title="grep 的规则表达式"></a>grep 的规则表达式</h3><pre><code>^  #锚定行的开始 如：&#39;^grep&#39;匹配所有以grep开头的行。 $  #锚定行的结束 如：&#39;grep$&#39;匹配所有以grep结尾的行。 .  #匹配一个非换行符的字符 如：&#39;gr.p&#39;匹配gr后接一个任意字符，然后是p。  *  #匹配零个或多个先前字符 如：&#39;*grep&#39;匹配所有一个或多个空格后紧跟grep的行。.*   #一起用代表任意字符。  []   #匹配一个指定范围内的字符，如&#39;[Gg]rep&#39;匹配Grep和grep。 [^]  #匹配一个不在指定范围内的字符，如：&#39;[^A-FH-Z]rep&#39;匹配不包含A-R和T-Z的一个字母开头，紧跟rep的行。  \(..\)  #标记匹配字符，如&#39;\(love\)&#39;，love被标记为1。   \&lt;      #锚定单词的开始，如:&#39;\&lt;grep&#39;匹配包含以grep开头的单词的行。\&gt;      #锚定单词的结束，如&#39;grep\&gt;&#39;匹配包含以grep结尾的单词的行。x\{m\}  #重复字符x，m次，如：&#39;0\{5\}&#39;匹配包含5个o的行。 x\{m,\}  #重复字符x,至少m次，如：&#39;o\{5,\}&#39;匹配至少有5个o的行。  x\{m,n\}  #重复字符x，至少m次，不多于n次，如：&#39;o\{5,10\}&#39;匹配5--10个o的行。  \w    #匹配文字和数字字符，也就是[A-Za-z0-9]，如：&#39;G\w*p&#39;匹配以G后跟零个或多个文字或数字字符，然后是p。  \W    #\w的反置形式，匹配一个或多个非单词字符，如点号句号等。  \b    #单词锁定符，如: &#39;\bgrep\b&#39;只匹配grep。</code></pre><h3 id="实例-17"><a href="#实例-17" class="headerlink" title="实例"></a>实例</h3><p>查找指定进程</p><pre><code>ps -ef | grep svn</code></pre><p>查找指定进程个数</p><pre><code>ps -ef | grep svn -c</code></pre><p>从文件中读取关键词</p><pre><code>cat test1.txt | grep -f key.log</code></pre><p>从文件夹中递归查找以grep开头的行，并只列出文件</p><pre><code>grep -lR &#39;^grep&#39; /tmp</code></pre><p>查找非x开关的行内容</p><pre><code>grep &#39;^[^x]&#39; test.txt</code></pre><p>显示包含 ed 或者 at 字符的内容行</p><pre><code>grep -E &#39;ed|at&#39; test.txt</code></pre><h2 id="ps-命令"><a href="#ps-命令" class="headerlink" title="ps 命令"></a>ps 命令</h2><p>ps(process status)，用来查看当前运行的进程状态，一次性查看，如果需要动态连续结果使用 top</p><p>linux上进程有5种状态:</p><ol><li>运行(正在运行或在运行队列中等待)</li><li>中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)</li><li>不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)</li><li>僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)</li><li>停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)<br>ps 工具标识进程的5种状态码:<pre><code>D 不可中断 uninterruptible sleep (usually IO)R 运行 runnable (on run queue)S 中断 sleepingT 停止 traced or stoppedZ 僵死 a defunct (”zombie”) process</code></pre><h3 id="命令参数-2"><a href="#命令参数-2" class="headerlink" title="命令参数"></a>命令参数</h3>```</li></ol><p>-A 显示所有进程<br>a 显示所有进程<br>-a 显示同一终端下所有进程<br>c 显示进程真实名称<br>e 显示环境变量<br>f 显示进程间的关系<br>r 显示当前终端运行的进程<br>-aux 显示所有包含其它使用的进程</p><pre><code>### 实例 ###显示当前所有进程环境变量及进程间关系</code></pre><p>ps -ef</p><pre><code>显示当前所有进程</code></pre><p>ps -A</p><pre><code>与grep联用查找某进程</code></pre><p>ps -aux | grep apache</p><pre><code>找出与 cron 与 syslog 这两个服务有关的 PID 号码</code></pre><p>ps aux | grep ‘(cron|syslog)’</p><pre><code>## kill 命令 ##发送指定的信号到相应进程。不指定型号将发送SIGTERM（15）终止指定进程。如果任无法终止该程序可用&quot;-KILL&quot; 参数，其发送的信号为SIGKILL(9) ，将强制结束进程，使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程，非root用户只能影响自己的进程。### 常用参数 ###</code></pre><p>-l  信号，若果不加信号的编号参数，则使用“-l”参数会列出全部的信号名称<br>-a  当处理当前进程时，不限制命令名和进程号的对应关系<br>-p  指定kill 命令只打印相关进程的进程号，而不发送任何信号<br>-s  指定发送信号<br>-u  指定用户</p><pre><code>### 实例 ###使用ps查找进程pro1，然后用kill杀掉</code></pre><p>kill -9 $(ps -ef | grep pro1)</p><pre><code></code></pre>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;Linux常用命令大全（整理自用）&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Linux" scheme="https://blog.yinuxy.com/categories/Linux/"/>
    
    
      <category term="Linux Shell" scheme="https://blog.yinuxy.com/tags/Linux-Shell/"/>
    
  </entry>
  
  <entry>
    <title>使用Python爬取知乎上的高颜值小姐姐</title>
    <link href="https://blog.yinuxy.com/post/Script/zhihuPrettyGril/"/>
    <id>https://blog.yinuxy.com/post/Script/zhihuPrettyGril/</id>
    <published>2020-03-06T14:17:17.000Z</published>
    <updated>2020-07-14T13:52:12.124Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5"  face = "楷体">“你见过的有些人能漂亮到什么程度？”</font></center></blockquote><a id="more"></a><h2 id="爬取链接"><a href="#爬取链接" class="headerlink" title="爬取链接"></a>爬取链接</h2><p>原问题在这儿<a href="https://www.zhihu.com/question/266808424" target="_blank" rel="noopener">你见过的有些人能漂亮到什么程度？</a></p><h2 id="爬取思路"><a href="#爬取思路" class="headerlink" title="爬取思路"></a>爬取思路</h2><p>使用Python爬虫爬取这个问题下的高赞照片。</p><ol><li>爬虫爬了下这个问题下的高赞照片。在欣赏小姐姐的美照之前，我们先来分享一下思路。</li><li>通过知乎回答的url，先把回答一页一页的爬下来，存到本地数据库。随后从数据库里读取数据，筛选出高赞的回答，把回答里的图片解析出来。</li></ol><h2 id="函数解析"><a href="#函数解析" class="headerlink" title="函数解析"></a>函数解析</h2><pre><code>def get_answers_by_page(page_no):    offset = page_no * 10    url = &quot;&lt;answer url&gt;&amp;offset={}&amp;limit=10&amp;sort_by=default&amp;platform=desktop&quot;.format(offset)    headers = {        &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36&quot;,    }    r = requests.get(url, verify=False, headers=headers)    content = r.content.decode(&quot;utf-8&quot;)    data = json.loads(content)    is_end = data[&quot;paging&quot;][&quot;is_end&quot;]    items = data[&quot;data&quot;]    client = pymongo.MongoClient()    db = client[&quot;beauty&quot;]    if len(items) &gt; 0:        db.answers.insert_many(items)    return is_enddef get_answers():    page_no = 0    client = pymongo.MongoClient()    while True:        print(page_no)        is_end = get_answers_by_page(page_no)        page_no += 1        if is_end:            breakdef query():    client = pymongo.MongoClient()    db = client[&quot;beauty&quot;]    items = db.answers.find({&quot;voteup_count&quot;: {&quot;$gte&quot;: 100}}).sort([(&quot;voteup_count&quot;, pymongo.DESCENDING)])    count = 0    for item in items:        content = item[&quot;content&quot;]        vote_num = item[&quot;voteup_count&quot;]        author = item[&quot;author&quot;][&quot;name&quot;]        matched = re.findall(r&#39;data-original=&quot;([^&quot;]+)&quot;&#39;, content)        print(&quot;&gt; 来自 {}\n&quot;.format(item[&quot;url&quot;]))        print(&quot;&gt; 作者 {}\n&quot;.format(author))        print(&quot;&gt; 赞数 {}\n&quot;.format(vote_num))        img_urls = []        for img_url in matched:            if img_url not in img_urls:                print(&quot;![]({})&quot;.format(img_url))                img_urls.append(img_url)        count += len(img_urls)        print(&quot;\n\n&quot;)    print(count)</code></pre><p><code>get_answers_by_page</code> - 这个函数用于获取一页的回答内容，获取的内容会存到本地MongoDB里<br><code>get_answers</code> - 这个函数用于获取所有页的内容，它会调用上面的函数，循环获取每一页的内容<br><code>query</code> - 这个函数用于从MongoDB里查询数据，筛选高赞回答，并且把结果打印出来</p><p>如果要完整的运行这个项目，大家可以下载源代码后，在本地运行。<br>运行项目后，程序会筛选出所有赞数大于100的回答，并且把回答里的图片整理出来。赞数越高的回答，小姐姐的颜值越高。</p><h2 id="源码下载"><a href="#源码下载" class="headerlink" title="源码下载"></a>源码下载</h2><p><btn center large><a href="https://github.com/InfiniteYinux/Python/tree/master/pythonScript/zhihu-pretty-girl" target="_blank" rel="noopener"><i class='fas fa-download'></i> 源码下载</a></btn></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot;  face = &quot;楷体&quot;&gt;“你见过的有些人能漂亮到什么程度？”&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Python" scheme="https://blog.yinuxy.com/categories/Python/"/>
    
    
      <category term="Python" scheme="https://blog.yinuxy.com/tags/Python/"/>
    
      <category term="爬虫" scheme="https://blog.yinuxy.com/tags/%E7%88%AC%E8%99%AB/"/>
    
  </entry>
  
  <entry>
    <title>Maven学习心得（情人节快乐！）</title>
    <link href="https://blog.yinuxy.com/post/Experience/MavenShell/"/>
    <id>https://blog.yinuxy.com/post/Experience/MavenShell/</id>
    <published>2020-02-14T11:43:16.000Z</published>
    <updated>2020-07-14T13:52:12.069Z</updated>
    
    <content type="html"><![CDATA[<blockquote><center><font  size = "5" color = "#1BC3FB"  face = "楷体">Maven学习心得（祝天下码农终成眷属！）</font></center></blockquote><a id="more"></a><h1 id="Maven介绍及环境搭建"><a href="#Maven介绍及环境搭建" class="headerlink" title="Maven介绍及环境搭建"></a>Maven介绍及环境搭建</h1><h2 id="Maven是什么"><a href="#Maven是什么" class="headerlink" title="Maven是什么"></a>Maven是什么</h2><ol><li>Maven是基于项目对象模型(POM)，可以通过一小段描述信息来管理项目的构建，报告和文档的项目管理工具软件。</li><li>Maven 除了以程序构建能力为特色之外，还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性，所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法，许多 Apache Jakarta 项目发文时使用 Maven，而且公司项目采用 Maven 的比例在持续增长。</li><li>Maven这个单词来自于意第绪语（犹太语），意为知识的积累，最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目（有各自Ant build文件），仅有细微的差别，而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目，一个清晰的方式定义项目的组成，一个容易的方式发布项目的信息，以及一种简单的方式在多个项目中共享JARs。</li></ol><h2 id="Maven环境搭建"><a href="#Maven环境搭建" class="headerlink" title="Maven环境搭建"></a>Maven环境搭建</h2><p>参考<a href="https://blog.csdn.net/qq_28289405/article/details/88305269" target="_blank" rel="noopener">maven 安装以及环境变量配置</a></p><h1 id="Maven案例创建"><a href="#Maven案例创建" class="headerlink" title="Maven案例创建"></a>Maven案例创建</h1><h2 id="Maven目录结构"><a href="#Maven目录结构" class="headerlink" title="Maven目录结构"></a>Maven目录结构</h2><p><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_1.png" alt=""></p><ol><li>首先创建文件夹命名为<code>src</code></li><li>在<code>src</code>目录下分别创建子目录<code>main</code>和<code>test</code></li><li>在<code>main</code>和<code>test</code>目录下各创建一个子目录<code>java</code></li></ol><h2 id="创建HelloMaven"><a href="#创建HelloMaven" class="headerlink" title="创建HelloMaven"></a>创建HelloMaven</h2><ol><li><p>在<code>main</code>目录的<code>java</code>目录下创建如下目录并创建<code>HellowWorld.java</code>Java类文件<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_2.png" alt=""></p><pre><code>public class HelloWorld { public String sayHello(){     return &quot;Hello World!&quot;; }}</code></pre></li><li><p>在<code>test</code>目录的<code>java</code>目录下创建如下目录并创建<code>testHello.java</code>Java类文件<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_3.png" alt=""></p><pre><code>import org.junit.*;import org.junit.Assert.*;public class HellOWorldTest { @Test public void testHello() {     Assert.assertEquals(&quot;Hello World!&quot;,new HelloWorld().sayHello()); }}</code></pre></li><li><p>在<code>src</code>根目录下创建<code>pom.xml</code>编写代码如下：<br><img src="https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@3.0.8/images/bitmap.gif" data-original="https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_4.png" alt=""></p><pre><code>&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;   xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;   &lt;!-- 模型版本。maven2.0必须是这样写，现在是maven2唯一支持的版本 --&gt;   &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;   &lt;!-- 公司或者组织的唯一标志，并且配置时生成的路径也是由此生成， 如com.winner.trade，maven会将该项目打成的jar包放本地路径：/com/winner/trade --&gt;   &lt;groupId&gt;com.study&lt;/groupId&gt;   &lt;!-- 本项目的唯一ID，一个groupId下面可能多个项目，就是靠artifactId来区分的 --&gt;   &lt;artifactId&gt;study-model&lt;/artifactId&gt;   &lt;!-- 本项目目前所处的版本号 --&gt;   &lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;   &lt;!-- 打包的机制，如pom,jar, maven-plugin, ejb, war, ear, rar, par，默认为jar --&gt;   &lt;packaging&gt;jar&lt;/packaging&gt;   &lt;!-- 定义本项目的依赖关系 --&gt;   &lt;dependencies&gt;       &lt;!-- 每个dependency都对应这一个jar包 --&gt;       &lt;dependency&gt;           &lt;!--一般情况下，maven是通过groupId、artifactId、version这三个元素值（俗称坐标）来检索该构件， 然后引入你的工程。如果别人想引用你现在开发的这个项目（前提是已开发完毕并发布到了远程仓库），--&gt;            &lt;!--就需要在他的pom文件中新建一个dependency节点，将本项目的groupId、artifactId、version写入， maven就会把你上传的jar包下载到他的本地 --&gt;           &lt;groupId&gt;junit&lt;/groupId&gt;           &lt;artifactId&gt;junit&lt;/artifactId&gt;           &lt;version&gt;4.10&lt;/version&gt;     &lt;/dependency&gt;   &lt;/dependencies&gt;  </code></pre></li></ol></project>  ```4. 打开命令提示行，进入到HelloWorld项目的根目录中输入`mvn compile`回车运行对该项目进行编译（如果是第一次运行Maven会在运行之前下载很多第三方的插件和Maven所依赖的jar）.![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_5.png)出现`BUILD SUCCESS`即表示项目运行成功~![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_6.png)5. 运行测试例，输入`mvn test`:![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_7.png)测试例成功运行，并且无任何报错~6. 接下来看一下项目的根目录下会有哪些变化：![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_8.png)它默认生成了一个`target`文件夹，打开它，在`classes`目录下存放着生成的字节码文件;`surefire-reports`下存放着生成的测试报告；![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_9.png)7. 下面再去命令行键入`mvn package`：![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_10.png)完美运行！可以看到在`target`目录下生成了一个`study-model-1.0.0-SNAPSHOT.jar`的jar包![](https://cdn.jsdelivr.net/gh/InfiniteYinux/cloud@2.45/img/Learndiary/Maven001/output_11.png)]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;center&gt;&lt;font  size = &quot;5&quot; color = &quot;#1BC3FB&quot;  face = &quot;楷体&quot;&gt;Maven学习心得（祝天下码农终成眷属！）&lt;/font&gt;&lt;/center&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="Docker" scheme="https://blog.yinuxy.com/categories/Docker/"/>
    
    
  </entry>
  
</feed>
