当前位置: 首页 > article >正文

Jsoup实现实时爬取

文章目录

    • 1.作用
    • 2.使用
      • pom文件引入
      • 示例代码(来自官网)
    • 3.测试代码
    • 4.上线代码
      • 控制层
      • 业务层

1.作用

获取Html文档,然后解析出需要的字段

2.使用

pom文件引入

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.4.0</version>
</dependency>

示例代码(来自官网)

Document doc = Jsoup.connect("https://en.wikipedia.org/").get();
log(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {
    log("%s\n\t%s", 
        headline.attr("title"), headline.absUrl("href"));
}

3.测试代码

/**
 * 实时爬虫获取图片列表
 */
@Test
void getPicture() throws IOException {

    int page = 1;
    //要解析的网页地址
    String url = "https://cn.xxxx.com/images/search?q=小黑子&first="+page;
    //获取html文档
    Document doc = Jsoup.connect(url).get();

    //查找该文档对应class的文档
    Elements element = doc.select(".iuscp.isv");

    List<Picture> pictureList = new ArrayList<>();
    //将该文档下的该类选择器的文档遍历一遍
    for (Element element1 : element) {
        //获取图片路径
        String urlImage = element1.select(".iusc").get(0).attr("m");
        Map<String,Object> urlMap = JSONUtil.toBean(urlImage,Map.class);
        String urlImg = (String)urlMap.get("murl");

        //获取标题
        String title = element1.select(".inflnk").get(0).attr("aria-label");

        //添加到集合
        Picture picture = new Picture();
        picture.setUrlImage(urlImg);
        picture.setTitle(title);
        pictureList.add(picture);
    }

    System.out.println(pictureList);
}

4.上线代码

控制层

  /**
     * 最终放入搜索接口
     * @param pictureDto
     * @return
     */
    @GetMapping("/list/vo")
    public Result getPictureList(@RequestBody PictureDto pictureDto){

        Integer page = pictureDto.getPage();
        Integer pageSize = pictureDto.getPageSize();

        //限制搜索数据量过大
        if(page > 20){
            throw new DataSizeBigException(MessageConstant.DATA_SIZE_BIG_ERROR);
        }

        String searchText = pictureDto.getSearText();
        IPage<Picture> pageBean = pictureService.searchPicture(searchText,page,pageSize);

        return Result.success(pageBean);
    }

业务层

  /**
     * 搜索图片列表
     * @param searchText
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public IPage<Picture> searchPicture(String searchText, Integer page, Integer pageSize) {

        //起始索引
        Integer startIndex = (page - 1) * pageSize;

        String url = String.format("https://cn.bing.com/images/search?q=%s&first=%s",searchText,page);
        Document doc = null;
        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Elements element = doc.select(".iuscp.isv");

        List<Picture> pictureList = new ArrayList<>();
        for (Element element1 : element) {
            String urlImage = element1.select(".iusc").get(0).attr("m");
            Map<String,Object> urlMap = JSONUtil.toBean(urlImage, Map.class);
            String urlImg = (String)urlMap.get("murl");

            String title = element1.select(".inflnk").get(0).attr("aria-label");

            Picture picture = new Picture();
            picture.setUrlImage(urlImg);
            picture.setTitle(title);
            pictureList.add(picture);
            if(pictureList.size()>=pageSize){
              break;
            }
            
        }

        IPage<Picture> pagePic = new Page<>(page, pageSize);
        pagePic.setRecords(pictureList);

        return pagePic;
    }

http://www.kler.cn/a/503304.html

相关文章:

  • Oracle FLOOR函数的用法
  • git 提交命令记录
  • Android Dex VMP 动态加载加密指令流
  • 哈夫曼、算术、LZ编码
  • 55_OpenResty开发入门
  • 【JVM-2.3】深入解析JVisualVM:Java性能监控与调优利器
  • 戴尔电脑开机出现MBR和GPT处理
  • 《盘古大模型——鸿蒙NEXT的智慧引擎》
  • ffmpeg 编译遇到的坑
  • 开源临床试验软件OpenClinica的安装
  • x86-64架构的Linux服务器上运行.NET 6.0应用程序,安装runtimes
  • UE5中制作地形材质
  • 按键精灵ios越狱脚本教程:多选框联动的ui界面
  • JavaScript系列(22)--模块化进阶
  • 16. C语言 字符串详解
  • 代码随想录算法训练营第 7 天(哈希表2)| 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • 如何知道深度学习模型中,每个模块的功能是什么
  • 腾讯云下架印度云服务器节点,印度云服务器租用何去何从
  • 【面试经典】单词规律
  • 【Vue】点击侧边导航栏,右侧main对应显示
  • Keil C51 与 Keil MDK(ARM-stm32?):嵌入式开发的利器
  • 区块链技术在商贸物流中的变革性作用:透明、安全与高效
  • Vue2+OpenLayers实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)
  • Spring MVC简单数据绑定
  • 通过高效的侦察发现关键漏洞接管整个IT基础设施
  • MATLAB中rescale函数用法