用java+webdriver+testng实现获取infoq里的测试新闻,获取文章标题和内容,保存至html文件

前提条件:

已安装好java环境,工程导入了webdriver的jar包和testng的jar包

代码如下:

第一:新建PublicModel类,该类中实现了写入html的文件功能和初始化方法

  1. package com.ustc.publics;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.OutputStreamWriter;
  8. import java.text.SimpleDateFormat;
  9. import java.util.ArrayList;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12.  
  13. import org.openqa.selenium.WebDriver;
  14. import org.openqa.selenium.ie.InternetExplorerDriver;
  15.  
  16. public class PublicModel {
  17. public static WebDriver driver;
  18.  
  19. /**
  20. * 初始化方法
  21. */
  22. public static void initModel() {
  23. driver = new InternetExplorerDriver();
  24. /*driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);*/
  25. driver.manage().window().maximize();
  26. }
  27.  
  28. /**
  29. * 写入html文件方法数组
  30. *
  31. * @param hotTopics
  32. * hashmap的数组内容
  33. * @param file
  34. * 文件名称
  35. * @throws IOException
  36. */
  37. public static void writeHtmlContent(ArrayList<HashMap<String, String>> hotTopics, String file, String title1,
  38. String title2) {
  39. FileOutputStream fis = null;
  40. BufferedWriter bfr = null;
  41. String css = "table.gridtable {" + "font-family: verdana,arial,sans-serif;" + "font-size:11px;"
  42. + "color:#333333;" + "border-width: 1px;" + "border-color: #666666;" + "border-collapse: collapse;"
  43. + "}" + "table.gridtable th {" + "border-width: 1px;" + "padding: 8px;" + "border-style: solid;"
  44. + "border-color: #666666;" + "background-color: #dedede;" + "}" + "table.gridtable td {"
  45. + "border-width: 1px;" + "padding: 8px;" + "border-style: solid;" + "border-color: #666666;"
  46. + "background-color: #ffffff;" + "}";
  47. try {
  48. /* 文件名:当前工程路径+result+20160607_file.html */
  49. Date currentTime = new Date();
  50. SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
  51. String dateString = formatter.format(currentTime);
  52. String filename = System.getProperty("user.dir") + File.separator + "result" + File.separator + dateString
  53. + "_" + file + ".html";
  54. fis = new FileOutputStream(filename);
  55. bfr = new BufferedWriter(new OutputStreamWriter(fis));
  56. /* 遍历arrayList的hashMap内容,按行写入html文件 */
  57. bfr.append("<html>");
  58. bfr.append("<head>");
  59. bfr.append("<title>数据写入html展示</title>");
  60. bfr.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
  61. bfr.append("</head>");
  62. bfr.append("<style type=\"text/css\">");
  63. bfr.append(css);
  64. bfr.append("</style>");
  65. bfr.append("<body>");
  66. bfr.append("<table class=\"gridtable\" >");
  67. bfr.append("<tr><th>序号</th><th>" + title1 + "</th><th>" + title2 + "</th>");
  68. bfr.append("<tbody>");
  69. for (int i = 0; i < hotTopics.size(); i++) {
  70. bfr.append("<tr>");
  71. String que = hotTopics.get(i).get("que").toString();
  72. String ans = hotTopics.get(i).get("ans").toString();
  73. bfr.append("<td>" + i + "</td>");
  74. bfr.append("<td>" + que + "</td>");
  75. bfr.append("<td>" + ans + "</td>");
  76. bfr.append("</tr>");
  77. }
  78. bfr.append("</tbody>");
  79. bfr.append("</table>");
  80. bfr.append("</body>");
  81. bfr.append("</html>");
  82.  
  83. } catch (Exception e) {
  84. e.printStackTrace();
  85. } finally {
  86. try {
  87. bfr.close();
  88. } catch (Exception e) {
  89. e.printStackTrace();
  90. }
  91. try {
  92. fis.close();
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. }
  96. }
  97. }
  98. }

第二:新建InfoqArticle类,该类继承了PublicModel类,获取infoq里的测试新闻,获取文章标题和内容,保存至html文件

  1. package com.ustc.base;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6.  
  7. import org.openqa.selenium.By;
  8. import org.openqa.selenium.WebElement;
  9. import org.testng.annotations.AfterClass;
  10. import org.testng.annotations.BeforeClass;
  11. import org.testng.annotations.Test;
  12.  
  13. import com.ustc.publics.PublicModel;
  14.  
  15. public class InfoqArticle extends PublicModel{
  16. @BeforeClass
  17. public void setUp() {
  18. initModel();
  19. }
  20.  
  21. /**
  22. * 获取infoq里的测试新闻,获取文章标题和内容,保存至html文件
  23. * @throws Exception
  24. */
  25. @Test
  26. public void getInfoqMsg() throws Exception{
  27. String url = "http://www.infoq.com/cn/testing/?utm_source=infoq&utm_medium=header_graybar&utm_campaign=topic_clk";
  28. driver.get(url);
  29. /* 获取infoq测试文章根节点 */
  30. WebElement rootNode = driver.findElement(By.cssSelector("div[class~='articles']"));
  31. List<WebElement> nodes = rootNode.findElements(By.tagName("p"));
  32. ArrayList<HashMap<String, String>> infoqMsgs = new ArrayList<HashMap<String, String>>();
  33. ArrayList<String> titles = new ArrayList<String>();
  34. /*获取所有测试文章的链接*/
  35. for (WebElement node : nodes) {
  36. titles.add(node.findElement(By.cssSelector("a.art_title")).getAttribute("href"));
  37. }
  38. /* 遍历添加infoq文章标题、内容到数组中 */
  39. for(String title : titles){
  40. HashMap<String, String> topic = new HashMap<String, String>();
  41. driver.get(title);
  42. /*文章标题*/
  43. topic.put("que", driver.findElement(By.cssSelector("div.title_canvas > h1")).getText());
  44. /*文章链接*/
  45. topic.put("ans",title);
  46. /*文章内容,文章内容已经获取到,因为内容太多所以没有往html中写入,只写入了该文章的链接*/
  47. infoqMsgs.add(topic);
  48. }
  49.  
  50. /*数组数据写入html*/
  51. writeHtmlContent(infoqMsgs,"infoq_article","文章标题","文章内容");
  52. }
  53.  
  54. @AfterClass
  55. public void quit() {
  56. driver.quit();
  57. }
  58. }

第三:配置testng.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  3. <suite name="Suite" parallel="false">
  4. <test name="Test">
  5. <classes>
  6. <class name="com.ustc.base.InfoqArticle09"/> <!--9:抓取infoq的测试新闻 -->
  7. </classes>
  8. </test> <!-- Test -->
  9. </suite> <!-- Suite -->

运行testng.xml结果为:
项目路径result目录下生成了一个文件:20160615_infoq_article09.html,内容如下

网络爬虫-获取infoq里的测试新闻保存至html的更多相关文章

  1. Selenium实战脚本集(3)--抓取infoq里的测试新闻

    描述 打开infoq页面,抓取最新的一些测试文章 需要抓取文章的标题和内容 如果你有个人blog的话,可以将这些文章转载到自己的blog 要求 不要在新窗口打开文章 自行了解最新的测试思潮与实践

  2. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  3. 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接

    [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...

  4. Java 网络爬虫获取页面源代码

    原博文:http://www.cnblogs.com/xudong-bupt/archive/2013/03/20/2971893.html 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网 ...

  5. 手把手教你用Python网络爬虫获取网易云音乐歌曲

    前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...

  6. 【Python网络爬虫三】 爬去网页新闻

    学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...

  7. 【Python网络爬虫三】 爬取网页新闻

    学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...

  8. 手把手教你使用Python网络爬虫获取招聘信息

    1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...

  9. python从网络摄像头获取rstp视频流并截取图片保存

    import cv2 def get_img_from_camera_net(folder_path):     cap = cv2.VideoCapture("rtsp://admin:a ...

随机推荐

  1. dapper 扩展插件: Rainbow

    dapper 扩展插件: Rainbow dapper 是一个效率非常高的orm  框架 ,效率要远远大于 我们大微软的EF .    它只有一个类文件,非常之小. 1,首先下载dapper  这里下 ...

  2. 关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法

    关于PDF.NET开发框架的名字由来  在设计www.pwmis.com站点的时候,考虑到架构的兼容性和将来升级的可能性,最重要的是没有足够的时间去为网站添加和维护很多复杂的程序,所以在借鉴前人成功经 ...

  3. Morn简介及使用教程

    [Morn UI系列教程]Morn简介及使用教程 网页游戏开发的一大部分工作是在和UI制作上,一个好的工具及框架能使开发事半功倍,Adobe自带flash IDE和Flex各有不足. Morn UI学 ...

  4. Lucene全文检索(一)

    全文检索的概念 1.从大量的信息中快速.准确的查找要的信息2.收索的内容是文本信息3.不是根据语句的意思进行处理的(不处理语义)4.全面.快速.准确是衡量全文检索系统的关键指标.5.搜索时英文不区分大 ...

  5. flowplayer视频播放插件

    flowplayer视频播放插件 最近项目中需要添加播放视频的功能,视频文件是flv格式的.在网上找了一些jQuery视频播放插件,还是觉得“flowplayer”要好一些.特将使用方法记录一下. f ...

  6. JBoss + EJB3 + MySql : 开发第一个EJB

    JBoss开发Bean并不困难,而对于不知道的人来说,数据库配置才是比较棘手的问题.现在我们就来一步一步开发一个EJB3 + MySql的Bean. 一.MySql数据库的配置 1. 配置数据源 在 ...

  7. WebService的简单实现

    WebService的简单实现 一.socket主机创建和使用过程 1.socket()//创建套接字 2.Setsockopt()//将套接字属性设置为允许和特定地点绑定 3.Bind()//将套接 ...

  8. 筛选实现C++实现筛选法

    每日一贴,今天的内容关键字为筛选实现 筛选法 分析: 筛选法又称筛法,是求不超越自然数N(N>1)的全部质数的一种方法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-19 ...

  9. Android 关于ListView中按钮监听的优化问题(方法一)

    在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听.在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个But ...

  10. WebAPI的压缩

    看见老外写了一篇ASP.NET Web API GZip compression ActionFilter with 8 lines of code 说实话被这标题吸引了,8行代码实现GZip压缩过滤 ...