springboot+webmagic+mysql

此工程springboot整合webmagic爬虫框架,用mybatis将爬取的数据存入mysql

pom文件
webmagic依赖
<!--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>
mybatis逆向工程依赖
<!-- mybatis core -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <!--未经测试  mybatis-generator应写为mybatis-generator-core -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
        </dependency>
<!-------------------------------------------------------------------------->
<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <!--指定资源文件的路径-->
                <configuration>
                    <configurationFile>src\main\resources\generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <!--此插件需要依赖的jar包资源-->
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.17</version>
                    </dependency>
                </dependencies>
            </plugin>
完整pom文件
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <!--mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!-- mybatis core -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <!--未经测试  mybatis-generator应写为mybatis-generator-core -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <!--指定资源文件的路径-->
                <configuration>
                    <configurationFile>src\main\resources\generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <!--此插件需要依赖的jar包资源-->
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.17</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
application.properties
server.port=10000
spring.datasource.tomcat.driver-class-name=com.mysql.cj.jdbc.Driver

#mybatis
spring.datasource.url=jdbc:mysql://IP:3306/web_magic?useUnicode=true&characterEncoding=UTF-8&transformedBitIsBoolean=true&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=password
#spring.datasource.tomcat.default-auto-commit=true
mybatis.type-aliases-package=com.jatham.pojo
mybatis.mapper-locations=classpath:mapper/*.xml


# 数据库连接池的最小维持连接数
spring.datasource.dbcp2.min-idle=5

# 数据库连接池的最大维持连接数
spring.datasource.dbcp2.max-idle=5

# 数据库连接池的初始化连接数
spring.datasource.dbcp2.initial-size=5

# 数据库连接池等待连接获取最大的超时时间
spring.datasource.dbcp2.max-wait-millis=5000
mybatis逆向工程配置文件 generatorConfig.xml

修改JDBC参数,数据库的表名,mapper地址尽量不要修改,会出现sqlsession无法注入的问题

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://IP:3306/web_magic"
                        userId="root"
                        password="password">
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.jatham.pojo"
                            targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.jatham.mapper"
                             targetProject="src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!-- 指定数据库表 -->
        <table tableName="auth_name" schema="" enableCountByExample="false"
               enableDeleteByExample="false" enableUpdateByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false">
        </table>


        <!-- 有些表的字段需要指定java类型
         <table schema="" tableName="">
            <columnOverride column="" javaType="" />
        </table> -->
    </context>
</generatorConfiguration>
mybatis流程
逆向工会创建XXXmapper.xml,XXXmapper.class,XXX实体类.class

编写service,controller测试

@Service
public class AuthNameService {
    @Autowired
    private AuthNameMapper authNameMapper;

    public AuthName selectByPrimaryKey(Integer id){
        return authNameMapper.selectByPrimaryKey(id);
    }
    public int insert(AuthName record){
        return authNameMapper.insert(record);
    }
    public int insertSelective(AuthName record){
        return authNameMapper.insertSelective(record);
    }
}
@RestController
public class AuthNameController {

    @Autowired
    private AuthNameService authNameService;

    @GetMapping("/getid")
    @ResponseBody
    public AuthName getById(@RequestParam(value = "id")int id){
        return authNameService.selectByPrimaryKey(id);
    }

    @PostMapping("/insertData")
    public int insertData(@RequestParam(value = "id")int id,
                             @RequestParam(value = "name")String name)
    {
        return  authNameService.insert(new AuthName(id,name));

    }
    @PostMapping("/insertSelectData")
    public int insertSelectiveData(@RequestParam(value = "id")int id,
                          @RequestParam(value = "name")String name)
    {
        return  authNameService.insertSelective(new AuthName(id,name));

    }
}

WebMagic代码

process抓取页面
抓取auth的id和name,并存入List集合中,编写getAuthList()方法

public class MyProcessor implements PageProcessor {

    // 抓取网站的相关配置,包括编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
    public static int count = 0;
    List<AuthName> list = new ArrayList<>();

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

    @Override
    public void process(Page page) {
        AuthName auth = new AuthName();
        //判断链接是否符合http://www.cnblogs.com/任意个数字字母-/p/7个数字.html格式
        // if(!page.getUrl().regex("http://www.cnblogs.com/[a-z 0-9 -]+/p/[0-9]{7}.html").match()){
        //加入满足条件的链接
        page.addTargetRequests(
                page.getHtml().xpath("//*[@id=\"post_list\"]/div/div[@class='post_item_body']/h3/a/@href").all());
        //获取页面需要的内容
//        page.putField("test",page.getHtml().xpath("//div[@class=\"para\"]/b/text()"));
        page.putField("authname", page.getHtml().xpath("//*[@id=\"Header1_HeaderTitle\"]/text()"));
        auth.setId(count);
        auth.setName(page.getHtml().xpath("//*[@id=\"Header1_HeaderTitle\"]/text()").get());
        list.add(auth);
        System.out.println("抓取的内容:" +
                        page.getHtml().css("#Header1_HeaderTitle", "text").get() +
                        page.getHtml().xpath("//*[@id=\"mainContent\"]/div/a/@name").get() +
                        page.getHtml().xpath("//*[@id=\"home\"]/div[@id=\"footer\"]/text()").get()
//                    page.getHtml().xpath("//*[@id=\"cnblogs_post_body\"]/p/strong/text()").get()
//                    page.getHtml().xpath("//div[@class=\"para\"]/b/text()").get()
        );
        count++;
    }

    public List<AuthName> getAuthList() {
        return this.list;
    }
}

WebMagic启动代码

spiderStart为启动方法,insertData调用mybatis存入mysql

@Component
public class WebMagicAuth {
    MyProcessor myProcessor = new MyProcessor();

    @Autowired
    AuthNameService authNameService;

    public static  WebMagicAuth webMagicAuth;
    @PostConstruct
    public void init() {
        webMagicAuth = this;
        webMagicAuth.authNameService = this.authNameService;
    }


    public void spiderStart() {
        long startTime, endTime;
        //MyProcessor myProcessor =new MyProcessor();
        System.out.println("开始爬取...");
        startTime = System.currentTimeMillis();
        Spider.create(myProcessor).addUrl("https://www.cnblogs.com/")
                .addPipeline(new ConsolePipeline())
                .thread(1)
                .run();
        endTime = System.currentTimeMillis();
        System.out.println("爬取结束,耗时约" + ((endTime - startTime) / 1000) + "秒,抓取了"+MyProcessor.count+"条记录");
        System.out.println("asd"+myProcessor.getAuthList().get(2).getName());

    }
    public void insertData()
    {
        spiderStart();
        List<AuthName> authNames = myProcessor.getAuthList();
        for (AuthName authName:
        myProcessor.getAuthList()) {
            System.out.println(authName.toString());
            if(authName.getId() == null){

            }else {
                webMagicAuth.authNameService.insertSelective(authName);
            }
        }
    }
}
遇见错误

mybatis There is no getter for property named ‘name’ in ‘class com.jatham.pojo.AuthName’
这行报错只需要检查XXmapper.xml文件,遇到保留字段,加个反引号,esc下面的
在这里插入图片描述
在这里插入图片描述
意为无法自动装载service
添加代码

@Autowired
    AuthNameService authNameService;

    public static  WebMagicAuth webMagicAuth;
    @PostConstruct
    public void init() {
        webMagicAuth = this;
        webMagicAuth.authNameService = this.authNameService;
    }
最后主方法调用
@SpringBootApplication
@MapperScan("com.jatham.mapper")
public class BootWebmagicApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootWebmagicApplication.class, args);
        new WebMagicAuth().insertData();
    }
}
最终效果

mybatis逆向工程再生成实体类时会会出现this.name = name == null ? null : name.trim();
这是去null,但是我们再抓取的时候会出现null,然后报错,所以把它舍去,改为this.name = name

在这里插入图片描述在这里插入图片描述在这里插入图片描述

附录

docker容器化部署
1.maven封装jar包
2.编写dockerfile
3.docker build -t image-name .
4.docker run
参考链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
回答: 从提供的引用内容来看,这是关于使用Spring Boot、MySQL和Redis的问题。Spring Boot是一个用于快速构建基于Spring框架的应用程序的开发框架。MySQL是一个流行的关系型数据库管理系统,而Redis是一个开源的内存数据结构存储系统。 根据引用\[1\]中的内容,启动Redis服务的步骤如下: 1. 进入Redis安装目录的bin文件夹。 2. 使用命令"./redis-server /usr/local/redis/etc/redis.conf"启动Redis服务。 3. 使用命令"./redis-cli"进入Redis命令行界面。 4. 使用命令"auth 123456"进行密码登录。 引用\[2\]中提供了一个示例的配置文件,其中包含了Redis的主机、端口、密码和数据库等信息。 引用\[3\]中展示了一个UserController类的示例代码,其中包含了初始化Redis数据和通过登录名获取用户信息的方法。 综上所述,这是一个关于使用Spring Boot、MySQL和Redis的项目,其中包含了Redis的启动、配置和使用示例。 #### 引用[.reference_title] - *1* [SpringBoot整合redis+mysql](https://blog.csdn.net/qq_44715376/article/details/128040246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SpringBoot实践 - SpringBoot+MySql+Redis](https://blog.csdn.net/weixin_30670151/article/details/98784370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值