博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
magic框架完成爬取文字数据
阅读量:7024 次
发布时间:2019-06-28

本文共 3457 字,大约阅读时间需要 11 分钟。

hot3.png

 

magic文档:

     爬虫技术的原理在网上有很多大神有详细的讲解,我主要根据自己的学习做些总结。爬虫技术宏观上看主要分为两个部分:页面发现、页面解析

    页面发现: 通过请求页面获得响应,将相应页面中的链接地址通过一定的规则(包括正则表达式、Xpath、Css选择器等等)筛选,找出自己需要的页面,并添加到一个未访问链接队列中,在处理完成页面后,从未访问队列取出链接访问后添加到一个已访问队列,通过比对两个队列中的链接保证页面访问的去重。

    页面解析:页面解析通常就是通过种种工具定位到具体的标签,将所需要的内容抽取出来,可以说不同的网站的处理方式是有很大差距。

    magic提供了pageProcessor接口定义获取页面的方式和参数设置

public class GetText implements PageProcessor {	@Override	public void process(Page page) {		// 获取所有url		List
urlaLL = page.getHtml() .links() // 获取页面下所有链接 .regex("http://www\\.kanunu8\\.com/(?:files|book[3-4]{1})/[^\\s]*") /* * 通过正则筛选: 只用当前网站的书籍页面加入队列 */ .all(); // 将所有符合条件的链接加入等待请求的队列 page.addTargetRequests(urlaLL); /* * 筛选元素: 通过xpath语法筛选指定标签下的元素 div/table[2]/tbody/tr/td/a/text(): * div元素下的第二个table中的tbody元素的tr-td-a标签中的文本内容 */ Selectable xpath = page.getHtml().xpath( "div/table[2]/tbody/tr/td/a/text()"); List
all = xpath.all(); String dirname = null; System.out.println(page.getUrl()); //去掉了获取内容中的书名号和空格,用于生成目录 if (all != null && all.size() >= 2) { if (all.size() == 2) { dirname = all.get(0).trim() + "\\" + all.get(1).trim().replaceAll("《|》", ""); } else { dirname = all.get(1).trim() + "\\" + all.get(2).trim().replaceAll("《|》", ""); } } //通过css选择器,获取页面中的p标签内容,并将所有的html标签替换为回车,同时转换空格 List
list = page.getHtml().$("p").replace("<[^>]*>", "\r\n") .replace(" ", " ").all(); String text = null; if (list != null && list.size() > 0) { text = list.get(0); } String filename = null; //css选择器获取H2标签下的font标签的文本内容 String subhead = page.getHtml().$("h2>font", "text").get(); if (subhead != null) { filename = subhead.trim(); } page.putField("dirname", dirname); page.putField("filename", filename); page.putField("text", text); if (page.getResultItems().get("dirname") == null || page.getResultItems().get("filename") == null || page.getResultItems().get("text") == null) { page.setSkip(true);//skip用于设置该页面是否需进行处理true则跳过处理 } } @Override public Site getSite() { //用于设置请求的参数,如请求间隔,重试间隔等 return Site.me().setRetryTimes(3).setSleepTime(1000); } public static void main(String[] args) { //核心类通过创建执行器开始爬虫 Spider.create(new GetText()) .addUrl("http://www.kanunu8.com/files/writer/8675.html") .thread(20) //添加了一个自定义的页面处理类 .addPipeline(new MyPipline()) .run(); }

在magic框架中将爬虫需要的功能都进行了抽取封装,使我们可以只关注爬虫逻辑即可

通过自定义的Pingline类完成页面写入本地

 

public class MyPipline implements Pipeline {	private static String basepath = "E:\\text\\";	@Override	public void process(ResultItems resultItems, Task task) {		try {			//ResultItems用于存储解析后的网页信息,以供后续操作			if (resultItems.isSkip()) {				return;			}						//ResultItems本身维护了一个map可以通过封装的get方法获取值			String dir = resultItems.get("dirname");			String filename = resultItems.get("filename");			String text = resultItems.get("text");			System.out.println("作品:" + dir);			// 创建文件写入路径			File dirfile = new File(basepath + dir + "\\");			if (!dirfile.isDirectory()) {				dirfile.mkdirs();			}			File file = new File(dirfile, filename + ".txt");			if (!file.isFile()) {				file.createNewFile();			}			try (FileWriter fw = new FileWriter(file, true)) {				fw.write(text);			}		} catch (IOException e) {			e.printStackTrace();		}	}	}

    133547_AUsQ_3521492.png

 

     在这样的解析下回将每本书生成文件夹,每个章节生成文档。曾经希望直接将整本书整合为一个文件夹,但因为无法控制所爬虫爬取的网页顺序而作罢。

    对于将爬取的数据写入单个文件的方案有两个想法:

    1.增加执行序列用于多线程之间协调工作,预先爬取书籍的所有页面并生成目录,再按指定顺序完成数据写入,难点是可能出现爬取数据不全,线程无限期休眠问题

    2.先写入数据库,再数据库中通过整理排列完成读取

转载于:https://my.oschina.net/dreamForMe/blog/1563149

你可能感兴趣的文章
基于ArcGIS10.0和Oracle10g的空间数据管理平台五(C#开发)-通用工具类
查看>>
android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d
查看>>
山西高速公路规划图
查看>>
PHP面试题集
查看>>
深入理解JavaScript系列(2):揭秘命名函数表达式
查看>>
ITS Mobile Template interpretation failed. Template does not exist
查看>>
boost bimap 学习笔记 - 胜者,为王!!! - 博客频道 - CSDN.NET
查看>>
nyoj429 骨牌铺方格
查看>>
2011年十大新兴企业级技术
查看>>
c# 智能设备应用程序不显示在任务栏以及最小化窗体
查看>>
Windows下使用pthread库(GCC CL编译器都可以使用)
查看>>
ASP.NET MVC集成EntLib实现“自动化”异常处理[实现篇]
查看>>
去掉viewstate保持在页面中的一大串字符的方法
查看>>
关于datediff(year,开始日期,结束日期)中year格式的说明,特别注意year两边不能加引号,否则报错...
查看>>
android activity 跳转与值
查看>>
详谈 JQuery Ajax异步处理Json数据
查看>>
从外部拖拽文件
查看>>
Linux简介与厂商版本
查看>>
MongoDB —— 第四篇 索引操作
查看>>
基础才是重中之重~你是否真正在用MVC路由功能~续
查看>>