Java SpringBoot+WebMagic爬取交易猫商品标题、url、价格、区服

pom坐标:

<dependencies>
        <!--SpringMVC-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--通用mapper起步依赖-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.4</version>
        </dependency>

        <!--MySQL连接包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--WebMagic核心包-->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.7.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--WebMagic扩展-->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.7.3</version>
        </dependency>

            <!--WebMagic对布隆过滤器的支持-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>16.0</version>
        </dependency>

        <!--工具包-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <!--单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>


        <!--simhash-->
        <dependency>
            <groupId>com.lou</groupId>
            <artifactId>simhasher</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.lucene</groupId>
                    <artifactId>lucene-core</artifactId>
                </exclusion>
            </exclusions>

        </dependency>
    </dependencies>

AccountProcessor:

import com.lol.pojo.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
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.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;

import java.util.ArrayList;
import java.util.List;

@Component
public class AccountProcessor implements PageProcessor {

    //搜索条件:lol,类型账号,价格升序
    private String url = "https://www.jiaoyimao.com/g5654-c1/r4.html";

    @Override
    public void process(Page page) {


        //解析页面
        Html html = page.getHtml();

        //获取数据,封装到对象中
        List<Selectable> list = page.getHtml().css("div.bd ul.specialList li").nodes();
        List<Account> accounts = new ArrayList<>();
        for (Selectable selectable : list) {
            Account account = new Account();
            account.setTitle(selectable.css("span.is-account a","text").toString());
            account.setPrice(selectable.css("span.price","text").toString());
            account.setUrl(selectable.css("span.is-account a").links().toString());
            account.setArea(selectable.css("div.con","text").toString());
            System.out.println(account);
            //把结果保存起来
//            page.putField("account",account);
            accounts.add(account);
            page.putField("accounts",accounts);
        }

        //获取下一页的url
        List<Selectable> nodes = page.getHtml().css("a.page-btn").nodes();
        String bkUrl = null;
        if (nodes.size() > 1){
            //第二页之后
            bkUrl = page.getHtml().css("a.page-btn").nodes().get(1).links().toString();
        }else {
            bkUrl = page.getHtml().css("a.page-btn").links().toString();
        }

        //把url放到任务队列中
        page.addTargetRequest(bkUrl);

    }

    private Site site = Site.me()
            .setCharset("utf-8")//设置编码
            .setTimeOut(10 * 1000)//设置超时时间
            .setRetrySleepTime(3000)//设置重试的间隔时间
            .setRetryTimes(3);//设置重试的次数

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

    @Autowired
    private SpringDataPipeline springDataPipeline;

    //initialDelay当任务启动后,等等多久执行方法
    //fixedDelay每个多久执行方法
//    @Scheduled(initialDelay = 1000, fixedDelay = 1 * 1000)
    @Scheduled(fixedDelay = 500)
    public void process() {
        Spider.create(new AccountProcessor())
                .addUrl(url)
                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(100000)))
                .thread(10)
                .addPipeline(this.springDataPipeline)
                .run();
    }
}

SpringDataPipeline

import com.lol.pojo.Account;
import com.lol.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;

import java.util.List;

@Component
public class SpringDataPipeline implements Pipeline {

    @Autowired
    private AccountService accountService;

    @Override
    public void process(ResultItems resultItems, Task task) {
        //获取封装好的招聘详情对象
        List<Account> accounts = resultItems.get("accounts");

        //判断数据是否不为空
        if (accounts.size() > 0) {
            //如果不为空把数据保存到数据库中
            for (Account account : accounts) {
                //先查找是否有重复标题的记录
                List<Account> byTitle = accountService.findByTitle(account);
                if (byTitle.size() == 0 || byTitle == null){
                    this.accountService.add(account);
                }

            }

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开源的Java开发框架,它简化了Spring应用程序的配置和部署过程。它提供了一种快速开发和部署应用程序的方式,提升了开发效率。 WebMagic是一个开源的Java框架,用于爬取互联网上的数据。它基于WebMagic的核心思想,提供了一种简单易用的方式来爬取网页,并且支持多线程和分布式爬取WebMagic可以快速构建Web爬虫,获取目标网站上的数据。 Mybatis是一个流行的Java持久化框架,它提供了一种简单易用的方式来访问关系型数据库。Mybatis通过将SQL语句与Java代码进行解耦,实现了数据持久化的功能。它支持自定义SQL语句、事务管理、缓存等功能,方便开发者处理数据库操作。 当我们结合使用Spring Boot、WebMagic和Mybatis时,可以实现一个完整的Web爬虫应用程序。 首先,我们可以使用Spring Boot来搭建应用程序的基础框架,包括配置文件、依赖管理、日志等,简化了应用程序的开发和部署过程。 然后,我们可以使用WebMagic来实现爬取网页的功能。通过定义爬取规则和处理器,可以指定要爬取的网页和提取出的数据。WebMagic支持多线程和分布式爬取,可以提高数据爬取的效率和速度。 最后,我们可以使用Mybatis来实现数据持久化的功能。通过定义Mapper接口和XML文件,我们可以将数据库操作与Java代码解耦,实现数据的增删改查。 综上所述,结合Spring Boot、WebMagic和Mybatis,我们可以构建一个功能强大的Web爬虫应用程序。这个应用程序可以快速爬取网页数据,并将数据存储到数据库中,为我们提供方便快捷的数据访问和处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值