|
网络爬虫之java基础 |
|
|
网络爬虫之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语句获取数据/
ListCarData=qr.query("SELECTaddr_id,addr_carFROMauto_forum_comments",h);
/遍历输出数据/
for(Addresscar:CarData){
logger.info("CarId:"+car.getAddr_id()+"\tcarName:"+car.getAddr_car());
}
}
}
|
|
|
|
|
|
|
|
|
|
|