def run(self): '''执行函数 第一步: 获取城市列表 第二步: 获取每个城市的小区基本信息 第三步: 获取所有小区的详情信息 ''' if os.path.exists(self.citys_file_name) is False: self.get_citys() for key, value in operation_file.read_json_file( self.citys_file_name).items(): if os.path.exists( self.plots_file_name.format(city_name=key)) is False: self.get_plots(value['city_name'], value['city_url']) for file_name in os.listdir(self.plots_dir_name): self.get_plots_detail(self.plots_dir_name + file_name)
def get_all_city_plots(self): '''获取所有城市的小区 读取城市列表 JSON 文件, 获取全部城市列表(字典类型) 循环城市列表, 获取城市名和对应的 URL, 当前获取的 URL 与展示小区列表的 URL 不同 判断当前城市小区的 JSON 文件是否存在, 如果存在则说明此城市已完成采集, 跳过当前城市 通过判断则采集当前城市小区数据 ''' for city_key, city_value in operation_file.read_json_file( self.citys_file_name).items(): if os.path.exists( self.plots_file_name.format( file_name=city_value['city_name']) ) is True or self.continue_city_name_list.count( city_value['city_name']) >= 1: continue self._get_plots(city_value['city_name'], city_value['city_url'])
def get_plots_detail(self, file_path): '''获取当前城市的小区详细信息 读取小区信息文件, 并循环每个小区信息 判断此小区是否已采集过详细信息(这里按`地址`这个键来判断), 没有采集则采集详细信息 每采集20个小区的详细信息则保存一次数据, 小区采集结束后也会保存一次数据 Args: file_path: 单城市的小区信息文件 ''' plots_dict = operation_file.read_json_file(file_path) num = 1 for key in plots_dict.keys(): if plots_dict[key].get('地址') is None: plots_dict[key] = self._get_plot_detail(plots_dict[key]) num += 1 if num % config.save_file_number == 0: print('更新文件{file_path}'.format(file_path=file_path)) operation_file.write_json_file(file_path, plots_dict) if num > 1: print('更新文件{file_path}'.format(file_path=file_path)) operation_file.write_json_file(file_path, plots_dict)
def get_plots_detail(self, file_name): '''获取当前城市的小区详细信息 读取小区信息文件, 并循环每个小区信息 判断此小区是否已采集过详细信息(这里按`地址`这个键来判断), 没有采集则采集详细信息 每采集20个小区的详细信息则保存一次数据, 小区采集结束后也会保存一次数据 Args: file_name: 单城市的小区信息文件 ''' plots_dict = operation_file.read_json_file(file_name) i = 1 for key in plots_dict.keys(): if plots_dict[key].get('地址') is None: common.print_and_sleep('采集{name}小区详情: {url}'.format( name=key, url=plots_dict[key]['plot_url'])) plots_dict[key] = self._get_plot_detail(plots_dict[key]) i += 1 if i % config.save_file_number == 0: print('更新文件:{file_name}'.format(file_name=file_name)) operation_file.write_json_file(file_name, plots_dict) if i > 1: print('更新文件:{file_name}'.format(file_name=file_name)) operation_file.write_json_file(file_name, plots_dict)
def get_all_plot_detail(self): # 读取链家目录下全部文件 # 读取每个文件中的 json 数据 # 判断每个小区数据, 如果没有详细数据则获取 # 每获取 100 个小区数据或者本文件读取结束, 保存 for plot_file in os.listdir(self.plots_dir_name): plot_file_name = self.plots_dir_name + plot_file plots_dict = operation_file.read_json_file(plot_file_name) i = 1 for plot_key in plots_dict.keys(): if plots_dict[plot_key].get('地址') is None: plots_dict[plot_key] = self._get_plot_detail( plots_dict[plot_key]) i += 1 if i % config.save_file_number == 0: print('更新文件: {file_name}'.format( file_name=plot_file_name)) operation_file.write_json_file(plot_file_name, plots_dict) if i > 1: print('更新文件: {file_name}'.format(file_name=plot_file_name)) operation_file.write_json_file(plot_file_name, plots_dict)
def get_plots_detail(self, plots_file_name): '''获取文件中的小区详情数据 读取小区数据文件中的数据, 遍历 判断当前小区数据中是否存在`地址`数据, 如果存在则已经获取过详细数据了, 如果没有则获取 没采集一定数量的小区详情数据, 就更新一次文件(防止因特殊情况中断采集, 导致采集的数据全部丢失) 循环结束, 更新文件 ''' plots_dict = operation_file.read_json_file(plots_file_name) i = 1 for plot_key in plots_dict.keys(): if plots_dict[plot_key].get('经纬度') is None: common.print_and_sleep('采集{name}小区详情: {url}'.format( name=plots_dict[plot_key]['plot_name'], url=plots_dict[plot_key]['plot_url'])) plots_dict[plot_key] = self._get_plot_detail( plots_dict[plot_key], plots_dict[plot_key]['plot_url']) i += 1 if i % config.save_file_number == 0: print( '更新文件: {file_name}'.format(file_name=plots_file_name)) operation_file.write_json_file(plots_file_name, plots_dict) if i > 1: print('更新文件: {file_name}'.format(file_name=plots_file_name)) operation_file.write_json_file(plots_file_name, plots_dict)