分享爬取链家地图找房房价数据的小爬虫

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhchs2012/article/details/80053788

一、说在前面

受人所托,爬取链家上地图找房的数据:https://bj.lianjia.com/ditu/
上面有按区域划分的二手房均价和在售套数,我们的任务就是抓下这些数据。
这里写图片描述

二、开干

2.1失败一次

老样子,Chrome 按下F12打开Chrome DevTools中的Network标签查看请求过程,像这种需要更新的数据大概率是通过后台接口请求返回的,遗憾的是在XHR下并没有找到接口,小泄气。
继续找,在JS下发现了一个可疑的请求:https://ajax.lianjia.com/map/search/ershoufang/
这里写图片描述
嘻嘻,就是你了。然后就是熟悉的模拟请求过程了,把Headers、Query String Parameters都带上,一通操作猛如虎之后:
这里写图片描述
什么鬼啊,一个简单的GET请求,模拟了所有请求头和参数,甚至在浏览器里头都无法再次请求成功。应该是链家做了什么限制,如果有大牛不小心路过此篇能给予一些指导那是再好不过了。感激不尽,感激不尽。

2.2重新起航

此路不通,只好寻找别的办法。链家的地图找房功能其实找的是二手房,于是我进入二手房的房价页面,发现了一个类似的数据展示页面。https://bj.lianjia.com/fangjia/
这里写图片描述
这个页面就很有意思了,直接摆了一个明晃晃的接口。
Request URL:https://bj.lianjia.com/fangjia/priceMap/
数据也十分地明晃晃:
这里写图片描述
可惜的是这个接口并不带套数这个数据,不管了。先爬下来再说。

2.3代码简单解读

import requests
from bs4 import BeautifulSoup
from datetime import datetime

def get_city_list():
    city_list = {}
    city_from_url = 'https://m.lianjia.com/city/'
    mhtml = requests.get(city_from_url)
    mobj = BeautifulSoup(mhtml.content,'lxml')
    city_block = mobj.body.section.find_all('div',{'class':'block city_block'})
    for cb in city_block:
        for cba in cb.find_all('a'):
            city_list[cba.get('href')] = cba.get_text()
    return city_list

if __name__ == '__main__':
    cityd = get_city_list()
    f = open('houing_price_bycity.csv','w',encoding = 'utf-8')
    for citycode,city in cityd.items():
        url = 'https://{}.lianjia.com/fangjia/priceMap/'.format(citycode[1:-1])
        try:
            r = requests.get(url)
            if r.status_code == 200:
                res = r.json()
            else:
                continue
        except:
            continue
        for k,v in res.items():
            if isinstance(v,(int,float)):
                pass
            else:
                cont = ','.join([city,v['name'],str(v['transPrice']),datetime.now().strftime("%Y-%m-%d %H:%M:%S")])
                cont = cont + '\n'
                f.write(cont)
    f.close()

先是从一个链家移动端的页面,抓取所有的城市列表和它们在链家内部的代号。用这个代号去替换请求中的城市部分,以此实现循环所有城市列表抓下所有城市的分区域房价信息。实际应用中发现不是所有城市都有这个地图找房的接口,主要是一些大城市才有。
因为是自用的小爬虫,一些报错处理也十分简单粗暴,请求过程也没有设定重试模块,也没有限制访问速度应对可能存在的链家反爬机制(结果来看,这个接口大概率没有做反爬),结果也直接写进了当前目录的CSV文档。显然存在许多可以优化的点。whatever,自己用用的小爬虫就不讲究这么多了啦。
最后爬下来的结果长这样:
这里写图片描述

结束

本文到此就结束了,不过细心的小朋友可能会发现好像漏了什么。
没错,一开始链家地图找房的功能里是有房价和在售套数两个数据的,现在我们只获取了其中一个。因为套数这个数据我们在接口里没有找到,不过我仍然找到了数据获取的地方。
在链家-二手房-在售页面,通过按区域搜索可以看到这个数据直接展示在页面上:
这里写图片描述
这个数据是直接写在网页html代码里的,按区域抓下来与之前的房价数据匹配起来即可。我们也由此可知,这个数据更新地不会很勤快,这一步就留给有需要的人去做吧。方法已经给到,实现自然不是什么难事。
此篇正式终结,88。

猜你喜欢

转载自blog.csdn.net/zhchs2012/article/details/80053788