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

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

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD