1.WebMagic框架简介

什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

WebMagic框架

是使用Java原生开发

核心很简单 功能性要给简单性让步

WebMagic框架包含四个核心组件 :PageProcessor,Scheduler,Downloader和Pipeline 四个组件分别对应了爬虫生命周期 处理,管理,下载和持久化等功能

2.WebMagic框架的简单应用,爬取网站的电话号码

package com.softeem.demo;
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;
public class WebMagicGetPhone implements PageProcessor {
    
    //声明一个Site类型的变量用来对目标网站设置一些相关的配置
    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) {
//      System.out.println(page);
        //获取到通过Downloader下载下来的页面URL
        Selectable url = page.getUrl();
//      System.out.println(url);   Spring官方推出的STS
        //通过正则表达式去匹配是否是我们需要抓取内容的目标URL   
        if(url.regex("http://www.taohaoma.com/mobile/number\\?p=\\d&order=")
                .match()){
            //是有效的就开始抓取             
            //获取页面信息
            Html html = page.getHtml();
            //System.out.println(html);
            //通过Xpath去解析Html   
            //Xpath是W3C XSLT标准的主要元素 还是一门在XML文档中查找信息的语言
            //XQuery 和Xpointer都是构建与Xpath之上的,一定要找到一个唯一的参照物
            //id=f12>table>tbody>tr>第一个td>a>内容
            List<String> list = html
                    .xpath("[@id='f12']/table/tbody/tr/td[1]/a/text()")
                    .all();
//          list.forEach(phone->{
//              System.out.println(phone);
//          });
            for (String string : list) {
                System.out.println(string);
            }
            //TODO 存数据库(JDBC/MyBatis)/写入到本地硬盘也行(IO流)
            //将抓取到的文件内容保存到硬盘
            downPhoneNumber(list);
        }
    }
    
    //将内容写入到本地硬盘
    private void downPhoneNumber(List<String> list) {
        //描述文件路径
        File file = new File("D:/phone.txt");
        PrintWriter pw = null;
        //输出流
        try {
            FileOutputStream out = new FileOutputStream(file);
            //字节流转为字符流
            pw = new PrintWriter(out,true);
            //通过字符输出流将集合中的每一个元素输出
            for (String string : list) {
                pw.println(string);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally { //final finally finalize区别【常见的笔试题】  
            //高并发AQS锁机制、分布式、微服务、缓存、非关系型数据库,企业必备项目
            if(pw != null){
                pw.close();
            }
        } 
    }
    public static void main(String[] args) {
        Spider.create(new WebMagicGetPhone())
            .thread(1)
            .addUrl("http://www.taohaoma.com/mobile/number?p=1&amp;order=")
            .run();
    }
    
}

最后修改日期:2020-06-28

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。