WebMagic抓取阿里司法拍卖信息

1、 引入pom文件

  <!--webmagic网络爬虫-->
        <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>

2、 编写爬虫工具

/**
 * 网络爬虫工具
 *
 * @author sunyiran
 * @date 2018-09-11
 */
public class WebMagicUtils {


    /**
     * 抓取csdn文章标题
     * @param beginUrl
     * @param urlReg
     * @param xpath
     * @return
     */
    public Map<String, List<String>> getCsdnInfo(String beginUrl, String urlReg, Map<String, String> xpath) {
        Map<String,List<String>> map = new HashMap<>();
        //是否结束抓取
        AtomicBoolean end = new AtomicBoolean(false);
        //定义抓取规则
        PageProcessor processor = new PageProcessor() {

            @Override
            public void process(Page page) {
                page.addTargetRequests(page.getHtml().links().regex(urlReg).all());

                //lambda遍历map集合
                xpath.forEach((x, y) -> {
                    //根据xpath语法解析页面元素
                    Selectable selectable = page.getHtml().xpath(y);
                    //如果不再获取
                    if (selectable.get() == null) {
                        end.set(true);
                    } else {
                        //如果元素已经开始存入map则在value中追加内容,否则新建
                        if(map.containsKey(x)) {
                            map.get(x).addAll(selectable.all());
                        }else {
                            map.put(x, selectable.all());
                        }
                    }
                });
            }
            @Override
            public Site getSite() {
                return Site.me().setRetryTimes(3).setSleepTime(100);
            }
        };

        //开启线程抓取信息
        for (int i = 1; end.get() != true; i++) {
            Spider.create(processor).addUrl(beginUrl+i).addPipeline
                    (new ConsolePipeline()).thread(5).run();
        }
        return map;
    }

    public static void main(String[] args) {

        Map<String ,String> map = new HashMap<>();
        map.put("title","//h4/a/text()");
        WebMagicUtils webMagicUtils = new WebMagicUtils();
        Map<String, List<String>> info = webMagicUtils.getCsdnInfo("https://blog.csdn.net/qq_35813653/article/list/",
                "https://blog.csdn" +
                ".net/qq_35813653/article/list/\\d", map);
        System.out.println(info.get("title").size());

    }
}

3、 测试

 在本文章发布前,我的博客总计三页,共49篇。如上,在抓取第四页时结束抓取,共获得49篇文章的文章名。

4、改进后抓取阿里司法拍卖的房产信息

  信息存储数据结构

package com.example.common.entity;

import lombok.Data;

/**
 * @author sunyiran
 * @date 2018-09-11
 */
@Data
public class House {

    private Long id;
    /**
     * 详情地址
     */
    private String itemUrl;
    /**
     * 拍卖状态
     */
    private String status;
    /**
     * 房屋地址
     */
    private String title;
    /**
     * 房屋图片
     */
    private String picUrl;
    /** */
    private Long initialPrice;
    /**
     * 成交价
     */
    private Long currentPrice;
    /**
     * 评估价格
     */
    private Long consultPrice;
    /**
     * 等待报价
     */
    private Long marketPrice;
    /**
     * 是否结束拍卖
     */
    private boolean sellOff;
    /**
     * 开始时间
     */
    private Long start;
    /**
     * 结束时间
     */
    private Long end;
    /**
     * 距离开始时间
     */
    private Long timeToStart;
    /**
     * 距离结束时间
     */
    private Long timeToEnd;
    /**
     * 围观人数
     */
    private Long viewerCount;
    /**
     * 竞价次数
     */
    private Long bidCount;
    /**
     * 设置提醒人数
     */
    private Long delayCount;
    /**
     * 报名人数
     */
    private Long applyCount;
    /**
     * xmpp协议号
     */
    private String xmppVersion;
    /**
     * 是否限购
     */
    private Long buyRestrictions;
    /**
     * 是否支持贷款
     */
    private int supportLoans;
    /**
     * 是否支持公积金
     */
    private int supportOrgLoan;

}

  工具类

package com.example.common.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.common.entity.House;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 网络爬虫工具
 *
 * @author sunyiran
 * @date 2018-09-11
 */
public class WebMagicUtils {


    /**
     * 抓取
     * @param beginUrl 指定开始抓取的页面
     * @param linkReg  获取页面下满足要求的链接
     * @param xpath  指定抓取的内容
     * @return
     */
    public Map<String, List<String>> getInfo(String beginUrl, String linkReg, Map<String, String> xpath) {
        Map<String,List<String>> map = new HashMap<>();
        //是否结束抓取
        AtomicBoolean end = new AtomicBoolean(false);
        //定义抓取规则
        PageProcessor processor = new PageProcessor() {

            @Override
            public void process(Page page) {
                if(linkReg != null) {
                    page.addTargetRequests(page.getHtml().links().regex(linkReg).all());
                }

                //lambda遍历map集合
                xpath.forEach((x, y) -> {
                    //根据xpath语法解析页面元素
                    Selectable selectable = page.getHtml().xpath(y);
                    //如果不再获取
                    Map parseObject = JSONObject.parseObject(selectable.get(), Map.class);
                    if (selectable.get() == null) {
                        end.set(true);
                    } else if (parseObject.get("data").toString().equals("[]")) {
                        end.set(true);
                    }else {
                            //如果元素已经开始存入map则在value中追加内容,否则新建
                            if(map.containsKey(x)) {
                                map.get(x).addAll(selectable.all());
                            }else {
                                map.put(x, selectable.all());
                            }
                        }
                });
            }
            @Override
            public Site getSite() {
                return Site.me().setRetryTimes(3).setSleepTime(100);
            }
        };

        //开启线程抓取信息
        for (int i = 1; !end.get(); i++) {
            Spider.create(processor).addUrl(beginUrl+i).addPipeline
                    (new ConsolePipeline()).thread(5).run();
        }
        return map;
    }

    public static void main(String[] args) {
        

        Map<String ,String> map = new HashMap<>();
        map.put("content","//script[@id='sf-item-list-data']/html()");
        WebMagicUtils webMagicUtils = new WebMagicUtils();
        Map<String, List<String>> info = webMagicUtils.getInfo("https://sf.taobao" +
                        ".com/list/50025969.htm?spm=a213w.7398504.pagination.2.543235d6w5wPsh&auction_start_seg=-1" +
                        "&page=",
                null, map);
        Object o = JSONObject.parseObject(info.get("content").get(0), Map.class).get("data");
        List<House> houses = JSONArray.parseArray(o.toString(), House.class);
        System.out.println(houses);

    }
}

测试结果

猜你喜欢

转载自blog.csdn.net/qq_35813653/article/details/82622631