JAVA网络爬虫 实现爬取百度百家数据示例

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]



猜你喜欢

转载自blog.csdn.net/fhg12225/article/details/51251928