题外话:这几天用python做题,算是有头有尾地完成了。这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考。我python的实战经历不多,所以代码也是简单易懂的那种。当然过程中还是遇到了一些问题,也会向大家提供我的解决方案。
用python爬取链家网的二手房信息,我主要用到了bs4中的BeautifulSoup。所以首先我们需要在cmd中输入“pip install beautifulsoup”安装——pip的安装自己搜博客哦。另外我还推荐使用Anaconda2(64位),遇到需要自己设路径的安装库时,可以直接在这个软件内安装你需要的库类。这两种方法比较简单方便。
一、import导入库
from bs4 import BeautifulSoup
import urllib2
import time
第一个库是用来从HTML中提取数据(HTML/XML的解析器);第二个库是需要其中的urlopen,用来打开url;第三个库是用来延时的,以防访问过快被封IP。
二、准备工作
time.clock()
address = []
flood = []
follow = []
price = []
为程序加入计时器;还有四个空列表,用来放从网页上提取得到的相关信息。adress是房源地址信息;flood是房子的样式;follow是有多少人关注;price是房价。
三、解析网址
假设我们需要爬去杭州萧山区的二手房信息,我们看到一共有二十五页,而每页的网址知识改变了最后的“/pg2”里的数字页码。我们可以这样做:
for i in range(1,26):
url = 'https://hz.lianjia.com/ershoufang/xiaoshan/pg'+str(i)+'/'
page = urllib2.urlopen(url)
soup = BeautifulSoup(page)
在for循环中,我们用range(1,26),从第一页至第二十五页,注意range的范围是左闭右合;然后用urllib2.urlopen(url)打开网址,创建beautifulsoup对象。
同样在这个大for循环下,加入下面的代码:
for link in soup.find_all('div','address'):
context = link.get_text()
address.append(context)
# for i in address:
# print address[0]
以前做的时候使用soup.select做的,这次发现用find_all更简单。我们找到div标签下,样式是address的信息;然后用get_text去掉其中的代码部分,选取文本信息;再将文本信息添加至address列表中。
这里需要用到网页的相关知识,我简单介绍一下:网页由HTML(网页结构)、CSS(网页样式)和JavaScript(网页功能)构成。在网页中,我们在某个网页标签(比如将鼠标放在“一室一厅”上)上右击选择“检查”,就可以定位到这个文本在网页代码中的位置。
在下图中,我们可以看到选中右边的title时,左边的黑色圈出来部分被阴影提示。在这里我们会发现我们所需要的文本信息都是放在<div>……</div>区域内的;并在“class=样式”下进行内容填充。
由此,我们将大for循环写完整,如下:
这里我突然发现我的延时并没有用上…写得太匆忙了…只是起到了一个计数的作用。最后那个“print '当前正在抓取第'+str(i)+'页'”是为了方便跑程序的时候看进度,不然未知的等待很浪费时间。
这里之后我还会学习一下用Xpath和正则表达式来做,毕竟是python必学内容。
四、构建数据表,进行信息整合
需要把以上四个房源信息合并到一个数据表中。
因为得到的每列数据中含有多种讯息,所以我们需要将其进行分列操作。
这里我觉得代码还是比较容易读的;着重说一下上图中圈出来的红色。如果不加会报错“…6 columns,passed…7columns…”,大概是这样。看报错后的定位大概可以了解到,是因为依据“|”进行分列,可以分为7列,但我只给了六个分列后的标签,所以报错了。
分析最后得到的数据表,也不难发现是因为某些区内的某些别墅类房源的多标签导致的。
最后我们再将这些分列好的数据进行整表:
由于我是做题需要,太多标签行对我来说没有什么意义,所以除了删除未分列前的行,我还删除了有无电梯等列信息。house.drop()里的axis的值可选0或1,表示行或列。
五、保存爬取结果
这样,我们的网页爬取就结束了。接下来是保存成csv结构;建议数据操作时还是以表格形式处理(如果是用excel处理的话),不然保存后只会留下最后一张表…还好我是一边做一边截图放文档里的。
这里需要注意的就是encoding一定要写GBK,utf-8、gbk(xxx)都会导致csv文件中中文乱码问题。
最后依据print是为了和网页上的总房源信息做一个比较,确认爬虫爬完了所有数据。另外温馨提示,这些爬取下来的数据是有重复的,也就是网页有同一条房源信息多次推送罗列的行为。
以上,记录完毕。