webmagic爬取百度知道的问答对并存到数据库
2017-11-11 20:53
281 查看
(1)定义数据库爬取的title:
(2)连接到数据库 (dao文件)
(3)定制爬虫的核心部分
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(); } } }
相关文章推荐
- Gartner分析师对云数据库的一点异见(Gartner分析师Don Feinberg对作为服务的数据库(Database as a Service)和云数据库(Cloud DBs)的问答)
- 数据库管理方面必知语句(问答)
- 数据库管理方面必知语句(问答)(转)
- Azure SQL 数据库:服务级别与性能问答
- Newtonsoft.Json读取txt文件中json数据并存到SQL service 数据库!
- 让人喷饭的百度知道问答
- Azure SQL 数据库:服务级别与性能问答
- 百度知道的问答,别笑抽过去了
- 百度知道的问答,别笑抽过去了
- 28 个 MongoDB NoSQL 数据库的面试问答
- yii2学习笔记(五):获取表单输入信息并存到数据库
- 关系数据库标准语言SQL的基本问答
- Azure SQL 数据库:服务级别与性能问答
- 百度知道的爆笑问答
- 问答的形成-C++ 提取百度知道内容
- PHP 从数据库中取出数据并存为Json数据
- 关系数据库的部分问答
- <JAVA,hibernate>从数据库中下载二进制文件并存到指定位置,把本地文件上传到数据库指定的字段中
- Azure SQL 数据库:服务级别与性能问答
- PHP实现上传文件并存进数据库的方法