使用Jsoup抓取数据

2024-06-24 10:18
文章标签 抓取 数据 使用 jsoup

本文主要是介绍使用Jsoup抓取数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

最近公司的市场部分布了一个问题,到一个网站截取一下医院的数据。刚好我也被安排做。后来,我发现为何不用脚本去抓取呢?
抓取的数据如下:
这里写图片描述

Jsoup的使用实战代码

结构

Created with Raphaël 2.1.0 开始 创建线程池 jsoup读取网页 解析Element 写入sqlite 结束
  • java代码
public class GetDoctorInfo {public GetDoctorInfo() {ExecutorService threadPool = Executors.newFixedThreadPool(5);//43有问题//73有问题for (int i = 1; i <= 100; i++) {String path = "http://so.haodf.com/index/search?type=hospitalfaculty&p=" + i + "&kw=%B8%BE%B2%FA%BF%C6";threadPool.execute(new GetDoctorRun(path));}threadPool.shutdown();}public static void main(String[] arg) {new GetDoctorInfo();}public static synchronized void printInfo(String sql) {System.out.println(sql);}public static String trans(String input) {String value;value = input.replaceAll("<td>", "").replaceAll("</td>", "").replaceAll("&nbsp;", "").replaceAll(" 地址地图:", "");return value;}/*** 获取医生的线程*/public class GetDoctorRun implements Runnable {final String mURL;public GetDoctorRun(String mURL) {this.mURL = mURL;}@Overridepublic void run() {try {Document doc = null;try {
//                    doc = (Document) Jsoup.parse(new URL("http://so.haodf.com/index/search?type=hospitalfaculty&p=99&kw=%B8%BE%B2%FA%BF%C6")
//                            , 1000);doc = (Document) Jsoup.parse(new URL(mURL), 3000);} catch (IOException e) {e.printStackTrace();}//定位到列表Elements elements = doc.getElementsByClass("list");Elements childElements = elements.get(0).getAllElements();Element child = childElements.get(3);//获得所有的超链接的数据Elements aLinks = child.getElementsByTag("a");ArrayList<String> name = new ArrayList<>();ArrayList<String> address = new ArrayList<>();for (int i = 1; i <= aLinks.size(); i++) {Element e = aLinks.get(i - 1);if (e.attr("target").equals("_blank")) {//排除 科室介绍//排除 门诊时间if (!e.text().equals("科室介绍") && !e.text().equals("门诊时间")) {//                            System.out.println("--" + e.text());if (i % 2 == 0) {if (e.text().equals("") || e.text() == null) {address.add("");} else {address.add(e.text());}} else {if (e.text().equals("") || e.text() == null) {name.add("");} else {name.add(e.text());}}}}}//将长连接的内容删除child.select("a").remove();child.select("span").remove();child.select("br").remove();String tran = trans(child.toString());//                System.out.println(tran);String[] phones = tran.substring("     电  话:".length(), tran.length() - 1).split("电  话:");System.out.println();System.out.println();System.out.println();for (int i = 0; i < name.size(); i++) {//                    System.out.println(phones[i]);//                    //INSERT INTO info(hospital_name,address,phone) VALUES ('gg','hhh','ddd');StringBuffer bufferValue = new StringBuffer("INSERT INTO info(hospital_name,address,phone) VALUES (");//医院名bufferValue.append("'").append(name.get(i)).append("'");//医院地址bufferValue.append(",'").append(address.get(i)).append("'");//医院的电话bufferValue.append(",'").append(phones[i].trim()).append("');");printInfo(bufferValue.toString());}if (name.size() != 10) {System.out.println("name==" + mURL);}if (address.size() != 10) {System.out.println("address=" + mURL);}if (phones.length != 10) {System.out.println("phone=" + phones.length + " " + mURL);}} catch (Exception e) {e.printStackTrace();}}}}
  • Terminal写入sqlte

.open hospital.db
sqlite3 -init sql

总结

jsoup的使用很简单,有点像解析xml。不过结果很好的,因为5,6个人的工作就被这个简单的代码实现了。解析技巧有一个尽量清除不必要的标签。如代码:

       child.select("a").remove();child.select("span").remove();child.select("br").remove();
  • 学会用脚本收集数据
  • 注意多谢线程并发的安全,要检验,要不很易出错
  • 对于多线程的问题关键是要确保你的内容不被竞争弄乱,所以提取出来进行代码块是很重要的。

最后补充一下最终的效果如下图

这篇关于使用Jsoup抓取数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089863

相关文章

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1