1、入口地址
2、排重使用布隆过滤 对URL进行MD5编码
3、数据展示使用控制台,可以自己编写存储媒介
4、工具类md5和布隆网上不少,可以参考。
5、若有其他需求可联系。电商数据注意应该使用虚拟浏览器。
源码:
import java.io.IOException; import java.util.LinkedList; import java.util.Queue; import java.util.regex.Pattern; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; /** * * @ClassName:BaiJiaCrawler * @Description:TODO 爬取百度百家的爬虫示例 * @qq: 674451971 * @date 2016年4月26日 */ public class BaiJiaCrawler { //入口地址 private String baseUrl = "http://baijia.baidu.com/"; //文章正则 private Pattern articlePtn = Pattern.compile("baijia\\.baidu\\.com/article/\\d+"); //这里直接使用内存进行存储URL 可以换成自己的存储媒介 //多线程可以考虑使用并发队列 private Queue<String> urlQueue = new LinkedList<String>(); //文章URL排重 一种是布隆过滤器 另一种是存储媒介 mysql或其他 使用md5方式 private SimpleBloomFilter articleFilter = new SimpleBloomFilter(); //排重文章列表以外的URL private SimpleBloomFilter otherFilter = new SimpleBloomFilter(); public void start() throws IOException{ do { Document doc = Jsoup.connect(baseUrl) .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36") .get(); Elements urls = doc.select("a"); for (Element url : urls) { String href = url.absUrl("href"); //将处理限制在百度百家内 if(href.contains("baijia.baidu.com/")){ //区分文章和非文章 if(articlePtn.matcher(href).find()){ //文章排重 String md5 = Md5Util.md5(href.getBytes()); if(articleFilter.contains(md5)){ continue; }else{ articleFilter.add(md5); } doc = Jsoup.connect(href) .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36") .get(); //解析文章 并完成存储(自己实现喽) Article at = new Article(); at.setSource("百度百家"); at.setTitle(doc.select("div#page h1").text().trim()); at.setUrl(href); at.setAuthor(doc.select("div#page div.article-info a.name").text().trim()); at.setPublishDate(doc.select("div#page div.article-info span.time").text().trim()); //文章标签可以是数组 at.setLabels(doc.select("div#page div.article-info a.tag").text().trim()); at.setTypeName(doc.select("div#page span.type a.category").text().trim()); at.setReadNum(doc.select("div#page div.article-info.article-info2 em.readnum").text()); at.setCommit(doc.select("div#page blockquote").text()); //图片下载页可以实现 后期再写 at.setContent(doc.select("div#page div.article-detail").text()); at.setZanNum(doc.select("a#up_article span.num").text()); at.setShuiNum(doc.select("a#down_article span.num").text()); at.setCommentNum(doc.select("div#mod-comment h3 em").text()); //数据库存储或者hbase存储 System.out.println(href); System.out.println(at); }else{ //对于非文章的链接而言需要有一个存储的地方,可以考虑redis 内存型的都可以 String md5 = Md5Util.md5(href.getBytes()); if(otherFilter.contains(md5)){ continue; }else{ urlQueue.add(href); articleFilter.add(md5); } } } } baseUrl = urlQueue.poll(); } while (baseUrl != null); } public static void main(String[] args) { BaiJiaCrawler crawler = new BaiJiaCrawler(); try { crawler.start(); } catch (IOException e) { e.printStackTrace(); } } }
javaBEan类:
public class Article { //文章来源 private String source; //文章标题 private String title; //文章链接 private String url; //文章作者 private String author; //发表日期 通过转换一下即可 private String publishDate; //转换一下即可 文章标签 private String labels; //文章分类 private String typeName; //阅读数 private String readNum; //文章摘要 private String commit; //文章内容 private String content; //赞数 private String zanNum; //水数 private String shuiNum; //评论数 private String commentNum; //评论抓取 这个可以扩展 自己写 对于电商产品的评论 大众点评等都是有需要的 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPublishDate() { return publishDate; } public void setPublishDate(String publishDate) { this.publishDate = publishDate; } public String getLabels() { return labels; } public void setLabels(String labels) { this.labels = labels; } public String getTypeName() { return typeName; } public void setTypeName(String typeName) { this.typeName = typeName; } public String getReadNum() { return readNum; } public void setReadNum(String readNum) { this.readNum = readNum; } public String getCommit() { return commit; } public void setCommit(String commit) { this.commit = commit; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getZanNum() { return zanNum; } public void setZanNum(String zanNum) { this.zanNum = zanNum; } public String getShuiNum() { return shuiNum; } public void setShuiNum(String shuiNum) { this.shuiNum = shuiNum; } public String getCommentNum() { return commentNum; } public void setCommentNum(String commentNum) { this.commentNum = commentNum; } @Override public String toString() { return "Article [source=" + source + ", title=" + title + ", author=" + author + ", publishDate=" + publishDate + ", labels=" + labels + ", typeName=" + typeName + ", readNum=" + readNum + ", commit=" + commit + ", zanNum=" + zanNum + ", shuiNum=" + shuiNum + ", commentNum=" + commentNum + "]"; } }
结果示例:
http://miaodingchun.baijia.baidu.com/article/425715
Article [source=百度百家, title=网红+美妆直播,短视频变现的正确姿势?, author=缪定纯, publishDate=04月26日 11:23, labels=网红 美妆, typeName=互联网, readNum=3614, commit=化妆品猜价真的玩坏了男朋友吗?不,这其实是一种新的“心机boy”版化妆品营销方式。, zanNum=4, shuiNum=2, commentNum=0]
http://tianshike.baijia.baidu.com/article/426337
Article [source=百度百家, title=陈年:你告诉我,我为什么要放弃?, author=天使客, publishDate=04月26日 16:17, labels=, typeName=财经, readNum=7, commit=可能很多人都不知道:凡客还活着。, zanNum=0, shuiNum=0, commentNum=0]
http://daxianggonghui.baijia.baidu.com/article/426331
Article [source=百度百家, title=中国哪里人最能吃辣, author=大象公会, publishDate=04月26日 16:17, labels=, typeName=文化, readNum=307, commit=“四川人不怕辣,湖南人辣不怕,贵州人怕不辣”的说法准确吗?中国哪里人吃掉的辣椒最多?品种最辣?, zanNum=0, shuiNum=0, commentNum=0]
http://joypie.baijia.baidu.com/article/426305
Article [source=百度百家, title=盛兴之下的中国电影产业面临VR更显局促 进不进?, author=刘云, publishDate=04月26日 15:57, labels=电影 vr电影 票房造假, typeName=互联网, readNum=62, commit=VR对文化创意产业,尤其是影视行业究竟会带来什么样的影响?中国电影产业现状又是怎么样的呢?, zanNum=2, shuiNum=0, commentNum=0]
http://guixingwen.baijia.baidu.com/article/426258
Article [source=百度百家, title=NewGen Capital张璐:美国Q1资本寒冬下的投资机遇, author=硅星闻, publishDate=04月26日 15:49, labels=创投 资本寒冬 VC, typeName=互联网, readNum=11, commit=美国的创投“寒潮”为资本活跃的中国带来难得的时代机遇。, zanNum=0, shuiNum=0, commentNum=0]