java爬虫webMagic框架初见笔记

如果有因业务需求,或者个人兴趣需要在某网页上获取数据,java爬虫是必须要接触并掌握的,我也是第一次接触爬虫框架,在网上搜索了几个都说webMagic稳定好用就自己尝试着去学习使用。

WebMagic框架包含四个组件,PageProcessor、Scheduler、Downloader和Pipeline。

这四大组件对应爬虫生命周期中的处理、管理、下载和持久化等功能。

这四个组件都是Spider中的属性,爬虫框架通过Spider启动和管理。

然后这个框架有四大组件

PageProcessor 负责解析页面,抽取有用信息,以及发现新的链接。需要自己定义。

Scheduler 负责管理待抓取的URL,以及一些去重的工作。一般无需自己定制Scheduler。

Pipeline 负责抽取结果的处理,包括计算、持久化到文件、数据库等。

Downloader 负责从互联网上下载页面,以便后续处理。一般无需自己实现。

下面看具体代码实现:
首先是webMagic的依赖

		<!-- WebMagic -->
		<dependency>
			<groupId>us.codecraft</groupId>
			<artifactId>webmagic-core</artifactId>
			<version>0.7.3</version>
		</dependency>
		<dependency>
			<groupId>us.codecraft</groupId>
			<artifactId>webmagic-extension</artifactId>
			<version>0.7.3</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

这里我自己根据网上的大佬代码写了一个小demo,首先去继承PageProcessor,这里具体是去解析页面,这里有个小坑,就是不是每个网页都可以把html的body原封不动的获取下来,那我们就需要模拟POST请求,这里我们就需要设置一下这个site,这样就可以获取到自己想要的body
在这里插入图片描述我的demo是用网页的xpath去定位自己所需要的数据的,具体先自己定位那块如果是Chrome开发者浏览器可以右键复制xpath。
我这里是用的网页上相同所有的class元素,拿到这个List之后,可以根据业务需求各自进行处理。
在这里插入图片描述

package com.iShift.kachaschool;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.List;

import javax.imageio.ImageIO;
import gui.ava.html.image.generator.HtmlImageGenerator;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

public class WebMagic implements PageProcessor {

	private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000).addHeader("User-Agent",
			"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");

	public static String knowledge = "****";
	public static int pageNum = 1;
	public static int i = 1;
	public static List<String> htmlListLike;

	public void process(Page page) {

		// 获取页面需要的内容,这里只取了标题,其他信息同理。
		String fileId = knowledge.substring(3) + "_anchor";
		List<String> htmlList = page.getHtml().xpath("//*[@class='quesbody question-text']").all();
		String fileName = page.getHtml().xpath("//*[@id='crumbCanvas']/a[3]/text()").toString();
		try {
			if (!htmlList.equals(htmlListLike)) {
				for (String html : htmlList) {
					makeHtmlImage(html, fileName);
				}
			} else {
				System.err.println("开始下一页");
				knowledge = "zsd" + (Integer.parseInt(knowledge.substring(3)) + 1);
				pageNum=1;
			}
			htmlListLike = htmlList;
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public Site getSite() {
		return site;
	}

	private void makeHtmlImage(String html, String fileName) throws Exception {
		HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
		imageGenerator.loadHtml(html);
		BufferedImage bufferedImage = imageGenerator.getBufferedImage();
		ByteArrayOutputStream outPutStream = new ByteArrayOutputStream();
		ImageIO.write(bufferedImage, "png", outPutStream);
		File file = new File("D:\\webMagic\\" + fileName);
		if (!file.exists()) {
			file.mkdir();
		}
		imageGenerator.saveAsImage("D:\\webMagic\\" + fileName + "\\" + i++ + ".png");
//		com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(outPutStream.toByteArray());
	}

	public static void main(String[] args) {

		while (true) {
			String url = "http:/*******/" + knowledge + "/***" + pageNum + "/";
			Spider.create(new WebMagic()).addUrl(url).thread(1).run();
			pageNum += 1;
			if (knowledge.equals("*****")) {
				break;
			}
		}

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值