java webmagic_java 之webmagic 网络爬虫

48304ba5e6f9fe08f3fa1abda7d326ab.png

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

import com.mysql.jdbc.Connection;

import com.nio.webmagic.jdbc.MySqlJdbcUtils;

import com.nio.webmagic.model.JavaBokeModel;

/**

*

* 爬虫

*

* @version [VCES V201R001, 2017年10月12日]

*

* @see 方法实现 PageProcessor

* @since [产品/模块版本]

*/

public class JavaBoKePageProcessor implements PageProcessor {

private static Connection conn=null;

private static PreparedStatement ps =null;

//标题和链接获取

private static String TITLEQUERY="div.post_item_body h3 a.titlelnk";

//作者

private static String AUTHORQUERY="div.post_item_foot a.lightblue ";

//简介

private static String SUMMARYQUERY="div.post_item_body p.post_item_summary";

//插入sql语句

private static String insertSql ="INSERT INTO Boke (title,linke,author,authorUrl,summary)VALUES(?,?,?,?,?)";

//初始链接

private static Connection getConnection(){

if (conn==null) {

conn = MySqlJdbcUtils.getOpenConnection();

}

return conn;

}

/**

*

* insert操作

*

* @date 2017年8月31日

* @return

*/

private synchronized void insertDb(List javaBokes){

try {

ps = conn.prepareStatement(insertSql);

for (JavaBokeModel javaBoke:javaBokes) {

ps.setString(1, javaBoke.getTitle().toString());

ps.setString(2, javaBoke.getLinke().toString());

ps.setString(3, javaBoke.getAuthor().toString());

ps.setString(4, javaBoke.getAuthorUrl().toString());

ps.setString(5, javaBoke.getSummary().toString());

ps.executeUpdate();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//初始化带爬取网页地址

private static List urls(){

List listUrl =new ArrayList();

for (int i = 2; i <=200; i++) {

//listUrl.add("http://www.cnblogs.com/cate/java/"+i);

listUrl.add("http://www.cnblogs.com/cate/java/"+i);

}

listUrl.toArray(new String[listUrl.size()]);

return listUrl;

}

/**

*

* jsoup根据 html 字符串和语法获取内容;

* @date 2017年8月31日

* @param htmlText

* @return

*/

private static String seletDocumentText(String htmlText,String Query){

Document doc = Jsoup.parse(htmlText);

String select = doc.select(Query).text();

return select;

}

/**

*

* jsoup根据 html 字符串和语法获取链接地址;

* @date 2017年8月31日

* @param htmlText

* @return

*/

private static String seletDocumentLink(String htmlText,String Query){

Document doc = Jsoup.parse(htmlText);

String select = doc.select(Query).attr("href");

return select;

}

/**

* process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑

* @see us.codecraft.webmagic.processor.PageProcessor#process(us.codecraft.webmagic.Page)

*/

@Override

public void process(Page page) {

//

page.addTargetRequests(urls());

//div[@class='post_item']//div[@class='post_item_body']//h3//a[@class='titlelnk']/text()'

// 定义如何抽取页面信息,并保存下来

List htmls =page.getHtml().xpath("//div[@class='post_item']/html()").all();

List javaBokes=new ArrayList();

for (String html:htmls) {

JavaBokeModel javaBoke =new JavaBokeModel();

//标题和链接

String title =seletDocumentText(html,TITLEQUERY);

String linke =seletDocumentLink(html,TITLEQUERY);

//作者和作者主页

String author=seletDocumentText(html, AUTHORQUERY);

String authorUrl=seletDocumentLink(html, AUTHORQUERY);

//简介

String summary=seletDocumentText(html, SUMMARYQUERY);

javaBoke.setTitle(title);

javaBoke.setAuthor(author);

javaBoke.setAuthorUrl(authorUrl);

javaBoke.setLinke(linke);

javaBoke.setSummary(summary);

javaBokes.add(javaBoke);

}

insertDb(javaBokes);

}

@Override

public Site getSite() {

//抓去网站的相关配置包括:编码、重试次数、抓取间隔

return Site.me().setSleepTime(1000).setRetryTimes(10);

}

public static void main(String[] args) {

long startTime ,endTime;

System.out.println("========小爬虫【启动】喽!=========");

getConnection();

startTime = new Date().getTime();

//入口

Spider create = Spider.create(new JavaBoKePageProcessor());

//定义入口地址

create.addUrl("http://www.cnblogs.com/cate/java/").thread(5).run();

try {

ps.close();

conn.close();

} catch (Exception e) {

// TODO: handle exception

}

endTime = new Date().getTime();

System.out.println("========小爬虫【结束】喽!=========");

System.out.println("用时为:"+(endTime-startTime)/1000+"s");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值