java获取网页正文:WebCollector

WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫。

Github上面更新到最新版本2.28,maven的中央仓库暂时只更新到2.09

2.09版本似乎没有把ContentExtractor集成进来,所以还是建议直接在github上先下载最新版本的jar,然后在buildpath里面引进来就行。

项目介绍:http://crawlscript.github.io/WebCollector/

项目github:https://github.com/CrawlScript/WebCollector

中文文档:https://github.com/CrawlScript/WebCollector/blob/master/README.zh-cn.md

来个简单的例子,对于中文url的支持,这个框架还是可以的。

import cn.edu.hfut.dmic.contentextractor.ContentExtractor;
import cn.edu.hfut.dmic.contentextractor.News;

public class WebExtraction {
    public static void main (String args[]) throws Exception{
        String url = "https://www.lookfor404.com/利用bootstrap的滚动监听+affix做一个侧导航landingpage/";
	String content = ContentExtractor.getContentByUrl(url);
	System.out.println("content:"+content);
	News news = ContentExtractor.getNewsByUrl(url);
	System.out.println("title:"+news.getTitle());
	System.out.println("content:"+news.getContent());
	}
}

输出结果如下:
webcollector例子输出结果

Mysql在linux下的使用以及用java编程

平时管理mysql喜欢用可视化的phpmyadmin,方便易用,简单的事情就不要复杂化。今天在做项目的过程中,发现需要远程连接mysql数据库,虽然说phpmyadmin是可以连接远程的数据库的,但是需要远程的数据库对我这边开启一定的访问权限。

鉴于安全考虑,打消了这个念头。

而想想,自己无非就是想去看看表的结构,select几个字段罢了,那就直接登录直接使用吧,遂把今天的一些操作记录一下吧。

linux下使用mysql

安装就不说了,直接进入主题。

先登录,命令如下:其中,-u后面直接输入用户名,-p后面直接输入密码

mysql -uusername -ppassword

无意外,登录成功。

在这里记录一个坑,那就是登录成功之后,进入mysql的命令行模式,此后输入命令都要以分号;结尾,就和我们日常编程一样,否则输入命令之后,会没有任何错误提示,并且也不会有任何反应。

首先看看有哪些数据库:

show databases;

选择一个数据库,比如我想对数据库名为test的数据库进行操作。

use test;

之后,就是输入各种select语句就行了。最后退出的时候输入命令exit就行。

Java下mysql的使用

首先下载mysql的jdbc驱动,去搜索mysql-connector-java,然后下载。

我搜索到的下载地址:http://dev.mysql.com/downloads/connector/j/

然后新建一个工程,把下载的jar包引进去就行。

随后开始编程,使用很简单,我写了一个简单的example记录一下,操作都大同小异,不过我这里用的不是存储过程,而是基本的sql语句操作。附上代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;




public class mysqlExample {
	public static void main(String args[]) {
		try {
			Class.forName("com.mysql.jdbc.Driver"); // 加载MYSQL JDBC驱动程序
			System.out.println("加载驱动成功!");
		} catch (Exception e) {
			System.out.print("加载驱动失败!");
			e.printStackTrace();
		}




		try {
			Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbName", "root", "");
			System.out.println("连接到数据库成功");
			String sql = "select * from `user`;";
			ResultSet rs = getResult(sql,connection);
			//遍历结果,rs是结果游标 
			while(rs.next()) { 
				 /*
				  * getString方法可以传int index,即第几列(1代表结果的第一列..)
				  * 也可以传String columnname,可以直接指定要哪个字段
				  */
				 System.out.println(rs.getString(1));
				 System.out.println(rs.getString("admin"));
				 } 
			 //关闭连接
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取sql查询结果
	 * @param sql sql语句
	 * @param connection 连接
	 * @return 结果集
	 * @throws SQLException
	 */
	public static ResultSet getResult(String sql,Connection connection) throws SQLException{
		Statement stmt = connection.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		return rs;
	}
}

记录一下maven使用过程中遇到的几个问题

环境:win7+eclipese-mars+maven3.3.9

卡死在building workspace

这个问题网上我找了好多,原因不一而足。有一种解决办法就是,先停止它的building,然后项目右键–properties,在左边选择builder,然后把Maven Project Builder的选项去掉就行。

builder

这个方法堪称是鸵鸟战法,只是让eclipse没再卡在building workspace的状态中了,之后该干什么还是得干什么。

我接下来就继续maven install了,把依赖包都下下来了,但是一看Maven Dependencies,什么都没有。。可到本地的repository看看,依赖包确实是下载了啊。

好吧,我又把Maven Project Builder的选项勾选回来了,然后打开pom.xml,随便打了一个空格,保存,依赖包神奇的包含进来了。

reload maven project出错,eclipse打不开

这个问题原因同样很多。我就是因为等不及maven卡在那里,eclipse又关不了,直接暴力在任务管理器中关掉eclipse了,然后发现eclipse再也打不开了,错误信息是

"An internal error occurred during: "reload maven project".java.lang.NullPointerException"

估计的某些文件没弄下来,然后被我直接关了,没保存好,就启动出错了。

简单粗暴的解决方法:到你eclipse的workspace目录下,把.metadata文件夹删掉,然后重启eclipse就可以正常打开了。

代价是:要重新导入原来的项目,但是项目本身还是在那里的,相比于看log来找错误信息,这个解决问题的方式虽然比较粗暴,但胜在速度比较快。

使用开源中国的maven中央仓库

国外的maven中央仓库相对来说还是比较慢的,好在国内的开源中国有做这方面的优化,他们将国外的仓库搬过来了,一天一更新,基本上也是同步的,速度快多了,推荐使用他们的mirror。

官方教程:http://maven.oschina.net/help.html

仓库搜索:http://maven.oschina.net/home.html

在java中使用dom4j进行xml文件的解析

之前在做文本挖掘实验的时候,千辛万苦要到这份duc2002的语料库之后,就要对它进行处理了,它是存在xml文件里的。

一直在用java进行相关的处理,所以这次也不例外,java中,关于xml文件解析的框架有很多,在网上也看了很多,最终选择了dom4j这个框架。下面就简单记录一下使用的过程。

首先去下载,我下载的是dom4j1.6.1。下载地址:http://sourceforge.net/projects/dom4j/files/

下载之后解压就行。然后在工程的buildpath里面添加一个external jars,选择刚才解压之后根目录下的dom4j-1.6.1.jar文件。

我的这个xml文件的层级比较多,对照我要需要的内容,这里就列举一下一部分的内容:

<corpus>
	<cluster cid="d061j">
		<title>d061j</title>
		<topics>
		  <topic>d061j</topic>
		</topics>
		<queries/>
		<documents>
		  <document docid="AP880911-0016">
			<title> Hurricane Gilbert Heads Toward Dominican Coast</title>
			<text>
				<s sid="9"> Hurricane Gilbert swept toward the Dominican Republic Sunday, and the Civil Defense alerted its heavily populated south coast to prepare for high winds, heavy rains and high seas.</s>
				<s sid="10"> The storm was approaching from the southeast with sustained winds of 75 mph gusting to 92 mph.</s>
				<s sid="11"> ``There is no need for alarm,'' Civil Defense Director Eugenio Cabral said in a television alert shortly before midnight Saturday.</s>
				<s sid="12"> Cabral said residents of the province of Barahona should closely follow Gilbert's movement.</s>
				<s sid="13"> An estimated 100,000 people live in the province, including 70,000 in the city of Barahona, about 125 miles west of Santo Domingo.</s>
				<s sid="14"> Tropical Storm Gilbert formed in the eastern Caribbean and strengthened into a hurricane Saturday night.</s>
				<s sid="15"> The National Hurricane Center in Miami reported its position at 2 a.m. Sunday at latitude 16.1 north, longitude 67.5 west, about 140 miles south of Ponce, Puerto Rico, and 200 miles southeast of Santo Domingo.</s>
				<s sid="16"> The National Weather Service in San Juan, Puerto Rico, said Gilbert was moving westward at 15 mph with a ``broad area of cloudiness and heavy weather'' rotating around the center of the storm.</s>
				<s sid="17"> The weather service issued a flash flood watch for Puerto Rico and the Virgin Islands until at least 6 p.m. Sunday.</s>
				<s sid="18"> Strong winds associated with the Gilbert brought coastal flooding, strong southeast winds and up to 12 feet feet to Puerto Rico's south coast.</s>
				<s sid="19"> There were no reports of casualties.</s>
				<s sid="20"> San Juan, on the north coast, had heavy rains and gusts Saturday, but they subsided during the night.</s>
				<s sid="21"> On Saturday, Hurricane Florence was downgraded to a tropical storm and its remnants pushed inland from the U.S. Gulf Coast.</s>
				<s sid="22"> Residents returned home, happy to find little damage from 80 mph winds and sheets of rain.</s>
				<s sid="23"> Florence, the sixth named storm of the 1988 Atlantic storm season, was the second hurricane.</s>
				<s sid="24"> The first, Debby, reached minimal hurricane strength briefly before hitting the Mexican coast last month .</s>
			</text>
		  </document>
		</documents>
	</cluster>
</corpus>

每个cluster有自己的title,接下来,documents是和cluster同级的,ducuments里面又有若干document,每个document下有title,text,text下有p标签,p标签下又有各个句子,标签是s。

我的任务是,将每一篇document的内容输出到一个文本文件,命名格式为:”cl”+cid+”-“+”docid”+docid,其中cid和docid分别是cluster和document的一个属性。

PS:我把文本文件duc2002.xml已经复制到本项目的scr下了。

下面贴上源代码:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class MyTest {
	public static void main(String[] args) throws Exception {
		SAXReader reader = new SAXReader();
		Document thedocument = reader.read(new File("./src/duc2002.xml"));
		Element root = thedocument.getRootElement();
		System.out.println(root);
		Iterator it = root.elementIterator();
		int count = 0;
		for (Iterator i = root.elementIterator("cluster"); i.hasNext();) {
			Element cluster = (Element) i.next();
			System.out.println("cluster id:"
					+ cluster.attribute("cid").getText()); // cluster的id
			Element documents = cluster.element("documents");
			for (Iterator j = documents.elementIterator("document"); j
					.hasNext();) {
				Element document = (Element) j.next();
				Element title = document.element("title");
				for (Iterator k = document.element("models").elementIterator(
						"model"); k.hasNext();) {
					Element model = (Element) k.next();
				}
				File file = new File("F:\\xmltest\\" + "cl"
						+ cluster.attribute("cid").getText() + "-" + "docid"
						+ document.attribute("docid").getText() + ".txt");
				file.createNewFile();
				BufferedWriter bw = new BufferedWriter(new FileWriter(file,
						true));
				bw.write("title:" + title.getText());
				bw.newLine();

				for (Iterator l = document.element("text").element("p")
						.elementIterator("s"); l.hasNext();) {
					Element sentence = (Element) l.next();
					bw.write(sentence.getText().trim());
					bw.newLine();
				}
				bw.close();
			}
			count++;
			System.out.println(count + "finished!");
		}
		
	}
}

这段程序在F盘的xmltest文件夹下不断生成文本文件,我就拿列举的那部分内容生成的文本文件做例子,输出结果是这样的:

xml文件输出为txt结果

对照程序,再简单整理一下dom4j基本的xml解析功能:

  • 第13-15行,初始化解析器,读入xml文件,获得根节点
  • 第19行,用root.elementIterator("cluster")来迭代获得root节点下的cluster
  • 第20行,用Element cluster = (Element) i.next();来获得每一个cluster,如果要获得属性,比如xml文件第2行的cid,可以用第22行的cluster.attribute("cid").getText());
  • 用element方法获得子节点,如23行的Element documents = cluster.element("documents");
  • 获得节点的内容,直接用getText()方法,如第38行,获得<title>的内容

windows和eclipse下maven的安装与配置

作为Apache旗下的项目,maven是一款著名的软件项目管理工具,通过它,可以解决很多项目流程的问题。就拿hadoop的官方源代码来说,它的项目也是基于maven构建的。以下介绍来自百度百科:

Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布项目信息的方式,以及一种在多个项目中共享JAR的方式。

介绍就不深入了,主要记录一下windows和eclipse下maven的安装与配置。

 

windows下maven的安装与配置

首先要注意的是,安装maven之前,本机安装的jdk的版本最好在1.7以及以上,否则可能会出现一些问题。

官网下载:http://maven.apache.org/download.cgi

找到新的稳定版本下载即可,我下载的是apache-maven-3.3.9.tar.gz。

解压到你想安装的地方,我放在了D盘。D:\apache-maven-3.3.9。其实到了这一步,基本就快完成了。

接下来只要配置环境变量即可。

在path里加入maven的bin 目录D:\apache-maven-3.3.9\bin  即可

为maven添加环境变量

配置完毕,在cmd下输入命令:mvn -version

查看maven的版本,如果出现以下提示,则说明配置成功。

查看maven版本

 

在eclipse安装maven插件

最简单的方法:下载最新的eclipse,下载最新的eclipse,下载最新的eclipse!

我拿旧版本的eclipse对照着网上的教程,无论是通过eclipse的在线应用商店安装,还是下载离线插件,都安装失败了!当然如果你感兴趣,还是可以找那些教程安装的。安装的插件如下:

eclipse的maven插件

过程就不再详述了,还是那句话,新版本里面已经预装了,能省事就省事,毕竟使用这个工具才是我们的目的。

有了这个插件,还要配置一下,让eclipse里面的maven和我们刚才在windows下安装的maven版本一致。步骤如下

在eclipse的菜单栏依次点击windows–preference

找到maven–Installations

把刚才安装的maven的目录 add进去即可。

配置成功!

eclipese中查看源代码出现Source not found怎么解决

今天在eclipse上,想查看一些开源框架的源代码,在按下ctrl点击左键之后,出现了Source not found的提示,如下图:

source-not-found提示

这个问题怎么解决呢?

其实是这样的。在查看自己写的函数的时候,ctrl当然没有问题,但是我们引用别人写的包,就有问题了。比如我这个工程,引入了3个external jar,并且在程序里用到了它们封装的类和方法:

external-jars我们是看不到这些类和方法的源代码的,因为这些jar文件都是编译好的jar包,所以,我们需要在里面绑定source文件,这样才能查看源代码。

对其中一个jar文件点击右键–properties,第一个选项就是java source attachment,在这里,我们可以绑定和这个jar包对应的源文件。一般来说,开源的项目里,这些源文件的命名都是在后面加多一个-sources。在这里,我需要找到的是hadoop-mapreduce-client-core-2.5.2-sources.jar,一般来说,这个文件会在你引用的jar包目录下的source文件夹下,可以找找看。

比如我找到hadoop-mapreduce-client-core-2.5.2-sources.jar,将其绑定:

source文件

点击ok,绑定完毕。这时候这个jar包图标发生了变化,即有个小的正方形附在上面(对比前面的图):

source绑定完毕其它的jar包也是照葫芦画瓢,绑定完毕。

现在,再使用ctrl+左键,或者对着类或者函数右键–open declaration,都可以直接跳到源代码页面了。

 

java中怎么在数组里面存放数组

今天在用java写程序的时候,遇到一个问题,怎么在数组里面里面存放数组呢?

如你所知,在java里面声明一个数组是这样的:

String arr[]或者int arr[]等等,即要声明其数据类型,String arr[]代表数组里面要存放字符串,而int arr[]代表数组里面要存放整型数,依次类推。

那我想在数组里面存放数组该怎么办?百度了一下,发现竟然没什么人遇到这个问题。后来我才发现,应该是我死脑筋了。动手了一番,得以解决。如下:

其实java中有许多的数据结构可以供给我们直接使用,如map,list,set,对于我这个问题而言,直接用一个List就额可以解决了。

首先导入一个包

 import java.util.ArrayList;

随后声明初始化一个ArrayList即可,如:

ArrayList<String[]> test = new ArrayList();

这个ArrayList的意思是,里面的每一个元素都是String数组,这样,我们就相当于在数组里面存放了数组,而ArrayList是动态数组,自然是比数组更加容易使用且功能更加强大的了。加入数据直接使用add方法,取出数据直接使用get方法,很方便。

那怎么遍历它呢?

很直观的,我们可以用两个for循环嵌套:

for(String[] str : test)
    for(String str1 : str)
        System.out.println(str1);

当然你使用变量或者Iterator来循环也是没问题的。详情百度之,这里就不多介绍了。