网络爬虫-获取infoq里的测试新闻保存至html
用java+webdriver+testng实现获取infoq里的测试新闻,获取文章标题和内容,保存至html文件
前提条件:
已安装好java环境,工程导入了webdriver的jar包和testng的jar包
代码如下:
第一:新建PublicModel类,该类中实现了写入html的文件功能和初始化方法
package com.ustc.publics; import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver; public class PublicModel {
public static WebDriver driver; /**
* 初始化方法
*/
public static void initModel() {
driver = new InternetExplorerDriver();
/*driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);*/
driver.manage().window().maximize();
} /**
* 写入html文件方法数组
*
* @param hotTopics
* hashmap的数组内容
* @param file
* 文件名称
* @throws IOException
*/
public static void writeHtmlContent(ArrayList<HashMap<String, String>> hotTopics, String file, String title1,
String title2) {
FileOutputStream fis = null;
BufferedWriter bfr = null;
String css = "table.gridtable {" + "font-family: verdana,arial,sans-serif;" + "font-size:11px;"
+ "color:#333333;" + "border-width: 1px;" + "border-color: #666666;" + "border-collapse: collapse;"
+ "}" + "table.gridtable th {" + "border-width: 1px;" + "padding: 8px;" + "border-style: solid;"
+ "border-color: #666666;" + "background-color: #dedede;" + "}" + "table.gridtable td {"
+ "border-width: 1px;" + "padding: 8px;" + "border-style: solid;" + "border-color: #666666;"
+ "background-color: #ffffff;" + "}";
try {
/* 文件名:当前工程路径+result+20160607_file.html */
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
String dateString = formatter.format(currentTime);
String filename = System.getProperty("user.dir") + File.separator + "result" + File.separator + dateString
+ "_" + file + ".html";
fis = new FileOutputStream(filename);
bfr = new BufferedWriter(new OutputStreamWriter(fis));
/* 遍历arrayList的hashMap内容,按行写入html文件 */
bfr.append("<html>");
bfr.append("<head>");
bfr.append("<title>数据写入html展示</title>");
bfr.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
bfr.append("</head>");
bfr.append("<style type=\"text/css\">");
bfr.append(css);
bfr.append("</style>");
bfr.append("<body>");
bfr.append("<table class=\"gridtable\" >");
bfr.append("<tr><th>序号</th><th>" + title1 + "</th><th>" + title2 + "</th>");
bfr.append("<tbody>");
for (int i = 0; i < hotTopics.size(); i++) {
bfr.append("<tr>");
String que = hotTopics.get(i).get("que").toString();
String ans = hotTopics.get(i).get("ans").toString();
bfr.append("<td>" + i + "</td>");
bfr.append("<td>" + que + "</td>");
bfr.append("<td>" + ans + "</td>");
bfr.append("</tr>");
}
bfr.append("</tbody>");
bfr.append("</table>");
bfr.append("</body>");
bfr.append("</html>"); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
bfr.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
第二:新建InfoqArticle类,该类继承了PublicModel类,获取infoq里的测试新闻,获取文章标题和内容,保存至html文件
package com.ustc.base; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import com.ustc.publics.PublicModel; public class InfoqArticle extends PublicModel{
@BeforeClass
public void setUp() {
initModel();
} /**
* 获取infoq里的测试新闻,获取文章标题和内容,保存至html文件
* @throws Exception
*/
@Test
public void getInfoqMsg() throws Exception{
String url = "http://www.infoq.com/cn/testing/?utm_source=infoq&utm_medium=header_graybar&utm_campaign=topic_clk";
driver.get(url);
/* 获取infoq测试文章根节点 */
WebElement rootNode = driver.findElement(By.cssSelector("div[class~='articles']"));
List<WebElement> nodes = rootNode.findElements(By.tagName("p"));
ArrayList<HashMap<String, String>> infoqMsgs = new ArrayList<HashMap<String, String>>();
ArrayList<String> titles = new ArrayList<String>();
/*获取所有测试文章的链接*/
for (WebElement node : nodes) {
titles.add(node.findElement(By.cssSelector("a.art_title")).getAttribute("href"));
}
/* 遍历添加infoq文章标题、内容到数组中 */
for(String title : titles){
HashMap<String, String> topic = new HashMap<String, String>();
driver.get(title);
/*文章标题*/
topic.put("que", driver.findElement(By.cssSelector("div.title_canvas > h1")).getText());
/*文章链接*/
topic.put("ans",title);
/*文章内容,文章内容已经获取到,因为内容太多所以没有往html中写入,只写入了该文章的链接*/
infoqMsgs.add(topic);
} /*数组数据写入html*/
writeHtmlContent(infoqMsgs,"infoq_article","文章标题","文章内容");
} @AfterClass
public void quit() {
driver.quit();
}
}
第三:配置testng.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="false">
<test name="Test">
<classes>
<class name="com.ustc.base.InfoqArticle09"/> <!--9:抓取infoq的测试新闻 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
运行testng.xml结果为:
项目路径result目录下生成了一个文件:20160615_infoq_article09.html,内容如下

网络爬虫-获取infoq里的测试新闻保存至html的更多相关文章
- Selenium实战脚本集(3)--抓取infoq里的测试新闻
描述 打开infoq页面,抓取最新的一些测试文章 需要抓取文章的标题和内容 如果你有个人blog的话,可以将这些文章转载到自己的blog 要求 不要在新窗口打开文章 自行了解最新的测试思潮与实践
- Java 网络爬虫获取网页源代码原理及实现
Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...
- 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接
[一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...
- Java 网络爬虫获取页面源代码
原博文:http://www.cnblogs.com/xudong-bupt/archive/2013/03/20/2971893.html 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网 ...
- 手把手教你用Python网络爬虫获取网易云音乐歌曲
前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将 ...
- 【Python网络爬虫三】 爬去网页新闻
学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...
- 【Python网络爬虫三】 爬取网页新闻
学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...
- 手把手教你使用Python网络爬虫获取招聘信息
1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...
- python从网络摄像头获取rstp视频流并截取图片保存
import cv2 def get_img_from_camera_net(folder_path): cap = cv2.VideoCapture("rtsp://admin:a ...
随机推荐
- dapper 扩展插件: Rainbow
dapper 扩展插件: Rainbow dapper 是一个效率非常高的orm 框架 ,效率要远远大于 我们大微软的EF . 它只有一个类文件,非常之小. 1,首先下载dapper 这里下 ...
- 【又长见识了】C#异常处理,try、catch、finally、throw
异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常.处理这种错误,就叫做异常处理. 1.轻描淡写Try.Catch.Finally.throw用法 在异常处理中,首先需要对可能发 ...
- 译文:User-agent的历史
这是一篇译文,译文出处在文章底部贴出.由于技术水平,英语水平,翻译水平有限,请各路大侠多多指正,谢谢,提高你也提高我:) 几个礼拜之前,我谈论了特征检测和浏览器检测.这篇帖子提到了一点点嗅探U ...
- 案例研究:Web应用出现间歇性的SqlException
案例研究:Web应用出现间歇性的SqlException 2013-07-29 14:36 by 微软互联网开发支持, 231 阅读, 3 评论, 收藏, 编辑 最近有客户找到我,说他们生产环境的事件 ...
- 为Exchange 2007 SCC 启用 SCR 副本-供需要的人使用!
SCC 已经部署完整,接下来我们必须防范本地站点如果出现了完全的损坏怎么办? Exchange 2007 SP1 提供了另外一种高可用的方式,就是基于我们的SCR 模型,SCR 模型是基于SCC 本地 ...
- HDFS中文件的压缩与解压
HDFS中文件的压缩与解压 文件的压缩有两大好处:1.可以减少存储文件所需要的磁盘空间:2.可以加速数据在网络和磁盘上的传输.尤其是在处理大数据时,这两大好处是相当重要的. 下面是一个使用gzip工具 ...
- 关于JSF国际化问题
由于最近一个项目的MVC层框架用的是JSF,所以在摸索中遇到了不少的问题,其中有一项就是关于国际化的的问题. 小弟在网上找了很多的资料,其实无外乎内容就都那样,可不知是小弟人品太差还是由于确实技术上有 ...
- 不再害羞,过程比结果更重要;分享一套 CodeSmit 代码生成模板。
住博客园 5 年了,以前也发过一些博文,但都在 一天后 / 几周后 / 几年后 将它删了:因为感觉代码写得不好:不清晰或侵入太大,哪怕只有一句侵入. 可是最近重写一套 CodeSmith 代码生成模板 ...
- Android中ListView下拉刷新的实现
ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: packa ...
- .Net程序员学用Oracle系列(2):准备测试环境
<.Net程序员学用Oracle系列:导航目录> 本文大纲 1.创建说明 1.1.为什么要创建的测试环境? 1.2.了解 Oracle 实例的默认用户 2.创建环境 2.1.创建基本环境 ...