租房不要急,Python来帮您(一个超级有用的租房技巧)

租房的一般步骤

  1. 选房
    1.1 距离筛选
    2.2 价格筛选
  2. 看房
    2.1 现场实际环境
    2.2 周边环境
  3. 签合同

优化目标

选房是最为关键的一步,选择好合适的房子可以让我们事半功倍,不用来回跑。而且选房过程中需要通过阅读大量的房源信息,然后综合交通,上班时间,周边商场,以及价格范围等信息,从而选择出较为心仪的房子。这个步骤可以通过python来优化实现。
总的来说,选房最关键的就2个,一是上班时间短,二是价格相对便宜。
那么问题来了,租房地点的上班时间如何确定?
以本人为例,本人主要交通工具为地铁,那么就想着如果靠地铁,然后总的上班时间也比较短,那么我就会认为距离是合适的。下面将以本人为例讲解如何选择合适的租房地点

准备工作

  1. 获取高德api key。
    高德api开放平台提供了免费的接口,可以将任意地点转为相对精准的经纬度信息,通过高德地图的路线规划api,我们可以得到从起点到终点的公交或者地铁出行时间。
    高德地图开放平台官网:https://lbs.amap.com/
    高德地图开发文档:https://lbs.amap.com/api/webservice/gettingstarted
    本人用python编写好的模块包:https://github.com/Tlntin/amap_api
    推荐使用Python编写好的包,这样调用比较方便。

  2. 获取广州地铁信息。
    广州地铁线详细信息:http://gz.bendibao.com/ditie/linemap.shtml
    通过xpath即可筛选出所有地铁站站名称:

    /html/body/div[4]/div/div[1]/div/div/div/div/a
    
  3. 将广州地铁信息转成经纬度坐标。
    直接利用上面的高德api开放工具,然后通过其中的location_encode方法可以获取到该站名所有详细信息。

from amap_api import AMap
class MyClass(AMap):
    def __init__(self, keys, sig=None, output="JSON"):
        """
        初始化构造函数,继承于高德API
        :param keys: 密钥,需要去高德开放平台申请
        :param sig: 数字签名,详见:https://lbs.amap.com/faq/quota-key/key/41169
        :param output: 输出,JSON or XML;设置 JSON 返回结果数据将会以JSON结构构成;如果设置 XML 返回结果数据将以 XML 结构构成。
        """
        super().__init__(keys, sig, output)

    def subway_encode(self, subway_name: str, city: str):
        """
        地铁站名转经纬度地址
        :param subway_name: 地铁站名称,Str类型,如珠江新城地铁站
        :param city: 城市名称,Str类型,如:广州
        :return: 返回经纬度地址与地铁站全称
        """
        # 如果地铁站名称缺少地铁站结尾,如珠江新城,未指明珠江新城地铁站
        if not subway_name.endswith('地铁站'):
            subway_name = subway_name + '地铁站'
        if not subway_name.startswith(city):
            subway_name = city + subway_name
        data1 = self.location_encode(subway_name, city=city)
        if bool(data1):
            formatted_address = data1['geocodes'][0]['formatted_address']
            location = data1['geocodes'][0]['location']
            return formatted_address, location
        else:
            return False

测试一下广州珠江新城,输出结果为('广东省广州市天河区珠江新城地铁站', '113.320988,23.119410')
之后,我们需要将地铁站所有站名的详细信息和经纬度定位都计算出来,并且保存到csv文件中。

    @staticmethod
    def translate_all_subway(path='广州地铁线路图.csv', out_path='广州地铁2.csv'):
        df = pd.read_csv(path, encoding='utf-8-sig')
        address_list = []  # 用来储存地址列表
        location_list = []  # 用来储存经纬度列表
        for i in tqdm(range(len(df))):
            name = df.loc[i, '地铁站名']
            data_temp = my.subway_encode(name, '广州')
            if bool(data_temp):
                address_list.append(data_temp[0])
                location_list.append(data_temp[1])
            time.sleep(0.1)
        df['详细地址'] = address_list
        df['经纬度'] = location_list
        df.to_csv(out_path, encoding='utf-8-sig', index=None)
image-20200820181224664
  1. 编写函数计算地铁站点之间的距离
    这个其实高德api以及提供了,我们直接使用python的api模块获取公交出行,按最短出现时间计算总的出现距离。
    def calculate_during_time(self, origin, destination, city, city_destination=None):
        """
        计算出现最短出现时间
        :param origin: 出发点,Str类型,经纬度
        :param destination: 目标地点,,Str类型,经纬度
        :param city: 城市/跨城规划时的起点城市,Str类型。目前支持市内公交换乘/跨城公交的起点城市,可选值:城市名称/citycode
        :param city_destination: 跨城公交规划时的终点城市,Str类型,跨域则必填。可选值:城市名称/citycode
        :return:
        """
        data1 = self.bus_path_plan(origin, destination, city, city_destination)
        if bool(data1):
            # 只要最快的那个
            try:
                temp_data = data1['route']['transits']
                if len(temp_data) > 0:
                    distance = round(int(temp_data[0]['distance']) / 1000,  2)  # 计算距离, km
                    duration = round(int(temp_data[0]['duration']) / 60)  # 计算步行时间,单位分钟
                    return distance, duration
                else:
                    return False
            except:
                pprint(data1)
        else:
            return False

测试一下广州东站珠江新城地铁站,返回结果为:3.569 10,也就是步行距离3.6公里,实际最快公交出行10分钟。基本与手机app一致。

image-20200820181241586

  1. 根据你的工作地点,循环遍历所有地铁站,找出位置比较合适租房地铁口。
    在正式运行时,建议筛选一下,广佛线和APM线可以不要,部分地铁口识别为"广东省广州市"也需要去除。最后大概留下上班时间30分钟以内的地铁站就好了,以目标地点“珠江新城”附近的某栋大厦为例,遍历循环其它地铁口,找出上班时间在30分钟以内的地铁站。
    def calculate_all_subway_time(self, working_destination, city, input_path='广州地铁2.csv', output_path='广州地铁3.csv'):
        """
        计算所有地铁口的
        :param working_destination: 工作地点,Str类型.经纬度坐标
        :param city: 工作城市
        :param input_path: 输入文件地址,Str类型
        :param output_path: 输出文件地址,Str类型
        :return:
        """
        df = pd.read_csv(input_path, encoding='utf-8-sig')
        df = df.drop(df[df['详细地址'] == '广东省广州市'].index)
        df.drop_duplicates(subset=['地铁站名'], inplace=True)  # 去重
        df = df.reset_index()
        df = df.loc[:170].copy()  # 从广佛线后面都不要了
        distance_list = []  # 距离列表
        time_list = []  # 时间列表
        for i in tqdm(range(len(df))):
            location = df.loc[i, '经纬度']
            # 计算上班距离和时间
            data1 = self.calculate_during_time(location, working_destination, city=city)
            if bool(data1):
                distance_list.append(data1[0])
                time_list.append(data1[1])
            time.sleep(0.1)
        # 添加新列进去
        df['上班距离(km)'] = distance_list
        df['上班时间(分钟)'] = time_list
        df.to_csv(output_path, encoding='utf-8-sig', index=None)
image-20200820181249061

可以看出符合条件的大概有53个。加上地铁口到租房地点的距离,上下班也就差不多40分钟了。下一步就是获取租房信息,比如价格,大小,周边环境,是否靠近上面的地铁口,最好能获取到它的经纬度信息,这样就可以筛选出我们满意的房子了。这里不再阐述,有需要的请自行获取相关租房信息。

你可能感兴趣的:(租房不要急,Python来帮您(一个超级有用的租房技巧))