<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>简单 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E7%AE%80%E5%8D%95/</link><description>Recent content in 简单 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 11 Dec 2019 10:22:50 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E7%AE%80%E5%8D%95/index.xml" rel="self" type="application/rss+xml"/><item><title>Java两种方法实现简单爬虫</title><link>https://pangyd.com/post/229-java/</link><pubDate>Thu, 28 Nov 2019 16:21:04 +0800</pubDate><guid>https://pangyd.com/post/229-java/</guid><description>&lt;p>第一种：利用HttpClient和Jsoup爬取网站数据&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Java" class="layui-code" skin="notepad">package com.company;
&lt;p>import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;&lt;/p>
&lt;p>public class Main {&lt;/p>
&lt;pre>&lt;code>public static void main (String[] args) throws Exception {
 // 创建默认的客户端实例
 CloseableHttpClient httpClient = HttpClients.createDefault();

 // 创建get请求实例
 HttpGet httpget = new HttpGet(&amp;quot;/&amp;quot;);

 System.out.println(&amp;quot;executing request &amp;quot; + httpget.getURI());
 String content = &amp;quot;&amp;quot;;

 try {
 // 客户端执行get请求返回响应
 CloseableHttpResponse response = httpClient.execute(httpget);

 // 服务器响应状态行
 System.out.println(response.getStatusLine().toString());

 Header[] heads = response.getAllHeaders();
 HttpEntity entity = response.getEntity();

 if (entity != null) {
 content += EntityUtils.toString(entity, &amp;quot;utf-8&amp;quot;);
 EntityUtils.consume(entity);// 关闭内容流
 }

 System.out.println(content);
 System.out.println(response.getHeaders(&amp;quot;Content-Type&amp;quot;));
 // 打印所有响应头

 for(Header h:heads){
 System.out.println(h.getName()+&amp;quot;:&amp;quot;+h.getValue());
 }
 } finally {
 httpClient.close();
 }
}
&lt;/code>&lt;/pre>
&lt;p>}&lt;/p></description></item><item><title>Matplotlib可视化库的简单使用</title><link>https://pangyd.com/post/224-matplotlib/</link><pubDate>Thu, 24 Oct 2019 15:24:00 +0800</pubDate><guid>https://pangyd.com/post/224-matplotlib/</guid><description>&lt;p>常见的图表类型&lt;/p>&lt;p>直方图：适用比较数据之间的多少；折线图：反映一组数据的变化趋势；条形图：显示各个项目之间的比较情况&amp;nbsp; 和直方图有类似的作用；饼图；散点图：显示若干数据系列中各数值之间的关系 类似X，Y轴，判读两变量之间是否存在某种关联；箱型图：识别异常值方面有一定的优越性&lt;/p>&lt;p>直方图与条形图的具体区别如下：&lt;/p>&lt;p>首先，条形图用条形的长度表示各类别频率快的多少&amp;nbsp; 其宽度是固定的&amp;nbsp; 直方图是用面积表示各组频数的多少&amp;nbsp; 矩形的高度表示每一组的频数和频率，，宽度则表示各组的组距，因此其高度与宽度均有意义。其次，由于分组数据具有连续性 所以直方图的各矩形通常都是连续排列的&amp;nbsp; 而条形图则是分开排列的&amp;nbsp; 最后 条形图主要用于展示分类数据&amp;nbsp; 而直方图则主要用于展示数据型数据。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>1通过subplot创建单个子图&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#分成2*2的矩阵区域 
plt.subplot(221)
plt.plot(nums,nums)
plt.subplot(222)
plt.plot(nums,-nums)
plt.subplot(212)
plt.plot(nums,nums**2)
plt.show()&lt;/pre>&lt;p>2通过subplots创建多个子图&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">#生成包含1～100之间所有整数数组
nums = np.arange(1,101)
#分成2*2的矩阵区域 返回子图数组axes
fig,axes = plt.subplots(2,2)
axes[0,0].plot(nums,nums)
&lt;p>plt.show()&lt;img src="https://pangyd.com/uploads/2019/10/ef0d7566a3745997.png">&lt;/p>&lt;/pre>&lt;p>3通过add_subplot添加和选中子图&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">fig = plt.figure()
#添加子图
fig.add_subplot(2,2,1)
fig.add_subplot(2,2,2)
fig.add_subplot(2,2,4)
fig.add_subplot(2,2,3)
#在子图上作图
random_arr = np.random.randn(100)
#默认是在最后一次使用subplot的位置上作图 即编号为3的位置
plt.plot(random_arr)
&lt;p>plt.show()&lt;img src="https://pangyd.com/uploads/2019/10/d818a87fb38a28b7.png">&lt;/p>&lt;/pre>&lt;p>4添加各类标签&lt;/p>&lt;p>图表添加标签和图例的常用函数&lt;/p>&lt;p>title():设置当前轴的标题&lt;/p>&lt;p>xlabel():设置当前图形X轴的标签名称&lt;/p>&lt;p>ylabel():设置当前图形Y轴的标签名称&lt;/p>&lt;p>xticks():指定X轴刻度的数目与取值&lt;/p>&lt;p>yticks():指定Y轴刻度的数目与取值&lt;/p>&lt;p>xlim():设置或获取当前图形X轴的范围&lt;/p>&lt;p>ylim():设置或获取的当前图形Y轴的范围&lt;/p>&lt;p>legend():在轴上放置一个图例&lt;/p>&lt;p>&lt;/p>&lt;pre lay-lang="Python" class="layui-code" skin="notepad">import numpy as np
data = np.arange(0,1.1,0.01)
plt.title('Title')
plt.xlabel('x')
plt.ylabel('y')
#设置x和y轴的刻度
plt.xticks([0,0.5,1])
plt.yticks([0,0.5,1.0])
plt.plot(data,data**2,lineStyle='-.')
plt.plot(data,data**3)
plt.legend(['y=x^2','y=x^3'])
&lt;p>plt.show(&lt;img src="https://pangyd.com/uploads/2019/10/3e3685c1adefb804.png">&lt;/p></description></item><item><title>java mail实现Email的发送,完整代码</title><link>https://pangyd.com/post/182-java-mailemail/</link><pubDate>Sun, 26 Nov 2017 18:34:36 +0800</pubDate><guid>https://pangyd.com/post/182-java-mailemail/</guid><description>&lt;p>1、对应用程序配置邮件会话&lt;/p>&lt;p>javax.mail.Session保存邮件系统的配置属性和提供用户验证的信息，发送email首先要获取session对象。&lt;/p>&lt;p>(1)Session.getInstance(java.util.Properties)获取非共享的session对象&lt;/p>&lt;p>(2)Session.getDefaultInstance(java.utilProperties)获取共享的session对象&lt;/p>&lt;p>&amp;nbsp;&amp;nbsp;&amp;nbsp; 两者都必须建立Properties prop=new Properties()对象;&lt;/p>&lt;p>&lt;span>注意：&lt;/span>一般对单用户桌面应用程序使用共享Session对象。&lt;/p>&lt;p>用SMTP协议发送Email时通常要设置mail.smtp.host(mail.protocol.host协议特定邮件服务器名)属性。&lt;/p>&lt;p>prop.put("mail.smtp.host","smtp.mailServer.com");&lt;/p>&lt;p>Session mailSession=Session.getInstance(prop);&lt;/p>&lt;p>&lt;span>注意：&lt;/span>在真正使用创建的过程中，往往会让我们验证密码，这是我们要写一个密码验证类。javax.mail.Authenticator是一个抽象类，我们要写MyAuthenticator的密码验证类，该类继承Authenticator实现：&lt;/p>&lt;p>&amp;nbsp;protected PasswordAuthentication getPasswordAuthentication(){&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new PasswordAuthentication(String userName, String password);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br>&amp;nbsp; }&lt;/p>&lt;p>这时我们创建Session对象：&lt;/p>&lt;p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Session mailSession=Session.getInstance(prop,new MyAuthenticator(userName,Password));&lt;/p>&lt;p>&lt;span>并且要设置使用验证&lt;/span>：prop.put("mail.smtp.auth","true");&lt;/p>&lt;p>&lt;span>使用 STARTTLS安全连接&lt;/span>:prop.put("mail.smtp.starttls.enable","true");&lt;/p>&lt;p>2、配置邮件会话之后，要编写消息&lt;/p>&lt;p>要编写消息就要生成javax.mail.Message子类的实例或对Internet邮件使用javax.mail.interet.MimeMessage类。&lt;/p>&lt;p>(1)建立MimeMessage对象&lt;/p>&lt;p>MimeMessage扩展抽象的Message类，构造MimeMessage对象：&lt;/p>&lt;p>MimeMessage message=new MimeMessage(mailSession);&lt;/p>&lt;p>(2)消息发送者、日期、主题&amp;nbsp;&lt;/p>&lt;p>message.setFrom(Address theSender);&lt;/p>&lt;p>message.setSentDate(java.util.Date theDate);&lt;/p>&lt;p>message.setSubject(String theSubject);&lt;/p>&lt;p>(3)设置消息的接受者与发送者（寻址接收）&lt;/p>&lt;p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setRecipient(Message.RecipientType type , Address theAddress)、setRecipients(Message.RecipientType type , Address[] theAddress)、addRecipient(Message.RecipientType type , Address theAddress)、addRecipients(Message.RecipientType type,Address[] theAddress)方法都可以指定接受者类型，但是一般用后两个，这样可以避免意外的替换或者覆盖接受者名单。定义接受者类型：&lt;/p>&lt;p>Message.RecipientType.TO：消息接受者&lt;/p>&lt;p>Message.RecipientType.CC：消息抄送者&lt;/p>&lt;p>Message.RecipientType.BCC：匿名抄送接收者(其他接受者看不到这个接受者的姓名和地址)&lt;/p>&lt;p>(4)设置消息内容&lt;/p>&lt;p>JavaMail基于JavaBean Activation FrameWork(JAF)，JAF可以构造文本消息也可以支持附件。&lt;/p>&lt;p>设置消息内容时，要提供消息的内容类型-----即方法签名:&lt;/p></description></item></channel></rss>