通过WebMagic框架抓取网页中的手机号(实验练习一)

话不多说,直接上代码,代码中注释都写的很清楚了!!!

这样吧,加一个流程图,用来方便的了解WebMagic

package com.softeem.demo;

import java.awt.print.Pageable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.List;

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;

/**
 * 
 * @author 张智远
 *
 *WebMagic框架 使用Java原生开发方式
 *核心很简单,功能性给简单性让步
 *四个核心组件
 *PageProcessor 负责解析页面
 *Scheduler负责管理待抓取的URL
 *Pipeline 负责抽取结果处理,做持久化操作
 *Downloader 负责从网上下载页面
 */
public class GetPhoneNumber implements PageProcessor{
    PrintWriter pw=null;
     //抓取网站的相关配置
    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文档中查找信息的语言
            //XQuery和Xpointer都是构建在Xpath之上
            List<String> list=html.xpath("[@id='f12']/table/tbody/tr/td[1]/a/text()").all();//用id进行定位
            //将文件保存到本地
            downPhoneNumber(list);
            for (String string : list) {
                System.out.println(string);
            }
            
        }
    }
    //将内容存放到本地的方法
    public void downPhoneNumber(List<String> list) {
        //描述存的位置路径文件
        File file=new File("D:/phoneNumber1.txt");
        
        try {
            //输出流
            FileOutputStream fos=new FileOutputStream(file);
            //字符流
             pw=new PrintWriter(fos,true);
            //往本地输出
            for (String string : list) {
                pw.println(string);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(pw!=null)pw.close();
        }
        
    }
    
    //程序入口
    public static void main(String[] args) {
        Spider.create(new GetPhoneNumber())
        .thread(1)
        .addUrl("http://www.taohaoma.com/mobile/number?p=1&order=")
        .run();
    }
    
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章