为什么80%的码农都做不了架构师?>>>   

本文介绍的就是把雅虎心香一脉(http://soul.cn.yahoo.com/)每天的那4篇文章全文发到指定邮箱,没有广告,没有其他内容,就文章本身。用到的东西:jmail、jsoup、httpclient。我的本意其实就是想要个那4篇文章的feed,可是搜了一下雅虎没有提供,只好自己想办法解决了。这个感觉是比较笨的方法,还有个简单的方法来制作feed,这个在下篇博文中会介绍。

上面3个东西分别是用来干什么的呢?jmail就是用来发送邮件的了,jsoup是用来解析html,httpclient是用来发送请求的。想更进一步的了解请自行google。

项目结构:
          XinXiangYiMai
                    --lib
                    --src
                        --com.xx.yahoo
                        --com.xx.util

项目代码

package com.xx.yahoo;/*** Created with IntelliJ IDEA.* User: xx* Date: 13-3-27* Time: 上午11:39* DoWhat:文章*/
public class Article {private String title;private String author;private String createTime;private String content;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}
package com.xx.yahoo;import com.xx.util.MyTimeUtil;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;/*** Created with IntelliJ IDEA.* User: xx* Date: 13-3-26* Time: 下午5:55* DoWhat:获取url的返回的网页源码*/public class ResourceHtml {/*** 根据url获得页面源码* @param url* @return*/public static String getHtmlByUrl(String url) {String html = null;HttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(url);try {HttpResponse httpResponse = httpClient.execute(httpGet);int state = httpResponse.getStatusLine().getStatusCode();if (state == HttpStatus.SC_OK) {HttpEntity entity = httpResponse.getEntity();html = EntityUtils.toString(entity);}} catch (IOException e) {e.printStackTrace();} finally {httpClient.getConnectionManager().shutdown();}return html;}/*** 获取页面源码中的链接** @param html* @return*/public static List<String> getArticleLinks(String html, String css) {List<String> list = getArticleLinks(html, css, null);return list;}/*** 获取页面源码中的链接* @param html* @param css1* @param css2* @return*/public static List<String> getArticleLinks(String html, String css1, String css2) {List<String> list = new ArrayList<String>();Document doc = getDocument(html);Elements elements1 = doc.select(css1);for (Element e : elements1) {String href = e.attr("href");list.add(href);}if (css2 != null && !css2.isEmpty()) {Elements elements2 = doc.select(css2);for (Element e : elements2) {String href = e.attr("href");list.add(href);}}return list;}/*** 获取一篇文章,纯文本** @param url*/public static Article doArticle(String url) {String html = getHtmlByUrl(url);Document doc = getDocument(html);Element title = doc.select("div.title > h2").first();Element author = doc.select("div.title > p").first();String createTime = MyTimeUtil.getNowStr("yyyyMMdd");Element div = doc.select("div.article_p").first();String temp = div.html();String content = temp.replaceAll("<[^>]*>","");Article article = new Article();article.setTitle(title.text());article.setAuthor(author.text());article.setCreateTime(createTime);article.setContent(content);return article;}/*** 获取一篇文章,带html标签的* @param url* @return*/public static Article doHtmlArticle(String url) {String html = getHtmlByUrl(url);Document doc = getDocument(html);Element title = doc.select("div.title > h2").first();Element author = doc.select("div.title > p").first();String createTime = MyTimeUtil.getNowStr("yyyyMMdd");Element div = doc.select("div.article_p").first();String temp = div.html();Article article = new Article();article.setTitle(title.text());article.setAuthor(author.text());article.setCreateTime(createTime);article.setContent(temp);return article;}public static void doTXT(Article article,String path) {File txt = new File(path);if(!txt.exists()) {txt.mkdir();}System.out.println(txt.getAbsolutePath());File timeFile = new File(txt.getAbsolutePath()+"/"+article.getCreateTime());if(!timeFile.exists()) {timeFile.mkdir();}File articleFile = new File(timeFile.getAbsolutePath()+"/"+article.getTitle());try {articleFile.createNewFile();BufferedWriter bw = new BufferedWriter(new FileWriter(articleFile));bw.write(article.getAuthor());bw.newLine();bw.write(article.getCreateTime());bw.newLine();bw.write(article.getContent());bw.flush();} catch (IOException e) {System.out.println("创建文件失败");e.printStackTrace();}}/*** 解析html,获得Document* @param html* @return*/private static Document getDocument(String html) {Document document = Jsoup.parse(html);return document;}}

主程序

package com.xx.yahoo;import com.xx.util.MyJMailUtil;import java.util.List;/*** Created with IntelliJ IDEA.* User: xx* Date: 13-3-26* Time: 下午6:16* DoWhat:*/
public class MyPaiRunner {public static void main(String[] args) {String url = "http://soul.cn.yahoo.com/";String css1 = "div.i_right > ul > li > a";String css2 = "div.i_right > ul > a";String html = ResourceHtml.getHtmlByUrl(url);List<String> links = ResourceHtml.getArticleLinks(html, css1, css2);for (String link : links) {System.out.println(link);Article article = ResourceHtml.doHtmlArticle(link);System.out.println(article.getTitle());MyJMailUtil.sendMail(article);}}}

util工具包

package com.xx.util;import java.text.SimpleDateFormat;
import java.util.Date;/*** Created with IntelliJ IDEA.* User: xx* Date: 13-3-27* Time: 上午11:32* DoWhat:根据一定格式获得一定格式的时间字符串*/
public class MyTimeUtil {public static String getNowStr(String pattern) {return getNowStr(pattern, null);}public static String getNowStr(String pattern, Date date) {SimpleDateFormat df = new SimpleDateFormat(pattern);if (date == null) {date = new Date();}String now = df.format(date);return now;}}
package com.xx.util;import com.xx.yahoo.Article;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;/*** Created with IntelliJ IDEA.* User: xx* Date: 13-3-28* Time: 下午2:58* DoWhat:将获取的文章发送到制定邮箱*/public class MyJMailUtil {private static String host = "smtp.163.com";//163邮箱服务器private static String to = "xx";//接受邮件的邮箱private static String from = "xx";//发送邮件的邮箱private static String username = "xx";//发送邮件的邮箱的用户名private static String password = "xx";//发送邮件的邮箱的密码/*** 发送邮件* @param article*/public static void sendMail(Article article){//获取Properties对象Properties properties = System.getProperties();//添加smtp服务器属性properties.put("mail.smtp.host",host);properties.put("mail.smtp.auth", true);//创建邮件会话Session session = Session.getDefaultInstance(properties,new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {//验证账号return new PasswordAuthentication(username, password);}});//是否在控制台显示debug信息
//        session.setDebug(true);try {//定义邮件信息MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));message.setSubject(article.getTitle());message.setContent(article.getAuthor()+"\n"+article.getCreateTime()+"\n"+article.getContent(),"text/html;charset=utf-8");//            message.setText(article.getAuthor()+"\n"+article.getCreateTime()+"\n"+article.getContent());//发送Transport.send(message);} catch (MessagingException e) {e.printStackTrace();}}}

内容都在代码中了,有不清楚的,可以留言,我也是个练习级别的,呵呵

转载于:https://my.oschina.net/qqli/blog/123489

将雅虎《心香一脉》每天推荐的文章发到咱邮箱(Java版)相关推荐

  1. 推荐一款非常好用的java反编译工具(转)

    源: 推荐一款非常好用的java反编译工具 转载于:https://www.cnblogs.com/LittleTiger/p/4556239.html

  2. php 中 相关文章 的思路,WordPress实现推荐相关文章功能代码

    WordPress实现推荐相关文章功能有2种方法:一种是可以在单篇日志和 feed 中都生成推荐相关文章功能,不过,功能越强大,代码也就会相应较多,所以这里还提供第二种,仅在单篇日志中实现在相关日志的 ...

  3. 百家号不推荐的文章如何解决呢?

    如今,互联网有太多的推广方式了,很多企业不仅仅只做网站推广,其它的推广也都在做,就是为了扩大企业在互联网的宣传.有些SEO人员在选择推广方式的时候,会选择百家号推广,因为百家号会把高质量的文章推荐给更 ...

  4. springboot毕设项目协同过滤推荐的餐厅点菜系统b2033(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目协同过滤推荐的餐厅点菜系统b2033(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql ...

  5. 新版本 chrome 手机浏览器关闭为您推荐的文章方法

    注: 文章摘自 fisher爱吃鱼 - 简书 新版本 chrome 手机浏览器关闭为您推荐的文章方法,之前的老版本关闭方法已失效!将图片上的两处选项关闭即可 方法: 打开手机 chrome 浏览器 地 ...

  6. 我的世界java版好玩的种子_《我的世界》种子详细推荐大全!还不知道有什么好玩的种子?...

    九游研究所是九游APP大神玩家自发组织的团队,专注热门资讯跟踪.游戏玩法研究,以及个人攻略心得分享,希望每个玩家都能玩得更开心.更省心! 我的世界有什么好玩的种子?游戏生成的很多种子还是很有趣的,而今 ...

  7. java开发社交网站_(转)强烈推荐:著名社交网站LinkedIn的Java架构技术

    强烈推荐:著名社交网站LinkedIn的Java架构技术 在JavaOne 2008的会议上,著名社交网站LinkedIn的开发者做了2个关于LinkedIn 网站的架构技术的演讲,目前这两个演讲的P ...

  8. WanAndroid,一款每日推荐优质文章App

    WanAndroid WanAndroid,一款每日推荐优质文章App,项目涉及API均来自鸿洋大神的玩Android,基于Material Design + MVP + RxJava2 + Retr ...

  9. Android简易音乐重构MVVM Java版-新增推荐菜单及侧边栏展示(十二)

    Android简易音乐重构MVVM Java版-新增推荐菜单及侧边栏展示(十二) 关于 效果图 添加侧边栏 添加推荐歌单 新增RecommendAdapter适配器 修改DiscoverFragmen ...

  10. 微信小程序:微群人脉微信小程序源码下载全新社群系统优化版支持代理会员系统功能超高收益

    大家好这一款微群人脉小程序系统以前也有发过 那么今天所发的这款呢是经过优化后的版本 之前的版本有很多用户反馈说登录后跳转到一个广告界面这个很不好会流失用户 所以呢小编就把它优化了一下,该版本目前的情况 ...

最新文章

  1. java bufferedwriter 写入tab_一个Java程序员的成长历程(014,015)天
  2. React 虚拟Dom 转成 真实Dom 实现原理
  3. 第六章 Web开发实战1——HTTP服务
  4. [Oracle]如何在亿级记录表中创建索引
  5. 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)
  6. 循环链表:魔术师发牌问题
  7. ucc编译器(词法分析)
  8. 如何在 Deno 中构建一个 URL 短链生成器
  9. uniapp App权限配置
  10. lede 内核 单 编_openwrt详细设置教程,lede固件设置中文
  11. 二维分类教案_大班数学活动二维分类
  12. 海康威视高级副总裁毕会娟:全面解读“物信融合数据平台”的功能与业务逻辑...
  13. cuda 的driver API 和 runtime API
  14. 3D-AVS2参考软件RFD10.0的配置
  15. mysql longtext_MySql中LongText类型大字段查询优化
  16. 十进制转为二进制的两种方法
  17. 报错:ERROR yaml.scanner.ScannerError: while scanning a quoted sca 如何解决
  18. 【论文翻译】Task Difficulty Aware Parameter Allocation Regularization for Lifelong Learning
  19. css flex布局网页小游戏
  20. 多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单

热门文章

  1. OpenGL ES 与原生窗口之间的接口——EGL
  2. python 拟合对数正态分布
  3. 1378:最短路径(shopth)——Floyd
  4. vue 临时会话sessionStorage
  5. Ninth season sixteenth episode,Monica is gonna do a boob job???bigger?????
  6. 【洛谷】P1138 第k小整数
  7. Java基础面试题(史上最全基础面试题,精心整理100家互联网企业面经)
  8. 【机密】从此没有难做的floorplan(数字后端设计实现floorplan篇)
  9. 苹果待处理订单要多久_一个订单管理系统帮你轻松应对复杂的生产订单管理
  10. OpenStack虚拟机rebuild和evacuate差异梳理