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

【开源项目阅读】Java爬虫抓取豆瓣图书信息

原项目链接

Java爬虫抓取豆瓣图书信息

本地运行

运行过程

另建项目,把四个源代码文件拷贝到自己的包下面
在这里插入图片描述
在代码爆红处按ALT+ENTER自动导入maven依赖
在这里插入图片描述
直接运行Main.main方法,启动项目
在这里插入图片描述

运行结果

在本地磁盘上生成三个xml文件
在这里插入图片描述
在这里插入图片描述
其中的内容即位爬取后到的图书信息,包括:

  • 书名
  • 作者名
  • 出版社名
  • isbn号
  • 图书对应的豆瓣链接
  • 图书封面图片地址

可惜并没有直接爬取到图书的内容,不过可以凭借爬取得到的图书元数据去其他网站获取电子版pdf

项目运行逻辑

  1. 使用apache提供的httpclient工具包,手动创建一个http客户端
  2. 使用该http客户端向豆瓣官网发送GET请求
  3. 获取response相应数据,类型为html页面
  4. 使用正则表达式工具匹配得到的html页面中有关图书信息的项
  5. 利用dom4j库将这些图书信息项转换成xml元素并存储到本地

收获

CloseableHttpClient接口

该接口代表一个http客户端,实现类可以是InternalHttpClient

创建一个默认http客户端

创建一个不使用代理的默认客户端,使用如下代码

CloseableHttpClient httpClient = HttpClients.createDefault();

创建一个使用代理的http客户端

CloseableHttpClient httpClient = HttpClients.custom().setProxy(new HttpHost(ip,port)).build();

上述代码可以拆解为

//新建一个完全默认的HttpClientBuilder
HttpClientBuilder hb = HttpClients.custom();
//为该HttpClientBuilder设置代理,setProxy方法修改当前hb的代理属性后,返回this自身
hb = hb.setProxy(new HttpHost(ip,port));
//调用build方法完成http客户端的构造
CloseableHttpClient httpClient = hb.build();

关于Java程序内设置的代理与操作系统设置的全局代理的关系,在这篇文章中有更详细的说明【Java程序代理与系统代理关系】

多个重复任务使用多线程解决

List<Thread> threadList = new LinkedList<Thread>();
while (...) {
	threadList.add(new AClassExtendsThread(...));
}
for (Thread thread:threadList) {
    thread.start();
}
for (Thread thread:threadList) {
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

使用dom4j写入xml文件

Writer fileWriter;
Element root;//xml根标签,内含要写入的所有信息,这些信息通过其他代码已经存入root中
String fileAddress;
try {
    fileWriter = new FileWriter(fileAddress);
    XMLWriter xmlWriter = new XMLWriter(fileWriter);
    xmlWriter.write(root);
    xmlWriter.close();
    System.out.println("[" + fileAddress + "]写入成功");
} catch (IOException e) {
    e.printStackTrace();
}

正则表达式匹配

String regex;//正则表达式
Pattern xxxRegex = Pattern.compile(regex);
m = xxxRegex.matcher(entityString);
while (m.find()) {
   //执行对应操作       
}

dom4j标签操作

Element为元素类,或标签类

Document newDocument = DocumentHelper.createDocument();
Element rootElement = newDocument.addElement("root");

添加属性代码

bookElement.addAttribute("id","attribute");

添加子标签代码

bookElement.addElement("name").setText(bookName);

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

相关文章:

  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • jmeter常用配置元件介绍总结之定时器
  • 1小时构建Vue3知识体系之vue的生命周期函数
  • SpringBoot(八)使用AES库对字符串进行加密解密
  • Java基础-组件及事件处理(下)
  • scala的练习题
  • 蓝桥杯每日一题------背包问题(一)
  • 【C++】初识模板:函数模板和类模板
  • Linux I/O 重定向简介
  • DBdoctor恭祝大家龙行龘龘,前程朤朤
  • 多线程JUC:等待唤醒机制(生产者消费者模式)
  • 【react】react+es6+antd5.13.2+ts,antd表格的操作如何在父组件写?
  • LabVIEW双光子荧光显微成像系统开发
  • MPLS VPN功能组件(3)
  • itextpdf使用:使用PdfReader添加图片水印
  • 【Unity】重力场中的路径预测方法
  • 排序算法---插入排序
  • 在django中集成markdown文本框
  • Unity类银河恶魔城学习记录5-1.5-2 P62-63 Creating Player Manager and Skill Manager源代码
  • golang 通过 cgo 调用 C++ 库
  • 2024.1.30力扣每日一题——使循环数组所有元素相等的最少秒数
  • 【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?
  • 浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决
  • Node.js JSON Schema Ajv依赖库逐步介绍验证类型和中文错误提示
  • elementui上传文件不允许重名
  • Java中 使用Lambda表达式实现模式匹配和类型检查