【java爬虫】将优惠券数据存入数据库排序查询

本文是在之前两篇文章的基础上进行写作的

(1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客

(1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客 

前两篇文章介绍了如何获取优惠券的基础信息,本文将获取到的基本信息存到数据库中,并且利用数据库的排序获取优惠力度最大的优惠券。这里的优惠力度指的是用全前价格减去券后价格获得的优惠价格绝对值。

相对于之前的文章,本文中我优化了爬虫的爬取策略,把爬虫放到一个新的线程,一页一页不停地获取数据。在爬取的过程中我发现,程序会比较脆弱,很多情况下都会导致程序崩溃,比如某个按钮被遮挡住了,selenium就找不到了,这个时候就会抛异常。像这类问题只能后面慢慢优化了(如果有时间的话)。

首先来看一下爬虫线程运行的情况

我们需要存到数据库中的数据比较多,更新了实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GoodItem {

    // 优惠券标题
    private String title;
    // 图片url
    private String imgUrl;
    // 券前价格
    private Double prePrice;
    // 券后价格
    private Double postPrice;
    // 佣金率
    private Double commissionRate;
    // 佣金
    private Double commission;
    // 口令
    private String recommend;
    // 创建的时间
    private String serializeTime;

    // 优惠价格
    private Double preferentialPrice;
    // 优惠率
    private Double preferentialRate;

    // 计算优惠价格和优惠率
    public void calculatePreferentialPriceAndRate() {
        if(prePrice==null || postPrice==null) {
            preferentialPrice = 0.0;
            preferentialRate = 0.0;
            return;
        }
        preferentialPrice = prePrice - postPrice;
        preferentialRate = preferentialPrice / prePrice;
        // 保留四位小数
        preferentialPrice = Double.parseDouble(String.format("%.4f", preferentialPrice));
        preferentialRate = Double.parseDouble(String.format("%.4f", preferentialRate));
    }

}

从上述代码中可以看出来,优惠价格和优惠率是自己计算的,在获取完券前价格和券后价格后就可以计算着两个值了,最后的结果保留四位有效数字,这里只是用了格式化保留四位小数,并没有进行四舍五入。

爬虫程序与之前的不同就是每当获取一个完整的数据后就存到数据库中,然后一页一页不停地获取数据。

@Slf4j
@Service
public class SeleinumServiceImpl implements SeleinumService {

    private final String DRIVER_PATH = "E:/写作/优惠券项目/驱动/chromedriver.exe";

    @Override
    public void startSelenium() {

        // 实例化BrowserMob代理
        System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
        BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();
        browserMobProxy.start();
        browserMobProxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
        browserMobProxy.setHarCaptureTypes(CaptureType.RESPONSE_CONTENT);
        browserMobProxy.newHar("kk");
        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(browserMobProxy);

        // 实例化Selenium
        ChromeOptions options = new ChromeOptions();
        options.setProxy(seleniumProxy);
        options.setAcceptInsecureCerts(true);
        //options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        WebDriver driver = new ChromeDriver(options);


        // 网络请求回调函数
        browserMobProxy.addRequestFilter(new RequestFilter() {
            @Override
            public HttpResponse filterRequest(HttpRequest httpRequest, HttpMessageContents httpMessageContents, HttpMessageInfo httpMessageInfo) {
                // 打印请求信息
                // log.info("request=>" + httpMessageInfo.getUrl());
                return null;
            }
        });

        // 网络响应回调函数
        browserMobProxy.addResponseFilter(new ResponseFilter() {
            @Override
            public void filterResponse(HttpResponse httpResponse, HttpMessageContents httpMessageContents, HttpMessageInfo httpMessageInfo) {
                // 这里获取打印的信息
                log.info(httpMessageInfo.getUrl());
                if(httpMessageInfo.getUrl().equals("https://pub.alimama.com/openapi/param2/1/gateway.unionpub/union.pub.entry")) {
                    // 格式化输出
                    String str = JSONObject.toJSONString(httpMessageContents.getTextContents(), true);
                    System.out.println(str);
                    // 将数据写到文件中
                    try {
                        FileWriter writer = new FileWriter("output.txt");
                        writer.write(str);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        // 打开网页
        driver.get("https://pub.alimama.com/portal/v2/pages/promo/goods/index.htm?pageNum=2");


    }


    @Override
    public List<GoodItem> getGoodInfo() {
        // 加载chrome驱动
        System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        // 启动浏览器
        WebDriver driver = new ChromeDriver(options);
        // 设置最长等待时间
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        // 实例化一个列表存放数据
        List<GoodItem> rstList = new ArrayList<>();
        // 开始遍历卡片数据
        // 遍历100组数据暂停
        for(int i=0; i<100; ) {
            WebElement element = driver.findElement(By.className("GoodsList__CardList-sc-84so0w-1"));
            List<WebElement> divList = element.findElements(By.className("union-good-card-wrap"));
            log.info("获取" + divList.size() + "个优惠券卡片");
            for(int j=0; j< divList.size(); j++) {
                GoodItem item = new GoodItem();
                // 图片url
                item.setImgUrl(divList.get(j).findElement(By.className("union-good-card-good-img-wrap-mediumn"))
                        .findElement(By.tagName("a")).findElement(By.tagName("img")).getDomAttribute("src"));
                // 优惠券标题
                item.setTitle(divList.get(j).findElement(By.className("union-good-card-title"))
                        .findElement(By.tagName("span")).getText());
                // 券前价格
                item.setPrePrice(getPrice(divList.get(j)
                        .findElement(By.className("union-good-card-coupon-reserve-price-mediumn"))));
                // 券后价格
                item.setPostPrice(getPrice(divList.get(j)
                        .findElement(By.className("union-good-card-coupon-final-price"))));
                List<WebElement> commissionList = divList.get(j).findElements(By.className("union-good-card-commision-info-item"));
                // 佣金率
                item.setCommissionRate(getPrice(commissionList.get(0)));
                // 佣金
                item.setCommission(getPrice(commissionList.get(1)));
                log.info(JSON.toJSONString(item));
                i++;
                if(i == 100) {
                    log.info("100条数据获取完毕");
                    return rstList;
                }
            }
            // 切换到下一页
            driver.findElement(By.className("GoodsList__Pagination-sc-84so0w-2"))
                    .findElement(By.className("mux-pagination-icon-next")).click();
            log.info("进入到下一页");
        }

        return rstList;

    }

    // 获取券前券后价格
    private Double getPrice(WebElement element) {
        StringBuilder sb = new StringBuilder();
        sb.append(element.findElement(By.className("union-number-format-integer")).getText().replaceAll(",", ""));
        sb.append(element.findElement(By.className("union-number-format-pointer")).getText());
        sb.append(element.findElement(By.className("union-number-format-decimal")).getText());
        Double price = Double.parseDouble(sb.toString());
        return price;
    }

}

数据库部分我们简单建一个表存数据,然后再建一些索引方便去重和加速查询

use coupon_db;

/* 文章信息表  */
drop table if exists t_coupon;
create table t_coupon(
    u_id bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '优惠券id',
    title varchar(255) NOT NULL COMMENT '优惠券标题',
    img_url varchar(500) NOT NULL COMMENT '图片的url',
    pre_price double NOT NULL COMMENT '券前价格',
    post_price double NOT NULL COMMENT '券后价格',
    preferential_price double NOT NULL COMMENT '优惠价格',
    preferential_rate double NOT NULL COMMENT '优惠率',
    commission_rate double NOT NULL COMMENT '佣金率',
    commission double NOT NULL COMMENT '佣金',
    recommend varchar(500) NOT NULL COMMENT '淘口令',
    serialize_time varchar(50) NOT NULL COMMENT '创建的时间'
) ENGINE=InnoDB COMMENT '优惠券信息表';
/* 创建标题唯一索引,通过标题判断优惠券的唯一性 */
create unique index title_index on t_coupon (title);
/* 创建普通索引,用于加速查询 */
create index preferential_price_index on t_coupon (preferential_price);
create index serialize_time_index on t_coupon (serialize_time);
create index commission_index on t_coupon (commission);
create index commission_rate_index on t_coupon (commission_rate);

本文就简单写三个mapper接口来存数据和查数据

@Mapper
public interface GoodMapper {
    // 清空表
    public void clearTable();

    // 插入一条数据
    public void insertOneItem(@Param("item") GoodItem item);

    // 查询数据,按照优惠价格降序排序
    public List<GoodItem> selectByOrder(@Param("start") int start,
                                        @Param("num") int num);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.GoodMapper">

    <delete id="clearTable">
        delete from t_coupon where 1=1
    </delete>

    <insert id="insertOneItem" parameterType="GoodItem">
        insert into t_coupon
        (title, img_url, pre_price, post_price,
        commission_rate, commission, recommend, serialize_time,
        preferential_price, preferential_rate) values
        (#{item.title}, #{item.imgUrl}, #{item.prePrice}, #{item.postPrice},
        #{item.commissionRate}, #{item.commission}, #{item.recommend}, #{item.serializeTime},
        #{item.preferentialPrice}, #{item.preferentialRate})
        on duplicate key update title=title
    </insert>

    <select id="selectByOrder" resultType="GoodItem">
        select * from t_coupon
        order by preferential_price DESC
        limit #{start}, #{num}
    </select>

</mapper>

我们将开启爬虫和查询的接口都写在一个Controller里面

@Controller
public class BootController {
    @Autowired
    private SeleniumPlusService seleniumPlusService;
    @Autowired
    private SelectService selectService;

    @RequestMapping("/bootstart")
    @ResponseBody
    public String bootstart() {
        // 创建一个线程去爬取优惠券数据
        new Thread(()->{
            seleniumPlusService.startSpider();
        }).start();
        return "success";
    }

    // 查询数据
    @RequestMapping("/select/{start}/{num}")
    @ResponseBody
    public String selectByOrderDESC(@PathVariable("start") int start,
                                    @PathVariable("num") int num) {
        List<GoodItem> goodItemList = selectService.selectByOrderDESC(start, num);
        return JSON.toJSONString(goodItemList);
    }

}

其中查询的Service非常简单,就是执行mapper中的查询接口然后将数据返回

@Service
public class SelectServiceImpl implements SelectService {
    @Autowired
    private GoodMapper goodMapper;

    @Override
    public List<GoodItem> selectByOrderDESC(int start, int num) {
        return goodMapper.selectByOrder(start, end);
    }
}

查询接口是一个GET请求,请求参数是按照优惠价格降序排序后的数据。

比如下图执行的请求接口是  localhost:8080/select/0/10 ,查询数据库里面优惠价格最高的10条数据

上述的查询对应的sql语句如下。

在SQL语句中 limit 后面的两个参数分别是开始的索引和查询的数据量,比如下面这条SQL语句的意思应该是从第0条数据开始查,一共查出10条数据。

select * from t_coupon
order by preferential_price DESC
limit 0, 10

查询出来的数据如下

[{
	"commission": 2.64,
	"commissionRate": 5.3,
	"imgUrl": "//img.alicdn.com/bao/uploaded/i3/6000000002126/O1CN01Z5K9L61RZktaDO7mX_!!6000000002126-0-sm.jpg",
	"postPrice": 49.9,
	"prePrice": 99.0,
	"preferentialPrice": 49.1,
	"preferentialRate": 0.496,
	"recommend": "立白天然茶籽洗衣液6KG 家庭实惠洗衣除菌除螨 89.00元\n本月上新\n买它!超值!\nh:/89¥ CZ3457 tptfdGVZ6Wj¥\n",
	"serializeTime": "2023-07-16 13:16:28",
	"title": "立白天然茶籽洗衣液6KG 家庭实惠洗衣除菌除螨"
}, {
	"commission": 7.11,
	"commissionRate": 9.0,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN010BdQ3w1eaIJCsydxO_!!6000000003887-0-yinhe.jpg",
	"postPrice": 49.5,
	"prePrice": 89.0,
	"preferentialPrice": 39.5,
	"preferentialRate": 0.4438,
	"recommend": "Joocyee酵色唇釉琥珀唇彩丝绒口红哑光贝壳镜面唇泥太妃糖复古女 79.00元\n历史热推\n速速抢购,手快有,手慢无!\nh:/68¥ CZ0001 30W9dGVaz77¥\n",
	"serializeTime": "2023-07-16 13:16:41",
	"title": "Joocyee酵色唇釉琥珀唇彩丝绒口红哑光贝壳镜面唇泥太妃糖复古女"
}, {
	"commission": 0.67,
	"commissionRate": 1.35,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01oDxvso1iw3dVd7jec_!!6000000004476-0-yinhe.jpg",
	"postPrice": 49.9,
	"prePrice": 84.9,
	"preferentialPrice": 35.0,
	"preferentialRate": 0.4122,
	"recommend": "蒙牛特仑苏纯牛奶250ml*16盒整箱学生早餐奶高端(新旧包装混发) 82.90元\n超十万人正在疯抢\n喜欢的宝宝们千万不要错过哦~赶紧买起来买起来!~\nh:/49¥ CZ3457 kbB6dGeADLs¥\n",
	"serializeTime": "2023-07-16 13:16:01",
	"title": "蒙牛特仑苏纯牛奶250ml*16盒整箱学生早餐奶高端(新旧包装混发)"
}, {
	"commission": 0.9,
	"commissionRate": 1.5,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01hCQXtN1Oc5yax1WHF_!!6000000001725-0-yinhe.jpg",
	"postPrice": 46.57,
	"prePrice": 79.9,
	"preferentialPrice": 33.33,
	"preferentialRate": 0.4171,
	"recommend": "【零感003】杰士邦避孕套正品官方旗舰店安全套超薄男用裸入持久1 59.90元\n赠运费险\n买它就对了~\nh:/77¥ CZ3457 Y5i7dGVZj30¥\n",
	"serializeTime": "2023-07-16 13:16:33",
	"title": "【零感003】杰士邦避孕套正品官方旗舰店安全套超薄男用裸入持久1"
}, {
	"commission": 0.33,
	"commissionRate": 0.3,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01BvRfuK22sf0fmsdtn_!!6000000007176-0-yinhe.jpg",
	"postPrice": 109.0,
	"prePrice": 139.0,
	"preferentialPrice": 30.0,
	"preferentialRate": 0.2158,
	"recommend": "罗马仕20000毫安充电宝双自带线双向快充大容量1万小巧移动电源闪充适用华为苹果iphone小米oppo手机专用户外 109.00元\n超十万人正在疯抢\n快~少量库存!!赶紧冲拼手速!!\nh:/19¥ CZ0001 0GK2dGVayGy¥\n",
	"serializeTime": "2023-07-16 13:16:24",
	"title": "罗马仕20000毫安充电宝双自带线双向快充大容量1万小巧移动电源闪充适用华为苹果iphone小米oppo手机专用户外"
}, {
	"commission": 1.6,
	"commissionRate": 1.8,
	"imgUrl": "//img.alicdn.com/bao/uploaded/i1/2200828292428/O1CN01f5SKRV1To4V1gBrc1_!!2200828292428.jpg",
	"postPrice": 89.0,
	"prePrice": 118.0,
	"preferentialPrice": 29.0,
	"preferentialRate": 0.2458,
	"recommend": "逐本清欢晨蜜自在自然植萃卸妆油敏弱肌脸部舒缓深层清洁卸妆水膏 89.00元\n回头客1万+\n质量逆天,赶紧的,闭眼买都不亏!!\nh:/59¥ CZ0001 JrpUdGVafyH¥\n",
	"serializeTime": "2023-07-16 13:16:06",
	"title": "逐本清欢晨蜜自在自然植萃卸妆油敏弱肌脸部舒缓深层清洁卸妆水膏"
}, {
	"commission": 0.69,
	"commissionRate": 1.35,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01ry5fh31G8llXLIPuR_!!6000000000578-0-yinhe.jpg",
	"postPrice": 50.9,
	"prePrice": 74.4,
	"preferentialPrice": 23.5,
	"preferentialRate": 0.3159,
	"recommend": "蒙牛纯牛奶全脂灭菌乳250ml*24盒/1箱学生营养早餐搭配优质乳蛋白 71.40元\n回头客12万+\n买它就对了~\nh:/97¥ CZ3457 nlVhdGVZUPV¥\n",
	"serializeTime": "2023-07-16 13:16:10",
	"title": "蒙牛纯牛奶全脂灭菌乳250ml*24盒/1箱学生营养早餐搭配优质乳蛋白"
}, {
	"commission": 2.21,
	"commissionRate": 4.5,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01gO1IfQ1ljdhW0a0LT_!!6000000004855-0-yinhe.jpg",
	"postPrice": 49.0,
	"prePrice": 69.0,
	"preferentialPrice": 20.0,
	"preferentialRate": 0.2899,
	"recommend": "蕉下修容口罩EM320 防晒护眼角开车面罩防紫外线立体夏女透气户外 49.00元\n好评过万\n不要犹豫!库存不多抓紧抢!\nh:/59¥ CZ0001 LYJSdGVZeik¥\n",
	"serializeTime": "2023-07-16 13:16:37",
	"title": "蕉下修容口罩EM320 防晒护眼角开车面罩防紫外线立体夏女透气户外"
}, {
	"commission": 3.05,
	"commissionRate": 10.5,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01siAhJN1Hwyo2vfWAr_!!6000000000823-0-yinhe.jpg",
	"postPrice": 29.0,
	"prePrice": 49.0,
	"preferentialPrice": 20.0,
	"preferentialRate": 0.4082,
	"recommend": "猫人抗菌裆男士内裤男冰丝无痕四角裤运动纯棉裆平角大码裤青少年 29.00元\n回头客2万+\n质量逆天,赶紧的,闭眼买都不亏!!\nh:/17¥ CZ0001 ZxlhdGVaNAb¥\n",
	"serializeTime": "2023-07-16 13:16:51",
	"title": "猫人抗菌裆男士内裤男冰丝无痕四角裤运动纯棉裆平角大码裤青少年"
}, {
	"commission": 1.79,
	"commissionRate": 6.0,
	"imgUrl": "//img.alicdn.com/bao/uploaded/O1CN01PyEz521NEuMNqT3Av_!!6000000001539-0-yinhe.jpg",
	"postPrice": 29.9,
	"prePrice": 49.9,
	"preferentialPrice": 20.0,
	"preferentialRate": 0.4008,
	"recommend": "【百亿补贴】进口茱蒂丝巧克力夹心饼干纯可可脂儿童健康休闲零食 29.90元\n近7天浏览过万\n这价位能做到这样真的无可挑剔!\nh:/98¥ CZ0001 eJUpdGVZvWR¥\n",
	"serializeTime": "2023-07-16 13:17:51",
	"title": "【百亿补贴】进口茱蒂丝巧克力夹心饼干纯可可脂儿童健康休闲零食"
}]

可以看到有一些优惠券的优惠力度还是挺大的,可以省几十元,就是不知道这个券前价格准不准哈哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

和chatgpt学架构02-环境搭建

目录 1 安装vs code2 vs code功能介绍3 安装nodejs4 安装vue5 在vs code打开工程总结 我们在上一篇 技术选型 里咨询了chatgpt前后端的框架选择和数据库的选择。有了框架之后就需要选择合适的开发工具了&#xff0c;继续咨询一下chatgpt 我现在选型&#xff0c;前端使用vue&am…

Mac 谷歌浏览器选中查看悬浮出现的元素样式

Mac 谷歌浏览选中查看悬浮出现的元素样式 1. Mac 暂停脚本执行快捷键 command \或F8 2.以斗鱼主站下载悬浮面板为例 3. 操作步骤 &#xff08;1&#xff09;打开控制台&#xff0c;选中源代码 &#xff08;2&#xff09;鼠标选中下载&#xff0c;让面板悬浮出来 &#xf…

【GitOps系列】K8s极简实战

文章目录 示例应用介绍部署应用到k8s 如何使用命名空间隔离团队及应用环境&#xff1f;如何为业务选择最适合的工作负载类型&#xff1f;如何解决服务发现问题&#xff1f;如何迁移应用配置&#xff1f;如何将集群的业务服务暴露外网访问&#xff1f;如何保障业务资源需求和自动…

Selenium自动化之弹窗处理

1.前言 我们在使用Selenium做Web自动化测试时&#xff0c;页面经常出现弹窗&#xff0c;如果不处理后续的测试脚本就无法正常运行&#xff0c;今天我们就带大家一起来学习如何处理Web页面上的弹窗。 2.Web页面弹窗的分类 弹窗通常有3种&#xff1a;Alert类型弹框、Confirm类…

【文生图系列】stable diffusion webui 汉化(双语)教程

文章目录 安装双语插件下载json源文件设置双语 这篇博文记录于我成功安装双语插件之后&#xff0c;所以以下的示例页面均是双语。汉化教程分为三步&#xff0c;安装插件&#xff0c;JSON源文件下载和最后一步的双语设置。 安装双语插件 在扩展&#xff08;extensions&#xf…

【已解决】idea使用debug启动一直卡着不动

debug启动时一直卡着不动出现下图提示&#xff0c;但是正常启动又可以启动 翻译结果是&#xff1a;方法断点可能会大大降低调试速度。很明显&#xff0c;有断点的位置没加对或者误加断点了&#xff0c;以下是解决方法。 打开 .idea文件夹&#xff0c;找到workspace.xml文件 找…

引入Vue的方式

1.cdn引入 <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

配置需求分类中的科目分配

其中科目分配的内容都为灰色无法修改 结果是在科目分配里面单独维护的&#xff1a; 路径&#xff1a;销售分销-基本功能-科目分配/成本-维护成本科目分配的需求类别

【Ceph集群应用】Ceph对象存储系统之RGW接口详解

Ceph对象存储系统之RGW接口详解 1.创建Ceph对象存储系统RGW接口2. 开启httphttps,更改监听端口3. 更改监听端口4.S3接口访问测试5.实验中遇到的故障案例 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph对象存储系统RGW接口 &#xff08;1&#xff09;对象存储概念 对象存…

广州市番禺区委领导一行莅临和鲸科技考察交流

7月18日下午&#xff0c;广州市番禺区区委常委、组织部部长、人才工作局局长唐力明&#xff0c;组织部副部长、两新工委书记罗翌洁及组织部其他相关领导一行莅临和鲸科技开展实地考察与调研&#xff0c;国投科创广州基地负责人、海创人才南方创业服务中心常务副秘书长徐斌&…

详解C#开发Android应用程序的流程

Android系统一下子铺天盖地而来&#xff0c;让人目不暇接。兴奋的同时也让部分开发人员犯难了&#xff01;要知道从熟知的Wince、Mobile开发语言C#跨越到RFID-Android的Java。可不是一朝一夕就能完成的。就好比你的乾坤大挪移已经第七层了&#xff0c;却忽然要你从易筋经从头练…

Beyond Compare 代码比较工具

一、下载 官网下载地址&#xff1a; https://www.scootersoftware.com/download.php 选择 Windows 系统&#xff0c;简体中文版本&#xff0c;点击下载。 下载完成 二、安装 步骤1&#xff1a;双击安装包 步骤2&#xff1a;进入安装向导&#xff0c;点击下一步 步骤3&a…

微信小程序事件点击跳转页面的五种方法

第一种:标签 这是最常见的一种跳转方式,相当于html里的a标签 <navigator url"/pages/main/main"></navigator>第二种:wx.navigateTo({})方法 1.前端wxml <button bindtap"getCeshi" type"primary"> 测试按钮 </button>…

php连接上mysql数据库该的配置方法

用mysql官方的管理工具workbench&#xff1a; 打开导出界面后&#xff0c;下一步&#xff0c;选择csv格式&#xff0c;导出后excel就能打开了 如果你需要在程序代码中导出&#xff0c;需要找到对应代码的excel处理库。 如php 的 phpExcel( 最新版已更名为 phpoffice/phpspread…

思维决定发展,测试人也不例外

最近特别懒&#xff0c;不想码字&#xff0c;原本写作就很差&#xff0c;更是退化严重。社招和校招面试过很多人&#xff0c;从十年前自己还很弱的时候学着面试&#xff0c;到数百次面试积累之后&#xff0c;面对候选人的时候&#xff0c;我的内心依然有些许紧张&#xff0c;非…

域内信息收集

将网络中多台计算机逻辑上组织到一起进行集中管理&#xff0c;这种区别于工作组的逻辑环境叫 做域。域是由域控制器(Domain Controller)和成员计算机组成&#xff0c;域控制器就是安装了活动 目录(Active Directory)的计算机。活动目录提供了存储网络上对象信息并使用网络使用该…

132、仿真-基于51单片机主从串口通信家用防盗报警器设计(程序+Proteus仿真+流程图等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、设计功能 二、Proteus仿真图​编辑 三、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&#xff1…

C++模拟实现位图和布隆过滤器(哈希)

目录 前言引入&#xff1a; 一、位图 1.1 位图概念 1.2 位图的实现 1.3 位图的应用 二、布隆过滤器 2.1 哈希的弊端 2.2 布隆过滤器概念 2.3 布隆过滤器的插入 2.4 布隆过滤器的查找 2.5 布隆过滤器的删除 2.6 布隆过滤器的模拟实现 2.7 布隆过滤器优缺点 三、…

那些漏洞挖掘高手都是怎么挖漏洞的?

前言 说到安全就不能不说漏洞&#xff0c;而说到漏洞就不可避免地会说到三座大山&#xff1a; 漏洞分析 漏洞利用 漏洞挖掘 从个人的感觉上来看&#xff0c;这三者尽管通常水乳交融、相互依赖&#xff0c;但难度是不尽相同的。本文就这三者分别谈谈自己的经验和想法。 漏洞分析…

Spring、SpringBoot、SpringCloud、SpringCloud Alibaba、Elasticsearch版本对应,附下载地址

1、GitHub Alibaba 发布SpringCloud Alibaba和SpringCloud 、SpringBoot版本 Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot2022.0.0.0-RC2Spring Cloud 2022.0.03.02022.0.0.0-RC1Spring Cloud 2022.0.03.0.02021.0.5.0*Spring Cloud 2021.0.52.6.132021.0.4…