链家地产页面抓取实验以及二手房信息统计概览

2023-11-11 06:20

本文主要是介绍链家地产页面抓取实验以及二手房信息统计概览,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目参考:LianJiaSpider

原本该练习项目是想用来搜索购物网站某商品的降价抢购信息的,比如《什么值得买》。
但是那个网站貌似有防爬虫机制,因此转移目标,改搜搜二手房信息,想想应该会有人有这种需求的,呵呵呵呵呵呵呵呵。。。。。

正好链家地产的页面可以顺利抓取,而且该网站的房源信息查询条件是直接拼接在URL中的,拼接规则极其简单。所以就拿这个网站下手了=。=

涉及工具

主要还是用MAVEN构建项目,引入了几个基础包:

  1. apache httpclient - 用于处理HTML请求

  2. jsoup - 用于处理HTML页面文档

  3. mysql-connector-java + c3p0 - 用于连接数据库

项目主要设计

单例模式URL管理

由于在查询某一搜索条件的结果页的时候,往往遇到分页的情况需要分析当前结果页是否有分页,如果有则添加所有分页的URL,留着后期处理,因此要将URL设计成一个公共的资源。

目前该项目爬虫为单一线程,但是为了后期扩展成多线程模式,要让所有爬虫能访问URL列表资源,并且能动态添加URL记录,就应该考虑
到同步的问题。因此,将URL资源设计成单例模式管理。代码如下(核心是stack,同步锁暂未添加):


public class URLPool {private static URLPool Instance;private Stack<String> stack;private URLPool(){stack = new Stack<String>();}public static URLPool getInstance(){if(Instance == null){Instance = new URLPool();}return Instance;}//批量添加URLpublic void batchPush(List<String> URLS){for(String URL : URLS){if(!stack.contains(URL)){stack.push(URL);}}}//添加URLpublic void pushURL(String URL){if(!stack.contains(URL)){stack.push(URL);}}//是否有更多URLpublic boolean hasNext(){return !(stack.isEmpty());}//弹出一个URLpublic String popURL(){if(hasNext()){return stack.pop();} else {return null;}}
}

HttpClient 请求

主要使用HttpClient封装一个GET方法来请求HTML。同时,为后期模拟浏览器方便,预留了RequestHeader修饰方法。代码如下

GET方法

public static final String CHARSET = "UTF-8";public static String httpGet(String pageUrl, HttpHeader header) throws Exception{return getAction(pageUrl, header);}public static String httpGet(String pageUrl) throws Exception{return getAction(pageUrl, null);}private static String getAction(String pageUrl, HttpHeader header) throws Exception{@SuppressWarnings("resource")HttpClient client  = new DefaultHttpClient();HttpGet httpGet = new HttpGet();httpGet.setURI(new URI(pageUrl));String content = "";if(header != null){httpGet = header.attachHeader(httpGet);}BufferedReader in=null;try {HttpResponse response = client.execute(httpGet);      if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {      in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));StringBuffer sb = new StringBuffer("");String line = "";while((line = in.readLine())!=null){sb.append(line).append("\n");}in.close();content = sb.toString();} else {throw new Exception("网络解析错误:" + response.getStatusLine());}} catch (Exception e) {throw e;} finally{if(in != null){in.close();}}return content;}
RequestHeader 修饰

public class HttpHeader {private HashMap<String,String> headerMap ;public HttpHeader (HashMap<String, String> map){this.headerMap = map;}public HttpHeader(){this.headerMap = new HashMap<String, String>();}public void addParam(String key, String value){this.headerMap.put(key, value);}public Map getHeaderMap(){return this.headerMap;}public HttpGet attachHeader(HttpGet httpGet){for(String key : this.headerMap.keySet()){httpGet.setHeader(key, this.headerMap.get(key));}return httpGet;}}

HTML处理(jsoup)

这里主要是将上边GET到的HTML字符串封装成jsop document的格式,然后用jsoup的API对文档进行分析,提取所需的数据。代码不贴了,API请参考:

jsoup cookbook

抓取结果及简单统计

原始数据

由程序抓取的记录存储在MySQL中。

这里写图片描述

EXCEL简单透视

通过简单EXCEL透视图表可以得到一些直观的数据,没有做深入挖掘,尝试了几个参数的组合。

查询条件:朝阳、海淀二手房(房屋售价也有限制,这就不说了)。

房屋修建时间分布

这里写图片描述

区域在售房屋数量分布

这里写图片描述

区域平米售价

这里写图片描述

楼型分布

这里写图片描述

区域在售房屋平均面积

这里写图片描述

…..

啥也不说了,搬砖去了,呵呵呵呵呵呵呵。。。。。。。。。。。。

这篇关于链家地产页面抓取实验以及二手房信息统计概览的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服