您的位置:首页 > 数据库

webmagic爬取百度知道的问答对并存到数据库

2017-11-11 20:53 281 查看
(1)定义数据库爬取的title:

package shuju;

public class baidu {

private String author;// 编号

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

public String toString() {
return "shuju [author=" + author + "]";
}
}


(2)连接到数据库 (dao文件)

package shuju;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class baiduDao {

private Connection conn = null;
public baiduDao() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url =   "jdbc:mysql://localhost:3306/test?"
+ "user=root&password=******&useUnicode=true&characterEncoding=UTF8";

//String url = "jdbc:mysql://127.0.0.1:3306/test?user=root&password=******";

conn = DriverManager.getConnection(url);
conn.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}

}

public int add(baidu shuju) {
try {
String sql = "INSERT INTO `test`.`shuju` (`author`) VALUES (?);";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, shuju.getAuthor());

return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
}


(3)定制爬虫的核心部分

package shuju;

import java.util.List;

import javax.management.JMException;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.monitor.SpiderMonitor;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
/**
定制爬虫的核心部分
*/
public class baiduzhengti implements PageProcessor {
private Site site = Site.me().setSleepTime(1);
public Site getSite() {
return site;
}
int temp=1;
//process(过程)
//学科列表
//初始页面的url的正则表达式
public static final String URL_LIST=
"http://zhidao\\.baidu\\.com/list\\?"
+"cid=110106\\&tag=\\w+";

//某学科的问题列表
//问题页面的正则表达式
public static final String URL_AIRICLE =
"http://zhidao\\.baidu\\.com/question"
+"/\\d+\\.html\\?fr=qlquick\\&entry"
+"=qb_list_default";

public void process(Page page) {
//class是每个页面中问题列表中单个问题的url
List<String> pages = page.getHtml().xpath("[@class='question-list-item']").links().all();
//如果进入这个页面后class符合要求那么就将其链接加入爬取队列
page.addTargetRequests(pages);
//将数据存入数据库
baidu shuju = new baidu();
//将列表中的一条打开后的页面的标题获取。class为单个问题页面的class。
page.putField("title", page.getHtml().xpath("//[@class='ask-title']/text()").toString());
shuju.setAuthor(page.getHtml().xpath("//[@class='ask-title']/text()").get());
new baiduDao().add(shuju);
// 把对象输出控制台
System.out.println(shuju);
// System.out.println(pages);
}

//执行这个main方法,即可在控制台看到抓取结果。webmagic默认有3秒抓取间隔,请耐心等待。
public static void main(String[] args) {
//Spider是爬虫的入口类,addurl为入口url
Spider oschinaSpider = Spider.create(new baiduzhengti()).addUrl("http://zhidao.baidu.com/list?cid=110106&tag=JSP")   //Pipeline是结果输出和持久化的接口,这里ConsolePipeline表示结果输出到控制台

//类                     说明                  备注
//ConsolePipeline 输出结果到控制台  抽取结果需要实现toString方法
//FilePipeline     保存结果到文件  抽取结果需要实现toString方法
//JsonFilePipeline     JSON格式保存结果到文件
//ConsolePageModelPipeline (注解模式)输出结果到控制台
//FilePageModelPipeline   (注解模式)保存结果到文件
//JsonFilePageModelPipeline   (注解模式)JSON格式保存结果到文件   想要持久化的字段需要有getter方法
.addPipeline(new JsonFilePipeline("F:/data"));
//将文件存贮到本地继续进行解析jsoup
try {
//添加到JMT监控中
SpiderMonitor.instance().register(oschinaSpider);
//设置线程数
//oschinaSpider.thread(5);
oschinaSpider.run();
} catch (JMException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: