请选择 进入手机版 | 继续访问电脑版
查看: 728|回复: 0

我要买33块钱的房子——杭州链家爬虫

[复制链接]

353

主题

373

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
99935
发表于 2017-11-23 16:57:08 | 显示全部楼层 |阅读模式
最近在学习python的时候,老大布置了一个任务,去做链家的爬虫,爬下最近一段时间二手房的成交记录。

在网上搜了下相关爬虫内容,还是有不少的,不过链家网站最近应该更新过一次,导致不少元素识别不出来。另外链家网站北京、上海和杭州的网页内容也不完全相同。爬虫原理主要就是发送请求爬去链家的响应信息,通过BeautifulSoup解析请求响应后获取网页元素,再写入到数据库中。


最近链家网站变动,最开始的想法是爬下所有小区信息,每个小区都对应一个编号,通过编号可以爬取对应小区的售房记录。后来发现,其实每个主城区的销售记录不足3000条,100页内可以加载完所有记录,这样就可以把城区加进URL中获取每个城区的销售记录,会比挨个爬小区的售房记录快得多。不过西湖区已经2800多条了,如果超过3000了就爬不到全部信息了。但是就在昨天,杭州链家突然把板块也加上来了,啊哦,这下就不怕你销售记录增长了,直接把所有板块保存到一个dict中,挨个爬每个板块售房信息就行了。


首先我们做了一点反爬虫处理,设置了一堆像下面的headers,每次请求随机取一个header
{'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

再将杭州的城区添加到一个数组中,根据每个城区得到对应的请求URL。后面可以考虑把用对应城区中的板块,就是稍微麻烦了点。
regions = [u"xihu", u"xiacheng", u"jianggan", u"gongshu", u"shangcheng", u"binjiang", u"yuhang", u"xiaoshan"]
我们将爬到的数据用sqlite3写到数据库中,先把数据库命令封装了下(拿来主义)。并定义了一个成交记录插入命令。
def gen_chengjiao_insert_command(info_dict):
    """
    生成成交记录数据库插入命令
    """
    info_list = [u'房源链接',u'城区', u'小区名称', u'户型', u'面积', u'朝向', u'装修', u'电梯', u'楼层', u'建造时间',

    t = []
    for il in info_list:
        if il in info_dict:
            t.append(info_dict[il])
        else:
            t.append('')
    t = tuple(t)
    command = (r"insert into chengjiao values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", t)
    return command
然后就是用BeautifulSoup解析一个请求响应,并将页面中的各个字段值找出来存到数据库。这个BeautifulSoup语法用的不熟,踩了不少坑。
一个页面中包含30条记录,通过共同的class属性写入到同一个数组中,列表循环一下所有记录,根据不同元素找到对应信息,取出字段值填充到dict_info中,最后写入到数据库。date({u'




一个页面可以解析出来,那么一个城区的所有页面也就是可以的咯,那么整个杭州也就可以for循环一下爬出来了,就是这么简单。
爬取城区的信息时候可以考虑采用并发。




最后,创建一个保存记录的表,run一下启动爬虫。一会就能爬到杭州链家的成交记录了。爬完之后打开看了下,整个人都不好了,居然有33块钱的房子,还有好多一块两块一平的房子,能不能给我来一打/(ㄒoㄒ)/~~


当然,你还会发现滨江土豪的房子有9万平,辣么大要种地么

如果你是个古董爱好者,还可以找到50年前的房子,辣么贵是因为很有收藏价值么

不过,当看了大部分成交记录的时候,我只想静静╮(╯▽╰)╭另外爬了下杭州的小区,发现杭州居然有4000多个小区,有点惊讶额(⊙o⊙)…
代码和数据如下:
LianJiaSpider.rar



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表