WebMagic爬取电商网站示例

1. 概要

WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。

WebMagic架构如下

  1. Scheduler

​ Scheduler负责管理待抓取的URL,以及一些去重的工作. 支持布隆算法.

  1. Downloader

​ Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。

  1. PageProcessor

​ PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup

  1. Pipeline

​ Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。

其中, PageProcessor和Pipeline是我们定制业务逻辑的地方.

WebMagic支持 “注解式” 爬虫的编写, 但个人感觉, 支持的场景非常有限.

WebMagic源码, 较为简单, 顺着如下示例程序, 调试一遍, 就能理解个七七八八了.

spider架构

注意

如果是简单应用爬虫, 且不熟悉python, 可以考虑类似的java爬虫框架.

如果是python专业用户, 可以直接上 scrapy.

2. POM.xml

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

3. KadSpider.java

package demo.webmagic;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.monitor.SpiderMonitor;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;

import javax.management.JMException;
import java.util.List;

/**
 *
 * WebMagic爬虫, 电商网站示例
 *
 * 康爱多(https://www.360kad.com/)
 *
 * @author liuxianqiang
 * @since 2021/2/24 14:39
 */
public class KadSpider implements PageProcessor {
    private Site site = Site
            .me()
            .setDomain(HOME_URL)
            .setSleepTime(3000)
            .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.3");

    /**
     * 主页
     */
    private static String HOME_URL = "https://www.360kad.com/";

    /**
     * 分类页
     */
    private static String CAT_URL = "(https://www.360kad.com/Category_(\\d+)/Index.aspx)\\??.*";

    /**
     * 商详页
     */
    private static String PRO_DETAIL_URL = "(https://www.360kad.com/product/(\\d+).shtml)\\??.*";

    /**
     * 商品价格请求
     */
    private static String PRO_PRICE_URL =  "(https://www.360kad.com/product/getprice\\?wareskucode=(\\d+))";


    private static String PRO_PRICE_URL_FORMAT =  "https://www.360kad.com/product/getprice?wareskucode=%s";

    /**
     * 爬取路径
     * 1. 以主页入口
     * 2. 据主页爬取分类页
     * 3. 据分类页爬取分类页及商详页
     * 4. 据商详页, 爬取商品名称和商品价格
     * @param page
     */
    @Override
    public void process(Page page) {
        // 商详页
        if (page.getUrl().regex(PRO_DETAIL_URL).match()) {
            String wareskucode = page.getUrl().regex(PRO_DETAIL_URL, 2).get();
            page.getResultItems().put("wareskucode", wareskucode);
            page.getResultItems().put("proname", page.getHtml().css(".prem-proname h1").regex("<h1>(.*)</h1>").get());

            // 进一步爬取商品价格
            page.addTargetRequest(String.format(PRO_PRICE_URL_FORMAT, wareskucode));

            return;
        }

        // 商品价格
        if (page.getUrl().regex(PRO_PRICE_URL).match()) {
            String wareskucode = page.getUrl().regex(PRO_PRICE_URL, 2).get();
            String price = page.getJson().jsonPath("$.StyleInfo.Price").get();
            page.getResultItems().put("wareskucode", wareskucode);
            page.getResultItems().put("price", price);
            return;
        }

        // 分类页
        if (page.getUrl().regex(CAT_URL).match()) {
            // 进一步抓取商详页
            List<String> productUrlList = page.getHtml().links().regex(PRO_DETAIL_URL).all();
            page.addTargetRequests(productUrlList);
        }

        // 进一步抓取分类页
        List<String> categoryUrlList = page.getHtml().links().regex(CAT_URL).all();
        page.addTargetRequests(categoryUrlList);
    }

    @Override
    public Site getSite() {
        return site;
    }

    public static void main(String[] args) throws JMException {
        Spider spider = Spider
                .create(new KadSpider())
// 主页, 分类页, 商详页, 商品价格请求
                .addUrl("https://www.360kad.com/")
//                .addUrl("https://www.360kad.com/Category_267/Index.aspx")
//                .addUrl("https://www.360kad.com/product/411.shtml")
//                .addUrl("https://www.360kad.com/product/getprice?wareskucode=411")
                .thread(10)
                // 默认控制台打印
                .addPipeline(new ConsolePipeline())
                // 默认,使用HashSet来进行去重,占用内存较大
                // 可选,使用BloomFilter来进行去重,占用内存较小,但是可能漏抓页面
                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000000)));

        // JMX监控
        SpiderMonitor.instance().register(spider);

        spider.run();
    }
}

4. 参考

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值