【实验目的】
1.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
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
将webmagic-0.7-libs.tar.gz压缩包,解压缩。
tar -xzvf webmagic-0.7-libs.tar.gz
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) {
}
getSite()方法,返回的数据类型为us.codecraft.webmagic.Site类型。也就是对当前爬虫,进行设置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置。
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
最终,将site对象,在getSite方法作为结果返回。
@Override
public Site getSite() {
returen site;
}
process方法,是WebMagic爬虫的核心部分,可以从下载到的Html页面抽取到想要的信息。WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。
page.putField("allhtml", page.getHtml().toString());
我们将体育类新闻的详细页通过addTargetRequests抓取网页,详细页中不同网页链接的不同之处是数字部分,我们可以用正则表达式匹配。
page.addTargetRequests(page.getHtml().links().regex("(/qqdetail/\\d+)").all());
在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();
在此段代码中
.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();
}
}
在项目上,右键,点击Run As => Java Application
打开桌面“终端模拟器”,进入命令行模式
切换到爬取结果的存储目录下,使用ls命令查看数据情况,部分结果数据如下图所示。
查看其中一个网页内容,我们可以看到网页源码,部分源码截图如下:
至此,采集体育类新闻结束。同理,我们可以根据分类需求,采集其它类型的网页,分别放在不同的文件夹中。
至此,实验结束 !