采集新闻网页分类并进行数据训练(局域网)

.WebMagic简介

2.需求描述

3.实验环境

4.分析网页源码结构

5.搭建爬虫代码框架

6.代码编写

7.执行测试

【实验原理】

WebMagic简介

本项目利用WebMagic爬取用于训练的网页保存到本地。

1.WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。

WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应用了HttpClient、Jsoup等Java世界最成熟的工具,目标就是做一个Java语言Web爬虫的教科书般的实现。

网站:http://webmagic.io/

中文文档:http://webmagic.io/docs/zh/

WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy,但是实现方式更Java化一些。而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。

WebMagic总体架构图如下:

组件讲解

1.Downloader

Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。

2.PageProcessor

PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。

在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

3.Scheduler

Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。

除非项目有一些特殊的分布式需求,否则无需自己定制Scheduler。

4.Pipeline

Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。

Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。对于一类需求一般只需编写一个Pipeline。

【实验环境】

Linux Ubuntu 16.04

Eclipse 4.2

Google Chrome

【实验内容】

因为我们的目的是对网页进行分类,所以我们首先要确定我们都把网页分为哪几类。初步设定网页类别有10种,分别是体育、军事、财经、娱乐、文化、健康、汽车、教育、房产和其它。根据我们设定好的类别分别采集这10种网页,每种采集500篇。

我们可以爬取局域网中新闻网站的各类网页,局域网中的网站只是用来示范如何爬取本实验用到的数据,在下一个实验任务中会提供完整的10个类别的新闻网页,本次实验任务以采集该网站中体育类的网页为例进行讲解。

【实验步骤】

分析网页源码结构

腾讯新闻分类网页的网址:10.51.46.104:32400/qq,该网页如下图所示

点击其中的体育类别,进入体育类新闻界面,如下图所示

接下来分析网页源码,找到各个新闻网页的网址,为爬取工作做准备

第一步:选择其中一条新闻标题,点击右键,在弹出的菜单中选择检查并点击,出现如下界面。

图中左边红框为选择的新闻标题,右边为该网页的源码部分,红框区域为该新闻的网址。

以同样方法检查其他新闻网址,找到这些新闻详细页网址的规律,发现新闻标题的格式为:/qqdetail/5,即网址都有公共部分/qqdetail/,不同的地方是后面的数字。找到这些网址的规律,是进行爬虫实验的前提工作。

搭建爬虫代码框架

1.切换目录到/data/目录下,创建名为edu1的目录

cd /data/
mkdir /data/edu1

Copy

2.切换目录到/data/edu1目录下,使用wget命令,下载webmagic爬虫项目所依赖的lib包

cd /data/edu1
wget http://10.51.46.104:32600/allfiles/second/edu1/webmagic-0.7-libs.tar.gz

Copy

将webmagic-0.7-libs.tar.gz压缩包,解压缩。

tar -xzvf webmagic-0.7-libs.tar.gz

Copy

3.打开eclipse开发工具


 

新建Java Project,命名为pachong


 

点击项目名pachong,新建一个目录,命名为libs,并将/data/edu1/webmagic-0.7-libs下的所有的jar包,拷贝到libs目录下。并选中所有jar包,右键点击“Build Path” => “Add to Build Path”

4.在pachong项目下,点击src => New => Package新建一个包

在弹出窗口中,输入包名my.train

在my.train包下,新建class类

将新建的类,命名为Tengxun,搭建完的代码框架如下:

代码编写

在WebMagic里,实现一个基本的爬虫只需要编写一个类,实现 us.codecraft.webmagic.processor.PageProcessor接口即可。这个类基本上包含了抓取一个网站,需要写的所有代码。实现接口后,重写里面的getSite和process方法

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;

public class Getgov implements PageProcessor {

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

	@Override
	public void process(Page arg0) {
	}

Copy

getSite()方法,返回的数据类型为us.codecraft.webmagic.Site类型。也就是对当前爬虫,进行设置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置。

private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

Copy

最终,将site对象,在getSite方法作为结果返回。

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

Copy

process方法,是WebMagic爬虫的核心部分,可以从下载到的Html页面抽取到想要的信息。WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。

page.putField("allhtml", page.getHtml().toString());

Copy

我们将体育类新闻的详细页通过addTargetRequests抓取网页,详细页中不同网页链接的不同之处是数字部分,我们可以用正则表达式匹配。

page.addTargetRequests(page.getHtml().links().regex("(/qqdetail/\\d+)").all());

Copy

在main函数中,Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个PageProcessor创建一个Spider对象,然后使用run()进行启动。同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。

Spider.create(new Getgov())
.addUrl("http://10.51.46.104:32400/qq/体育/")
.addPipeline(new FilePipeline("/data/train/sports"))
.setScheduler(new FileCacheQueueScheduler("/data/train/sports"))
.thread(5)
.run();

Copy

在此段代码中

.addUrl 爬虫初始化时,需要爬取的第一个页面。

.addPipeline(new FilePipeline("/data/edu1"))设置爬取结果存储形式和位置,保存位置是/data/edu1。

.addPipeline(new ConsolePipeline()) 设置爬取结果存储形式和位置,这里将结果同时输出到console页面。

.setScheduler(new FileCacheQueueScheduler()) 使用文件保存抓取的URL,可以在关闭程序并下次启动时,从之前抓取的URL继续抓取。需指定路径,会建立.urls.txt和.cursor.txt两个文件。 

执行测试

 采集体育类新闻的完整代码如下

package my.train;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler;
public class Tengxun implements PageProcessor {
	private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
	public void process(Page page) {
		page.putField("allhtml", page.getHtml().toString());
		page.addTargetRequests(page.getHtml().links().regex("(/qqdetail/\\d+)").all());
	}
	public Site getSite() {
		return site;
	}
	public static void main(String[] args) {
		Spider.create(new Tengxun())
				.addUrl("http://10.51.46.104:32400/qq/体育/")
                .addPipeline(new FilePipeline("/data/train/sports"))
                .setScheduler(new FileCacheQueueScheduler("/data/train/sports"))
				.thread(5)
				.run();
	}
}

Copy

在项目上,右键,点击Run As => Java Application

 打开桌面“终端模拟器”,进入命令行模式

切换到爬取结果的存储目录下,使用ls命令查看数据情况,部分结果数据如下图所示。

查看其中一个网页内容,我们可以看到网页源码,部分源码截图如下:

至此,采集体育类新闻结束。同理,我们可以根据分类需求,采集其它类型的网页,分别放在不同的文件夹中。

至此,实验结束 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值