配色: 字号:
网络爬虫之java基础
2016-09-24 | 阅:  转:  |  分享 
  
网络爬虫之java基础



这张图为我给自己研究所人讲网络爬虫的一个流程,本人也将按照这个流程来讲网络爬虫,如果你的基础较好,可以直接跳过相关流程。



1、Java中maven的使用



使用maven能很轻松的从网络中下载所需的插件

及依赖(下载程序所依赖的JAR包),存储在某一位置中,在程序编译时自动去寻找jar包。初次使用maven时,可能会很慢,会遇到很多问题(国外的源,下载jar包很慢)可以配置一些国内的源,如csdn的。



使用maven最大的方面,在ecliplse中建工程的时候,我们选择maven工程。如下图所示,maven工程上面会有一个M的标致,同时生成一个pom.xml文件,通过在pom.xml中加入以下类型的文件,便可把jar包引入到MavenDependencies中。





org.jsoup

jsoup

1.8.2





2、log4j



log4j的介绍



log4j是Apache下的一个开源项目,用来控制日志信息,方便的日志记录。之所以要记录日志,可以详细的记录程序发生了什么,在哪里发生的,有没有错误等。在使用log4j之前需要使用maven引入log4j的jar包。

其中,日志的输出级别(%p):DEBUG,INFO,WARN,ERROR,FATAL(每个严重的错误事件将会导致应用程序的退出)



log4j提供的几种方法



(1)Appender方法:日志输出目的地

org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)。

(2)Layout方法:日志输出格式

org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)。



使用步骤



(1)导入log4j-1.2.8.jar包(我们使用maven)。

(2)在根目录src下建立并配置log4j.properties,如下图所示为我的配置。

(3)使用(演示),如下图所示。

logger.debug(“Thisisdebug.”);

logger.info(“Thisisaninfo.”);

logger.warn(“Thisisawarning.”);

logger.error(“Thisisanerror.”);

logger.fatal(“Thisisafatalerror.”);



3、输入流与输出流



这里也不做很多介绍,简单一点,输入流、输出流就是文件的读与写,当然这样理解比较狭隘。



(1)读取文件(输入流read())、写文件(输出流write())

(2)文件字节流:FileInputStream()、FileOutputStream()

(3)文件字符流:FileReader()、FileWriter()

(4)缓冲流(读写能力强,最常用):BufferedReader()、BufferedWriter()

注意:缓冲流的源必须是字节流或者字符流

案列:



数据的读写程序以及map的使用



packageFileUtil;

importjava.io.BufferedReader;

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importjava.io.FileReader;

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.io.OutputStreamWriter;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.List;

importjava.util.Map;



importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;



publicclassFileTest{

staticfinalLoglogger=LogFactory.getLog(FileTest.class);

publicstaticvoidmain(String[]args)throwsIOException{

/读入的数据存入list<>中/

ListData=newArrayList();

/创建所要读的文本/

Filefile=newFile("E:\\钱洋个人\\网络爬虫培训\\attentionword.txt");

/FileReader顺序读取文件/

FileReaderfileReader=newFileReader(file);

/根据FileReader创建的实例/

BufferedReaderbufferedReader=newBufferedReader(fileReader);

Strings=null;

while((s=bufferedReader.readLine())!=null){

Data.add(s);

logger.info(s);

}

bufferedReader.close();

fileReader.close();

/文件读取第二种方式/

BufferedReaderreader=newBufferedReader(newInputStreamReader(newFileInputStream(newFile("E:\\钱洋个人\\网络爬虫培训\\b.txt")),"utf-8"));

Strings1=null;

while((s1=reader.readLine())!=null){

Data.add(s1);

logger.info(s1);

}

reader.close();



/文件写入第一种方式/

/Filefile1=newFile("D:\\钱洋个人\\网络爬虫培训\\b.txt","utf-8");

FileOutputStreamfileOutputStream=newFileOutputStream(file1);

OutputStreamWriteroutputStreamWriter=newOutputStreamWriter(fileOutputStream);

BufferedWriterbufferedWriter1=newBufferedWriter(outputStreamWriter);/

/文件写入快捷方式/

BufferedWriterwriter=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(newFile("D:\\钱洋个人\\网络爬虫培训\\d.txt")),"utf-8"));

/map的使用/

Mapmap=newHashMap();

/map添加数据/

for(Stringdata:Data){

map.put(Integer.parseInt(data.split("\\s")[0]),data.substring(1,data.length()));



}

/map遍历数据/

for(Integerkey:map.keySet()){

System.out.println("key:"+key+"\tvalue:"+map.get(key));

writer.append("key:"+key+"\tvalue:"+map.get(key)+"\r\n");

}

writer.close();

}

}



1、集合操作



集合创建



Set集合不可以放重复数据,List可以,Map主要存放的是键值对,其中key(主键)不可以重复。



Listlist=newArrayList();

Setset=newHashSet();

Mapmap=newHashMap();



集合数据的添加



list.add();

set.add();

map.put(key,value);



集合的遍历



/List与Set集合的遍历/

//第一种遍历方式

for(Stringstr:list){

System.out.println(str);

}

//第二种遍历方式

for(inti=0;i
System.out.println(i+":"+list.get(i));

}

//第三种遍历方式

Iteratorit=list.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

/Map集合的遍历/

//第一种方式

for(Stringstr:map.keySet()){

System.out.println("key:"+str+"\tvalue:"+map.get(str));

}

/此种方式快/

//第二种方式

for(Entryentry:map.entrySet()){

System.out.println("key:"+entry.getKey()+"\tvalue:"+entry.getValue());

}



下面程序为集合操作的简单测试程序,适合初学者,复制到ecliplse中就可以了。



packageFileUtil;



importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.HashSet;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Map;

importjava.util.Map.Entry;

importjava.util.Set;





publicclassCollectionTest{



publicstaticvoidmain(String[]args){



Listlist=newArrayList();

list.add("1");

list.add("1");

list.add("2");

list.add("3");



if(list.contains("1"))

System.out.println("yesone");



Setset=newHashSet();

set.add("1");

set.add("1");

set.add("2");

set.add("3");

set.add("5");

set.add("3");

set.add("4");

if(set.contains("2"))

System.out.println("yesanother");



Mapmap=newHashMap();

map.put("map1",1);

map.put("map2",1);

map.put("map3",3);

map.put("map1",2);

map.put("map1",1);



if(map.containsKey("map1"))

System.out.println("yesthekey");



System.out.println(list);

System.out.println(set);

System.out.println(map);



/循环输出/

System.out.println("---------------list-------------");

for(Stringstr:list){

System.out.println(str);

}

for(inti=0;i
System.out.println(i+":"+list.get(i));

}

/此种方式效率最高/

Iteratorit=list.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

System.out.println("---------------set-------------");

for(Stringstr:set){

System.out.println(str);

}

IteratorsetIt=set.iterator();

while(setIt.hasNewww.shanxiwang.netxt()){

System.out.println(setIt.next());

}

System.out.println("---------------map(keyset及entryset)-------------");

for(Stringstr:map.keySet()){

System.out.println("key:"+str+"\tvalue:"+map.get(str));

}

/此种方式快/

for(Entryentry:map.entrySet()){

System.out.println("key:"+entry.getKey()+"\tvalue:"+entry.getValue());

}



/集合之间的操作/

List>list1=newArrayList>();

Listlist2=newArrayList();

list2.add("one");

list2.add("two");

list2.add("three");

list2.add("1");



list1.add(list);

System.out.println("list1:\t:"+list1);

list1.add(list2);

System.out.println("list1:\t:"+list1);

list1.addAll(list1);

System.out.println("list1:\t:"+list1);

list.retainAll(list2);

System.out.println("list:\t:"+list);



Set>set1=newHashSet>();

Setset2=newHashSet();

set2.add("one");

set2.add("two");

set2.add("three");



set1.add(set);

set1.add(set2);

set1.addAll(set1);

System.out.println(set1);

set.retainAll(set2);

System.out.println(set);



Map>mapNew=newHashMap>();

mapNew.put("new1",map);

mapNew.putAll(mapNew);

System.out.println(mapNew);



}



}



java基础篇QueryRunner

1、Java操作数据库



如何将爬虫爬取的数据存储下来也是我们关注的问题之前,常用的存储方式有.txt,mysql,hbase等。前面已经介绍了Java输入流输出流操作文本的方式,现在主要介绍几种Java操作mysql的方式。



java操作数据库第一种方法



这种方法,是操作数据库的最简单,也是最原始的方法。



packagecrawlerTest;



importjava.sql.Connection;

importjava.sql.DriverManager;

importjava.sql.ResultSet;

importjava.sql.SQLException;

importjava.sql.Statement;



publicclassMysqlConnectionTest{



publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{

Connectionconnection=null;//数据库连接的获取

Statementstmt=null;//创建Statement对象

ResultSetrst=null;//创建数据库执行对象

Stringdriver="com.mysql.jdbc.Driver";//数据库驱动

StringdbURL="jdbc:mysql://127.0.0.1:3306/test";//操作的数据库地址,端口及库名

Stringuser="root";//数据库用户名

Stringpassword="112233";//数据库密码

Class.forName(driver);//驱动注册



try{

connection=DriverManager.getConnection(dbURL,user,password);

}catch(SQLExceptione){

e.printStackTrace();

}

//连接数据库

stmt=connection.createStatement();

Stringsql="selectfromauto_forum_commentslimit1,100";//需要查询的语句

rst=stmt.executeQuery(sql);

while(rst.next()){

System.out.println(rst.getString(6));//取第6列数据



}

rst.close();

stmt.close();

connection.close();

}



}



java操作数据库的QueryRunner方法



QueryRunner是apache下面的开源操作数据库的工具,其是一款非常实用的操作数据库的工具,也是本人最常用的一种工具。其中包括batch()、update()、insert()等常用数据操作方法,下面我通过具体的程序来说明这些方法。

首先,我们要创建一个对象类(model),用来封装对象。如下图所示,为我们在model下建的两个类。其中Address类为本案例所用的类,主要用来封装数据库中的数据(我们需要操作的数据表),如下图所示。







packagemodel;



publicclassAddress{

privateStringaddr_id;

privateStringaddr_car;

privateStringaddr_url;

privateStringaddr_forum;

privateStringcraw_time;

//在ecliplse中使用快捷键,shift+alt+s快捷生成set、get方法

publicStringgetAddr_id(){

returnaddr_id;

}

publicvoidsetAddr_id(Stringaddr_id){

this.addr_id=addr_id;

}

publicStringgetAddr_car(){

returnaddr_car;

}

publicvoidsetAddr_car(Stringaddr_car){

this.addr_car=addr_car;

}

publicStringgetAddr_url(){

returnaddr_url;

}

publicvoidsetAddr_url(Stringaddr_url){

this.addr_url=addr_url;

}

publicStringgetAddr_forum(){

returnaddr_forum;

}

publicvoidsetAddr_forum(Stringaddr_forum){

this.addr_forum=addr_forum;

}

publicStringgetCraw_time(){

returncraw_time;

}

publicvoidsetCraw_time(Stringcraw_time){

this.craw_time=craw_time;

}



}





packagedb;



importjavax.sql.DataSource;



importorg.apache.commons.dbcp2.BasicDataSource;



publicclassMyDataSource{



publicstaticDataSourcegetDataSource(StringconnectURI){



BasicDataSourceds=newBasicDataSource();

ds.setDriverClassName("com.mysql.jdbc.Driver");

ds.setUsername("root");

ds.setPassword("112233");

ds.setUrl(connectURI);

returnds;



}

}



下面表示写操作数据库语句了



packagecrawlerTest;

importjava.sql.SQLException;

importjava.util.List;

importjavax.sql.DataSource;

importmodel.Address;

importorg.apache.commons.dbutils.QueryRunner;

importorg.apache.commons.dbutils.ResultSetHandler;

importorg.apache.commons.dbutils.handlers.BeanListHandler;

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;



importdb.MyDataSource;



publicclassQueryRunnerTest{

staticfinalLoglogger=LogFactory.getLog(QueryRunnerTest.class);

publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{

/所要操作的数据库/

DataSourceds=MyDataSource.getDataSource("jdbc:mysql://127.0.0.1:3306/test");

QueryRunnerqr=newQueryRunner(ds);

ResultSetHandler>h=newBeanListHandler
(Address.class);

/执行sql语句获取数据/

List
CarData=qr.query("SELECTaddr_id,addr_carFROMauto_forum_comments",h);

/遍历输出数据/

for(Addresscar:CarData){

logger.info("CarId:"+car.getAddr_id()+"\tcarName:"+car.getAddr_car());

}

}

}

献花(0)
+1
(本文系网络学习天...首藏)