前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java|使用WebMagic进行电话爬取

Java|使用WebMagic进行电话爬取

作者头像
算法与编程之美
发布2020-04-15 15:44:23
7640
发布2020-04-15 15:44:23
举报

1 什么是WebMagic

WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,可以快速开发出一个高效、易维护的爬虫,原生开发方式核心很简单,功能性给简单性让步。可以通过maven导入相关依赖,如下:

代码语言:javascript
复制

<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>

</dependency>

也可以直接下载相关的jar并导入使用,具体步骤原理这里就不一一赘述了。

2 框架简单解读

在前一篇文章里,教学了直接普通的去拿到想要的东西,这里开始就使用webmagic框架,其可以简化爬虫的开发流程,让开发者专注于逻辑功能的开发。

首先介绍一下其相应的四个组件及其功能,分别是:Pageprocessor(负责解析页面),Scheduler(负责管理待出去的URL),Pipeline(负责抽取结果处理,做持久化到数据库操作),Downloader(负责从网上下载页面)。下面是用一个图的直观介绍:

图1 组件介绍

3 代码步骤

接下来就开始代码的书写,而且在最后还有完整的代码及注释供大家参考,在这里需要的暂时只有PageProcessor组件,所以直接让类去实现:

代码语言:javascript
复制
implements PageProcessor

首先书写爬取的相关配置:

代码语言:javascript
复制
private Site site = 

Site.me().setCharset("utf-8").setTimeOut(10000).setRetrySleepTime(3).setSleepTime(1000);



@Override

public Site getSite() { return site; }

然后创建一个线程作为入口:

代码语言:javascript
复制

public static void main(String[] args) {

    Spider.create(new GetPhoneNumber())

            .thread(1)

            .addUrl("http://www.taohaoma.com/mobile/number?p=1&order=")

            .run();

}

接着就是重点的爬取逻辑:

代码语言:javascript
复制

@Override

    public void process(Page page) {

        Selectable url = page.getUrl();

        if (url.regex("http://www.taohaoma.com/mobile/number\\?p=\\d&order=").match()){

            Html html = page.getHtml();

            List<String> list = html.xpath("[@id='f12']/table/tbody/tr/td[1]/a/text()").all();

            downPhoneNumber(list);

        }

    }

最后就是需要写一个保存到本地的方法,如下:

代码语言:javascript
复制

public void downPhoneNumber(List<String> list){

    File file = new File("H:/桌面/tel2.txt");

    PrintWriter pw = null;

    try {

        FileOutputStream fos = new FileOutputStream(file);

        pw = new PrintWriter(fos,true);

        for (String string : list){

            pw.println(string);

        }

        System.out.println("写入完毕!");

    } catch (FileNotFoundException e) { 

       e.printStackTrace();

    } finally { 

        pw.close();

    }

}

完成了这些操作,就可以爬取到需要的资源了。

4 完整代码及详细注释

完整代码及详细注释如下:

代码语言:javascript
复制
package com.yellow.java_pachong.tel2;

 

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

import us.codecraft.webmagic.selector.Html;

import us.codecraft.webmagic.selector.Selectable;

 

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.util.List;

 

public class GetPhoneNumber implements PageProcessor {

    //抓取网站的相关配置

    private Site site = Site.me()

            .setCharset("utf-8")//设置字符集

            .setTimeOut(10000)//设置超时时间

            .setRetrySleepTime(3)//设置重试次数

            .setSleepTime(1000);//设置休眠时间

    @Override

    public Site getSite() { return site; }

    //爬取逻辑

    @Override

    public void process(Page page) {

        //通过Downloader下载下来的页面的URL

        Selectable url = page.getUrl();

//        System.out.println(url);

        //通过正则表达是去匹配是否是我们想要抓取的网页URL,像问号这种需要使用\去转义

        if (url.regex("http://www.taohaoma.com/mobile/number\\?p=\\d&order=").match()){

            //开始抓取信息

//            System.out.println("匹配成功");//检查是否匹配

            //获取页面信息

            Html html = page.getHtml();

//            System.out.println(html);//检查是否拿到网页

            //通过Xpath去解析html,Xpath是w3c xslt标准的主要元素   还是一门在xml文档中查找信息的语言,先定位到最近的一个div的idf12作为根部,再根据我们需要的号码一层一层下去,并用集合装

            List<String> list = html.xpath("[@id='f12']/table/tbody/tr/td[1]/a/text()").all();

            //将文件存到本地

            downPhoneNumber(list);

//            for (String string : list) {

//                System.out.println(string);

//            }//控制台遍历打印

        }

    }

    //将爬取到的内容保存到本地

    public void downPhoneNumber(List<String> list){

        //创建存储位置

        File file = new File("H:/桌面/tel2.txt");

        //定义流,为了可以在finally处,无论是否成功,都可以关流释放资源。

        PrintWriter pw = null;

        try {

            //输出流

            FileOutputStream fos = new FileOutputStream(file);

            //字符流

            pw = new PrintWriter(fos,true);

            //向本地输出

            for (String string : list){

                pw.println(string);

            }

            System.out.println("写入完毕!");

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } finally {

            //关流

            pw.close();

        }

    }

    //程序入口

    public static void main(String[] args) {

        //创建线程,addUrl爬哪个网址,run启动

        Spider.create(new GetPhoneNumber())

                .thread(1)

                .addUrl("http://www.taohaoma.com/mobile/number?p=1&order=")

                .run();

    }

}

5 注意提醒

在书写代码时需要注意到的几个容易犯错的地方:

在书写正则表达式及一些语句时,需要考虑是否需要转义。

在写Xpath时[@id='f12']里面,=号两边不能有空格。

Xpath可以直接在网页上进行copy,如下图:

图2 copy Xpath

END

主 编 | 王文星

责 编 | 黄晓锋

where2go 团队

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档