数据挖掘(六):用XPath爬取链家网房价数据

标签: 数据挖掘 xpath 数据 | 发表时间:2017-07-20 11:28 | 作者:czl389
分享到:
出处:http://blog.csdn.net

准备工作

编写爬虫前的准备工作,我们需要导入用到的库,这里主要使用的是requests和lxml两个。还有一个Time库,负责设置每次抓取的休息时间。

  import requests
import requests
import time
from lxml import etree

抓取列表页

开始抓取前当然应该了解一下目标网站URL结构咯。

链家网的二手房列表页面共有100个,URL结构为
https://nj.lianjia.com/ershoufang/pg2/
其中

  • nj表示城市
  • /ershoufang/是频道名称
  • pg2是页面码。

我们要抓取的是南京的二手房频道,所以前面的部分不会变,属于固定部分,后面的页面码需要在1-100间变化,属于可变部分。将URL分为两部分,前面的固定部分赋值给url,后面的可变部分使用for循环遍历页面。

  #设置列表页URL的固定部分
url='http://nj.lianjia.com/ershoufang/'
#设置页面页的可变部分
page=('pg')
这里提一个小小的醒,我们最好在http请求中设置一个头部信息,否则很容易被封ip。头部信息网上有很多现成的,也可以使用httpwatch等工具来查看。
  #设置请求头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding':'gzip',
'Connection':'close',
'Referer':'http://www.baidu.com/link?url=_andhfsjjjKRgEWkj7i9cFmYYGsisrnm2A-TN3XZDQXxvGsM9k9ZZSnikW2Yds4s&wd=&eqid=c3435a7d00146bd600000003582bfd1f'
}
以抓取前10个页面为例,我们使用for循环生成1-10的数字,转化格式后与前面的URL固定部分拼成要抓取的URL。这里我们设置每两个页面间隔0.5秒。抓取到的页面保存在html中。
  #循环抓取列表页信息
for i in range(1,11):
    if i == 1:
        i=str(i)
        a=(url+page+i+'/')
        r=requests.get(url=a,headers=headers)
        html=r.content
    else:
        i=str(i)
        a=(url+page+i+'/')
        r=requests.get(url=a,headers=headers)
        html2=r.content
        html = html + html2
    #每次间隔0.5秒
    time.sleep(0.5)

页面解析

页面抓取的工作算是完成了,内容在html中,下一步就要进行页面解析了。我们使用lxml库的xpath方法对页面进行解析。

  • 注意指定解析器的编码格式
  encoding=requests.get(url,headers=headers).encoding
lj=etree.HTML(html,parser=etree.HTMLParser(encoding=encoding))

完成页面解析后就可以对页面中的关键信息进行提取了。下面我们分别对房源的总价,房源信息和关注度三部分进行提取。
把页面div标签中class=priceInfo的部分提取出来,并使用for循环将其中每个房源的总价数据存在tp中。

相关html源码如下:

    <div class="priceInfo"><div class="totalPrice"><span>360</span>万</div><div class="unitPrice" data-hid="103101449315" data-rid="1411044934948" data-price="39353"><span>单价39353元/平米</span></div></div>

可以看出总价数据存放在div子节点span的string元素里,用下面的xpath表达式把所有totalPrice解析出来

  #提取房源总价
price=lj.xpath('//div[@class="priceInfo"]')

tp=[]
for a in price:
    totalPrice=a.xpath('.//span/text()')[0]
    tp.append(totalPrice)
抽取打印前10条房源总价信息:
  for p in tp[:10]:
    print p
  480
360
190
335
182
210
466
86
308
163

提取房源信息和关注度的方法与提取房源价格的方法类似,下面是具体的代码,房源信息存储在hi中,关注度存储在fi中。

与房屋信息相关html源码如下:

   <div class="houseInfo"><span class="houseIcon"></span><a href="https://nj.lianjia.com/xiaoqu/1411044934948/" target="_blank" data-log_index="2" data-el="region">银城东苑紫荆苑 </a> | 2室2厅 | 91.48平米 | 南 | 精装</div>

用如下xpath语句将其解析出来

  #提取房源信息
houseInfo=lj.xpath('//div[@class="houseInfo"]')

hi=[]
for b in houseInfo:
    house=b.xpath('.//text()')[0]+b.xpath('.//text()')[1]
    hi.append(house)
抽取打印前10条房屋信息:
  for i in hi[:10]:
    print i
  龙凤花园隽凤园  | 4室2厅 | 112.36平米 | 南 北 | 简装 | 无电梯
银城东苑紫荆苑  | 2室2厅 | 91.48平米 | 南 | 精装
锁金三村  | 2室1厅 | 61.59平米 | 南 北 | 其他 | 无电梯
文思苑  | 2室2厅 | 95.79平米 | 南 北 | 其他 | 有电梯
蓝岸尚城  | 2室2厅 | 49.01平米 | 南 | 精装
百家湖国际花园  | 2室1厅 | 78.12平米 | 南 | 其他 | 有电梯
万科光明城市西苑  | 2室2厅 | 96.11平米 | 南 北 | 精装
万达紫金明珠  | 1室1厅 | 38.64平米 | 北 | 简装 | 有电梯
文化名园上筑园  | 3室2厅 | 123.22平米 | 南 | 简装 | 有电梯
金龙花园  | 2室1厅 | 61.73平米 | 南 北 | 简装 | 无电梯

类似的,再提取关注度信息:

  #提取房源关注度
followInfo=lj.xpath('//div[@class="followInfo"]')

fi=[]
for c in followInfo:
    follow=c.xpath('./text()')[0]
    fi.append(follow)
抽取打印前10条房屋信息:
  for i in fi[:10]:
    print fi[0]
  158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布
158人关注 / 共59次带看 / 6个月以前发布

清洗数据并整理到数据表中

我们将之前爬取到的信息进行汇总,并导入pandas之中生成数据表。便于后面的分析。

  #导入pandas库
import pandas as pd
#创建数据表
house=pd.DataFrame({'totalprice':tp,'houseinfo':hi,'followinfo':fi})
#查看数据表的内容
house.head()
followinfo houseinfo totalprice
0 158人关注 / 共59次带看 / 6个月以前发布 龙凤花园隽凤园 | 4室2厅 | 112.36平米 | 南 北 | 简装 | 无电梯 480
1 29人关注 / 共22次带看 / 22天以前发布 银城东苑紫荆苑 | 2室2厅 | 91.48平米 | 南 | 精装 360
2 114人关注 / 共132次带看 / 4个月以前发布 锁金三村 | 2室1厅 | 61.59平米 | 南 北 | 其他 | 无电梯 190
3 11人关注 / 共32次带看 / 18天以前发布 文思苑 | 2室2厅 | 95.79平米 | 南 北 | 其他 | 有电梯 335
4 156人关注 / 共106次带看 / 2个月以前发布 蓝岸尚城 | 2室2厅 | 49.01平米 | 南 | 精装 182

很尴尬的是,大家看得到,很多信息是糊在一块的,不能直接使用,所以咱们再做一些数据提取和清洗的工作。如房源信息,在表中每个房源的小区名称,户型,面积,朝向等信息都在一个字段中,无法直接使用。需要先进行分列操作。这里的规则比较明显,每个信息间都是以竖线分割的,因此我们只需要以竖线进行分列即可。

  #对房源信息进行分列
houseinfo_split = pd.DataFrame((x.split('|') for x in house.houseinfo),index=house.index,columns=['xiaoqu','huxing','mianji','chaoxiang','zhuangxiu','dianti'])
现在再来看看我们整理好的数据
  #查看分列结果
houseinfo_split.head()
xiaoqu huxing mianji chaoxiang zhuangxiu dianti
0 龙凤花园隽凤园 4室2厅 112.36平米 南 北 简装 无电梯
1 银城东苑紫荆苑 2室2厅 91.48平米 精装 None
2 锁金三村 2室1厅 61.59平米 南 北 其他 无电梯
3 文思苑 2室2厅 95.79平米 南 北 其他 有电梯
4 蓝岸尚城 2室2厅 49.01平米 精装 None

把拆分后的数据拼接回原始数据中

  #将分列结果拼接回原数据表
house=pd.merge(house,houseinfo_split,right_index=True, left_index=True)
house.head()
followinfo houseinfo totalprice xiaoqu huxing mianji chaoxiang zhuangxiu dianti
0 158人关注 / 共59次带看 / 6个月以前发布 龙凤花园隽凤园 | 4室2厅 | 112.36平米 | 南 北 | 简装 | 无电梯 480 龙凤花园隽凤园 4室2厅 112.36平米 南 北 简装 无电梯
1 29人关注 / 共22次带看 / 22天以前发布 银城东苑紫荆苑 | 2室2厅 | 91.48平米 | 南 | 精装 360 银城东苑紫荆苑 2室2厅 91.48平米 精装 None
2 114人关注 / 共132次带看 / 4个月以前发布 锁金三村 | 2室1厅 | 61.59平米 | 南 北 | 其他 | 无电梯 190 锁金三村 2室1厅 61.59平米 南 北 其他 无电梯
3 11人关注 / 共32次带看 / 18天以前发布 文思苑 | 2室2厅 | 95.79平米 | 南 北 | 其他 | 有电梯 335 文思苑 2室2厅 95.79平米 南 北 其他 有电梯
4 156人关注 / 共106次带看 / 2个月以前发布 蓝岸尚城 | 2室2厅 | 49.01平米 | 南 | 精装 182 蓝岸尚城 2室2厅 49.01平米 精装 None

使用相同的方法对房源关注度字段进行分列和拼接操作。这里的分列规则是斜杠。

  #对房源关注度进行分列
followinfo_split = pd.DataFrame((x.split('/') for x in house.followinfo),index=house.index,columns=['guanzhu','daikan','fabu'])
#将分列后的关注度信息拼接回原数据表
house=pd.merge(house,followinfo_split,right_index=True, left_index=True)
house.head()
followinfo houseinfo totalprice xiaoqu huxing mianji chaoxiang zhuangxiu dianti guanzhu daikan fabu
0 158人关注 / 共59次带看 / 6个月以前发布 龙凤花园隽凤园 | 4室2厅 | 112.36平米 | 南 北 | 简装 | 无电梯 480 龙凤花园隽凤园 4室2厅 112.36平米 南 北 简装 无电梯 158人关注 共59次带看 6个月以前发布
1 29人关注 / 共22次带看 / 22天以前发布 银城东苑紫荆苑 | 2室2厅 | 91.48平米 | 南 | 精装 360 银城东苑紫荆苑 2室2厅 91.48平米 精装 None 29人关注 共22次带看 22天以前发布
2 114人关注 / 共132次带看 / 4个月以前发布 锁金三村 | 2室1厅 | 61.59平米 | 南 北 | 其他 | 无电梯 190 锁金三村 2室1厅 61.59平米 南 北 其他 无电梯 114人关注 共132次带看 4个月以前发布
3 11人关注 / 共32次带看 / 18天以前发布 文思苑 | 2室2厅 | 95.79平米 | 南 北 | 其他 | 有电梯 335 文思苑 2室2厅 95.79平米 南 北 其他 有电梯 11人关注 共32次带看 18天以前发布
4 156人关注 / 共106次带看 / 2个月以前发布 蓝岸尚城 | 2室2厅 | 49.01平米 | 南 | 精装 182 蓝岸尚城 2室2厅 49.01平米 精装 None 156人关注 共106次带看 2个月以前发布

然后再删除原先的列

  house=house.drop(['houseinfo','followinfo'],axis=1)
print "共采集"+str(len(house))+"条房源信息"
house.head()
共采集300条房源信息
totalprice xiaoqu huxing mianji chaoxiang zhuangxiu dianti guanzhu daikan fabu
0 480 龙凤花园隽凤园 4室2厅 112.36平米 南 北 简装 无电梯 158人关注 共59次带看 6个月以前发布
1 360 银城东苑紫荆苑 2室2厅 91.48平米 精装 None 29人关注 共22次带看 22天以前发布
2 190 锁金三村 2室1厅 61.59平米 南 北 其他 无电梯 114人关注 共132次带看 4个月以前发布
3 335 文思苑 2室2厅 95.79平米 南 北 其他 有电梯 11人关注 共32次带看 18天以前发布
4 182 蓝岸尚城 2室2厅 49.01平米 精装 None 156人关注 共106次带看 2个月以前发布

好了,这就是咱们对链家网的部分数据爬取过程了。
跃跃欲试的宝宝们何不自己动手,再解析一些内容试试。

作者:czl389 发表于2017/7/20 15:58:36 原文链接
阅读:54 评论:0 查看评论

相关 [数据挖掘 xpath 数据] 推荐:

数据挖掘(六):用XPath爬取链家网房价数据

- - CSDN博客推荐文章
编写爬虫前的准备工作,我们需要导入用到的库,这里主要使用的是requests和lxml两个. 还有一个Time库,负责设置每次抓取的休息时间. 开始抓取前当然应该了解一下目标网站URL结构咯. 链家网的二手房列表页面共有100个,URL结构为. /ershoufang/是频道名称. 我们要抓取的是南京的二手房频道,所以前面的部分不会变,属于固定部分,后面的页面码需要在1-100间变化,属于可变部分.

关于数据挖掘

- - 牛国柱
以下内容来自网络,关于数据挖掘的一些最基本的知识. 数据挖掘是对一系列数据进行分析和挖掘的方法的统称,在精准营销领域,最常用的数据挖掘方法主要包括以下三类:分类、聚类、关联. 分类(Classify)属于预测性模型. 分类模型的构建需要“训练样本”,训练样本中的每一个个体的类别必须是明确的. 分类模型的特征变量一般称为“自变量”,又叫“预测变量”,类别变量称为“目标变量”.

数据挖掘是神马?

- - 互联网分析
1、数据挖掘需要‘神马样’的流程.  2、哥,有没有详细点的,来个给力的. 4、数据在统计意义上有哪些类型. 9、知道这些工具不知道如何在工作中用呀. 11、还有没有更人性化、智能化的展现. 12、上面这图看起来很给力,背后很复杂吧.  16、转载的留个来源 ,毕竟是我辛苦收集和想出来的,谢谢. 忘记“大数据”,从“中数据”开始.

这就是数据挖掘

- - 互联网分析
当今数据库的容量已经达到上万亿的水平(T)— 1,000,000,000,000个字节. 在这些大量数据的背后隐藏了很多具有决策意义的信息,那么怎么得到这些“知识”呢. 也就是怎样通过一颗颗的树木了解到整个森林的情况. 计 算机科学对这个问题给出的最新回答就是:数据挖掘,在“数据矿山”中找到蕴藏的“知识金块”,帮助企业减少不必要投资的同时提高资金回报.

数据挖掘与Taco Bell编程

- everfly - 译言-每日精品译文推荐
来源Data Mining and Taco Bell Programming. 程序员Ted Dziuba提出了一种他命名为“Taco Bell编程”的方案用于替代传统编程. Taco Bell链使用大概八种不同的元素来创建多种菜单项. Diziuba希望通过组合使用大概八种不同的shell脚本命令来创建多种应用程序.

数据挖掘之R与SQL

- Wolf - 刘思喆 @ 贝吉塔行星
今天看到老同学@JulieJulieJulieJulie 的浪漫求婚,真的很浪漫、很唯美、很感动. 正如评论说的,我们又相信爱情了. 于是,小兴奋,睡不着,爬起来补一篇文章. 最近在数据挖掘专业网站 KDnuggets 上刊出了2011年度关于数据挖掘/分析语言流行度的调查,不出意料R、SQL、Python果然排在了前三位.

使用Weka进行数据挖掘

- - 搜索研发部官方博客
数据挖掘、机器学习这些字眼,在一些人看来,是门槛很高的东西. 诚然,如果做算法实现甚至算法优化,确实需要很多背景知识. 但事实是,绝大多数数据挖掘工程师,不需要去做算法层面的东西. 他们的精力,集中在特征提取,算法选择和参数调优上. 那么,一个可以方便地提供这些功能的工具,便是十分必要的了. 而weka,便是数据挖掘工具中的佼佼者.

数据挖掘的标准流程

- - CSDN博客推荐文章
    CRISP-DM (cross-industry standard process for data mining), 即为"跨行业数据挖掘过程标准". 此KDD过程模型于1999年欧盟机构联合起草. 通过近几年的发展,CRISP-DM 模型在各种KDD过程模型中占据领先位置,采用量达到近60%.(数据引自Cios and Kurgan于2005年合著的论文trands in data mining and knowledge discovery中 )    在1996年,当时数据挖掘市场是年轻而不成熟的,但是这个市场显示了爆炸式的增长.

数据挖掘分类技术

- - CSDN博客云计算推荐文章
从分类问题的提出至今,已经衍生出了很多具体的分类技术. 下面主要简单介绍四种最常用的分类技术,不过因为原理和具体的算法实现及优化不是本书的重点,所以我们尽量用应用人员能够理解的语言来表述这些技术. 而且我们会在第4章再次给读者讲述分类算法和相关原理. 在我们学习这些算法之前必须要清楚一点,分类算法不会百分百准确.

数据挖掘 - 分类算法比较

- - IBM developerWorks 中国 : 文档库
随着计算能力、存储、网络的高速发展,人类积累的数据量正以指数速度增长. 对于这些数据,人们迫切希望从中提取出隐藏其中的有用信息,更需要发现更深层次的规律,对决策,商务应用提供更有效的支持. 为了满足这种需求,数据挖掘技术的得到了长足的发展,而分类在数据挖掘中是一项非常重要的任务,目前在商业上应用最多.