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

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

相关文章

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令