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]