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

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

相关文章

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

禁止HTML页面滚动的操作方法

《禁止HTML页面滚动的操作方法》:本文主要介绍了三种禁止HTML页面滚动的方法:通过CSS的overflow属性、使用JavaScript的滚动事件监听器以及使用CSS的position:fixed属性,每种方法都有其适用场景和优缺点,详细内容请阅读本文,希望能对你有所帮助... 在前端开发中,禁止htm

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如