链家地产页面抓取实验以及二手房信息统计概览 Bertha 。 2022-08-03 13:58 151阅读 0赞 项目参考:[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; } //批量添加URL public void batchPush(List<String> URLS){ for(String URL : URLS){ if(!stack.contains(URL)){ stack.push(URL); } } } //添加URL public void pushURL(String URL){ if(!stack.contains(URL)){ stack.push(URL); } } //是否有更多URL public boolean hasNext(){ return !(stack.isEmpty()); } //弹出一个URL public 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中。 ![这里写图片描述][20150809141617967] ### EXCEL简单透视 ### 通过简单EXCEL透视图表可以得到一些直观的数据,没有做深入挖掘,尝试了几个参数的组合。 查询条件:朝阳、海淀二手房(房屋售价也有限制,这就不说了)。 #### 房屋修建时间分布 #### ![这里写图片描述][20150809141629163] #### 区域在售房屋数量分布 #### ![这里写图片描述][20150809141647072] #### 区域平米售价 #### ![这里写图片描述][20150809141817922] #### 楼型分布 #### ![这里写图片描述][20150809141716728] #### 区域在售房屋平均面积 #### ![这里写图片描述][20150809141749233] ….. 啥也不说了,搬砖去了,呵呵呵呵呵呵呵。。。。。。。。。。。。 [LianJiaSpider]: https://github.com/WengShengyuan/LianJiaSpider [jsoup cookbook]: http://www.open-open.com/jsoup/ [20150809141617967]: /images/20220731/8cce8ef71feb40a0a9c3195e7bf4c7ce.png [20150809141629163]: /images/20220731/2a925680b39b4be49962d569d7f5fe70.png [20150809141647072]: /images/20220731/7b798b9b492b4119a8804f1f6655000c.png [20150809141817922]: /images/20220731/231889e0088147bba8f806cfc854c5c2.png [20150809141716728]: /images/20220731/41ed51ac62334cfc999bd509fffcd2e5.png [20150809141749233]: /images/20220731/ca7470fa5afd45c8b64d1d2063f2f566.png
相关 Python爬虫新手入门教学(三):爬取链家二手房数据 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 Python爬虫、数据分析、网站开发等案例教程视频免费在线观 港控/mmm°/ 2023年01月11日 03:44/ 0 赞/ 146 阅读
相关 python爬取链家二手房信息,确认过眼神我是买不起的人 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 淡淡的烟草味﹌/ 2022年12月08日 14:19/ 0 赞/ 140 阅读
相关 Python爬虫之链家二手房数据爬取 Python 依赖模块: requests parsel csv 功能要求: ![watermark_type_ZHJvaWRzYW5zZmFs 本是古典 何须时尚/ 2022年09月11日 07:23/ 0 赞/ 328 阅读
相关 Python爬虫-利用xpath解析爬取58二手房详细信息 文章目录 前言 介绍 代码 运行结果截图 前言 简单的Python练习,对页面中的某些部分的文字进行爬取 介绍 ![在这里插入图片 超、凢脫俗/ 2022年08月29日 10:43/ 0 赞/ 238 阅读
相关 链家地产页面抓取实验以及二手房信息统计概览 项目参考:[LianJiaSpider][] 原本该练习项目是想用来搜索购物网站某商品的降价抢购信息的,比如《什么值得买》。 但是那个网站貌似有防爬虫机制,因此转移目标, Bertha 。/ 2022年08月03日 13:58/ 0 赞/ 152 阅读
相关 【多进程并行版本】爬取链家二手房前100页标签,进行统计 前言 python在进程间通信会比较麻烦~ 要注意,这里我们想到的时候多个进程一起维护一个字典。 所以,我加了锁。这里还是存在一个可能的改进方法,就是考察你的锁加 灰太狼/ 2022年05月26日 00:27/ 0 赞/ 91 阅读
相关 二手房各项税费计算公式 北京的房屋类型有很多种,有商品房、公房、一类经适房、二类经适房、两限房,现针对这些类型的房子列一下二手房购置过程中,需要考虑的税费。 一、各类房源简介 1.商品房 ﹏ヽ暗。殇╰゛Y/ 2022年03月22日 13:40/ 0 赞/ 256 阅读
相关 实战项目一、安居客(北京) 二手房抓取房源信息 一、首先明确爬取的数据为安居客(北京)的二手房源的数据信息,主要有房源链接地址,房源价格,房源单价,房源规模,房源大小,房源建造年份,房源地址。 [https://beiji 本是古典 何须时尚/ 2022年03月07日 11:42/ 0 赞/ 219 阅读
相关 爬取链家网所有二手房楼盘信息 代码如下: import requests from lxml import etree import math import time 缺乏、安全感/ 2022年02月04日 17:13/ 0 赞/ 347 阅读
还没有评论,来说两句吧...