使用WebMagic爬虫框架爬取暴走漫画

WebMagic是黄亿华先生开发的一款java轻量级爬虫框架。我之所以选择WebMagic,因为它非常轻量级,可以学习爬虫的原理,而且用WebMagic非常容易进行功能扩展。也许你会听过另一个爬虫框架,Heritrix。博主一开始也是先入手了Heritrix,但是后来发现Heritrix实在是不够轻量级,因为博主只是想自己做个爬虫玩玩,并且能对爬虫的原理有更深刻的认识,所以,博主后来就开始入手更轻量级的WebMagic。由于博主也是刚接触WebMagic,写博客也只是为了记录我的学习到的知识,文章如有纰漏,敬请指正。


一、首先我们看一下我们要 爬取的网页,这个demo中,我打算爬取暴走漫画的中的笑话,内容包括作者名称(author),笑话内容(xontent),上传日期(time)


二、定义一个实体类封装爬取内容

public class BaozouNews {
// 作者
private String author;
// 提交时间
private String time;
// 内容
private String content;

getter and setter...
}



三、WebMagic中最重要的组件就是PageProcessor,它决定了你抓取数据的逻辑。

       1)确定要加入待爬取队列的超链接。

    我们爬取起始位置为第一页,因此我们要将其他页码的超链接加入待爬队列


我们可以清晰看到页码的超链接存放在class为pager-content的div块中,因此可以如下将超链接加入队列中,css选择器详见css参考手册

page.addTargetRequests(page.getHtml().css("div.pager-content").links().all());


2)确定待爬取数据。

文章内容(content)是class为article article-text的div的data-text属性,因此其xpath为,关于xpath详见xpath教程

String content=page.getHtml().xpath("//div[@class='article article-text']/@data-text").toString()
作者(author)是class为article-author-name的a的字符串部分

String author=page.getHtml().xpath("//a[@class='article-author-name']/text()").toString()
依此类推

String time=page.getHtml().xpath("//span[@class='article-date']/text()").toString()



四、根据第三步的分析,写自己的PageProcessor

public class BaoZouProcessor implements PageProcessor {
	private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

	@Override
	public void process(Page page) {
		page.addTargetRequests(page.getHtml().css("div.pager-content").links().all());
		BaozouNews news = new BaozouNews();
		news.setAuthor(page.getHtml().xpath("//a[@class='article-author-name']/text()").toString());
		news.setContent(page.getHtml().xpath("//div[@class='article article-text']/@data-text").toString());
		news.setTime(page.getHtml().xpath("//span[@class='article-date']/text()").toString());
		page.putField("news", news);
	}

	@Override
	public Site getSite() {
		return site;
	}

}

五、编写自己的Pipeline,将爬取到的数据保存到数据库

public class BaoZouPipeLine implements Pipeline {

	@Override
	public void process(ResultItems resultItems, Task task) {
		BaozouNews news = (BaozouNews) resultItems.get("news");
		Dao.insert(news);//将数据插入数据库
	}

}



六、将对数据库的操作进行简单的封装

public class Dao {

	private static Connection getConn() {
		String driver = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/baozou";
		String username = "root";
		String password = "";
		Connection conn = null;
		try {
			Class.forName(driver); // classLoader,加载对应驱动
			conn = (Connection) DriverManager.getConnection(url, username, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static int insert(BaozouNews news) {
		Connection conn = getConn();
		int i = 0;
		String sql = "insert into baozou (author,time,content) values(?,?,?)";
		PreparedStatement pstmt;
		try {
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			pstmt.setString(1, news.getAuthor());
			pstmt.setString(2, news.getTime());
			pstmt.setString(3, news.getContent());
			i = pstmt.executeUpdate();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}
}




七、编写测试类

public class Test {
	public static void main(String[] args) {
		Spider.create(new BaoZouProcessor())
				// 从"http://baozoumanhua.com/text"开始抓
				.addUrl("http://baozoumanhua.com/text").addPipeline(new BaoZouPipeLine())
				// 开启5个线程抓取
				.thread(5)
				// 启动爬虫
				.run();
	}
}



八、查看数据库结果,如图,成功地将网页上的数据保存到了数据库中



这只是一个简单的WebMagic爬虫的实例,但是还是可以学到很多东西。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
WebMagic框架是一个Java语言编写的开源网络爬虫框架,可以用来爬取各种网站上的数据。下面是使用WebMagic框架爬取数据的基本步骤: 1. 定义一个Java类,实现PageProcessor接口,用于解析网页内容,提取需要的数据。 2. 在PageProcessor定义需要爬取的URL地址,并设置爬取的规则。 3. 创建一个Spider对象,设置起始URL和PageProcessor对象。 4. 启动Spider对象,开始爬取数据。 5. 在PageProcessor定义处理数据的方法,将提取到的数据保存到文件或数据库。 以下是一个使用WebMagic框架爬取数据的示例代码: ``` public class MyPageProcessor implements PageProcessor { private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override public void process(Page page) { List<String> titles = page.getHtml().xpath("//div[@class='title']/a/text()").all(); List<String> contents = page.getHtml().xpath("//div[@class='content']/text()").all(); for (int i = 0; i < titles.size(); i++) { System.out.println(titles.get(i) + ": " + contents.get(i)); } } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new MyPageProcessor()) .addUrl("http://www.example.com") .thread(5) .run(); } } ``` 这个例子,我们定义了一个PageProcessor对象,在process方法使用XPath表达式提取了网页的标题和内容,并打印出来。然后我们创建了一个Spider对象,设置了起始URL和线程数,并启动了Spider对象,开始爬取数据。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值