当前位置: 首页 > news >正文

基于python的百度迁徙迁入、迁出数据分析(七)

参考:【Python】基于Python的百度迁徙2——迁徙规模指数(附代码)-CSDN博客

记录于2024年8月,这篇是获取百度迁徙指数,之前我们都在讨论不同城市的迁徙比例关系,这篇我们来获取百度迁徙指数这个数据,代码整体逻辑没变,简化了一下步骤,保存结果为.xlsx,另外把代码拆分成三部分,城市尺度、省份尺度、全国尺度,为了降低读者对这个函数migration_index(FileTittle,classname,direction,CodeDict)的理解成本,需要用哪个部分直接使用即可,但是这里还是解释一下,migration_index(文件夹名称,城市级别(city/province/country),迁徙方向(in/out),城市编码字典);

城市编码第一篇有说明,只需要新建一个.py的文件 文件名叫''ChineseAdminiDivisionsDict'',把城市编码复制进去即可,另外城市编码这个文件一定要和下面运行的这个.py在同一个目录下面,城市编码说明:

基于python的百度迁徙迁入、迁出数据分析(一)_百度迁徙数据怎么爬取-CSDN博客

完整代码#运行环境 Python 3.11(城市尺度版)

import requests  # 导入请求模块
import json  # 导入JSON解析模块
import time  # 导入时间模块
import xlsxwriter  # 导入Excel文件操作模块
from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCode  # 导入中国行政区划字典def write_header(worksheet, cities):worksheet.write(0, 0, '城市代码')  # 写入城市代码标题worksheet.write(0, 1, '城市')  # 写入城市名称标题cities_order = {}  # 存放城市序号的字典for idx, (city_name, code) in enumerate(cities.items(), start=1):worksheet.write(idx, 0, str(code))  # 写入城市代码worksheet.write(idx, 1, str(city_name))  # 写入城市名称cities_order[str(city_name)] = idx  # 记录城市序号return cities_orderdef fetch_migration_data(url):try:response = requests.get(url, timeout=2)  # 发送HTTP请求time.sleep(3)  # 等待3秒以避免频繁访问raw_data = response.text[4:-1]  # 去除响应文本的首尾非数据字符data_dict = json.loads(raw_data)  # 解析JSON数据if data_dict['errmsg'] == 'SUCCESS':return data_dict['data']['list']  # 返回成功数据else:print('Error fetching data:', data_dict['errmsg'])  # 打印错误信息return Noneexcept Exception as e:print(f"An error occurred: {e}")  # 打印异常信息return Nonedef migration_index(file_title, class_name, direction, code_dict):direction_name = '迁入' if direction == 'in' else '迁出'  # 根据方向设置标题file_path = f'{file_title} {direction_name}规模指数.xlsx'workbook = xlsxwriter.Workbook(file_path)  # 创建Excel工作簿worksheet = workbook.add_worksheet('Sheet')  # 添加工作表cities_order = write_header(worksheet, code_dict)  # 写入头部信息并获取城市序号字典for area, code in code_dict.items():url = f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={class_name}&id={code}&type=move_{direction}'print(f'{area}: {url}')  # 输出正在处理的城市及URLdata = fetch_migration_data(url)  # 获取迁移数据if data:counter_date = 2  # 用于记录日期的位置dates = sorted(data.keys())  # 排序日期for date in dates:index = data[date]  # 获取某天的迁移规模指数worksheet.write(0, counter_date, float(date))  # 写入日期worksheet.write(cities_order[str(area)], counter_date, float(index))  # 写入迁移规模指数counter_date += 1  # 移动到下一个日期列workbook.close()  # 关闭工作簿if __name__ == "__main__":migration_index('城市', 'city', 'in', CitiesCode)  # 处理迁入数据migration_index('城市', 'city', 'out', CitiesCode)  # 处理迁出数据print('全部完成')  # 完成提示

输出结果展示:

完整代码#运行环境 Python 3.11(省份尺度版)

import requests  # 导入请求模块
import json  # 导入JSON解析模块
import time  # 导入时间模块
import xlsxwriter  # 导入Excel文件操作模块
from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCode  # 导入中国行政区划字典def write_header(worksheet, cities):worksheet.write(0, 0, '城市代码')  # 写入城市代码标题worksheet.write(0, 1, '城市')  # 写入城市名称标题cities_order = {}  # 存放城市序号的字典for idx, (city_name, code) in enumerate(cities.items(), start=1):worksheet.write(idx, 0, str(code))  # 写入城市代码worksheet.write(idx, 1, str(city_name))  # 写入城市名称cities_order[str(city_name)] = idx  # 记录城市序号return cities_orderdef fetch_migration_data(url):try:response = requests.get(url, timeout=2)  # 发送HTTP请求time.sleep(3)  # 等待3秒以避免频繁访问raw_data = response.text[4:-1]  # 去除响应文本的首尾非数据字符data_dict = json.loads(raw_data)  # 解析JSON数据if data_dict['errmsg'] == 'SUCCESS':return data_dict['data']['list']  # 返回成功数据else:print('Error fetching data:', data_dict['errmsg'])  # 打印错误信息return Noneexcept Exception as e:print(f"An error occurred: {e}")  # 打印异常信息return Nonedef migration_index(file_title, class_name, direction, code_dict):direction_name = '迁入' if direction == 'in' else '迁出'  # 根据方向设置标题file_path = f'{file_title} {direction_name}规模指数.xlsx'workbook = xlsxwriter.Workbook(file_path)  # 创建Excel工作簿worksheet = workbook.add_worksheet('Sheet')  # 添加工作表cities_order = write_header(worksheet, code_dict)  # 写入头部信息并获取城市序号字典for area, code in code_dict.items():url = f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={class_name}&id={code}&type=move_{direction}'print(f'{area}: {url}')  # 输出正在处理的城市及URLdata = fetch_migration_data(url)  # 获取迁移数据if data:counter_date = 2  # 用于记录日期的位置dates = sorted(data.keys())  # 排序日期for date in dates:index = data[date]  # 获取某天的迁移规模指数worksheet.write(0, counter_date, float(date))  # 写入日期worksheet.write(cities_order[str(area)], counter_date, float(index))  # 写入迁移规模指数counter_date += 1  # 移动到下一个日期列workbook.close()  # 关闭工作簿if __name__ == "__main__":migration_index('省份', 'province', 'in', ProvinceCode)  # 处理迁入数据migration_index('省份', 'province', 'out', ProvinceCode)  # 处理迁出数据print('全部完成')  # 完成提示

输出结果展示:

完整代码#运行环境 Python 3.11(全国尺度版)

import requests  # 导入请求模块
import json  # 导入JSON解析模块
import time  # 导入时间模块
import xlsxwriter  # 导入Excel文件操作模块
from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCode  # 导入中国行政区划字典def write_header(worksheet, cities):worksheet.write(0, 0, '城市代码')  # 写入城市代码标题worksheet.write(0, 1, '城市')  # 写入城市名称标题cities_order = {}  # 存放城市序号的字典for idx, (city_name, code) in enumerate(cities.items(), start=1):worksheet.write(idx, 0, str(code))  # 写入城市代码worksheet.write(idx, 1, str(city_name))  # 写入城市名称cities_order[str(city_name)] = idx  # 记录城市序号return cities_orderdef fetch_migration_data(url):try:response = requests.get(url, timeout=2)  # 发送HTTP请求time.sleep(3)  # 等待3秒以避免频繁访问raw_data = response.text[4:-1]  # 去除响应文本的首尾非数据字符data_dict = json.loads(raw_data)  # 解析JSON数据if data_dict['errmsg'] == 'SUCCESS':return data_dict['data']['list']  # 返回成功数据else:print('Error fetching data:', data_dict['errmsg'])  # 打印错误信息return Noneexcept Exception as e:print(f"An error occurred: {e}")  # 打印异常信息return Nonedef migration_index(file_title, class_name, direction, code_dict):direction_name = '迁入' if direction == 'in' else '迁出'  # 根据方向设置标题file_path = f'{file_title} {direction_name}规模指数.xlsx'workbook = xlsxwriter.Workbook(file_path)  # 创建Excel工作簿worksheet = workbook.add_worksheet('Sheet')  # 添加工作表cities_order = write_header(worksheet, code_dict)  # 写入头部信息并获取城市序号字典for area, code in code_dict.items():url = f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={class_name}&id={code}&type=move_{direction}'print(f'{area}: {url}')  # 输出正在处理的城市及URLdata = fetch_migration_data(url)  # 获取迁移数据if data:counter_date = 2  # 用于记录日期的位置dates = sorted(data.keys())  # 排序日期for date in dates:index = data[date]  # 获取某天的迁移规模指数worksheet.write(0, counter_date, float(date))  # 写入日期worksheet.write(cities_order[str(area)], counter_date, float(index))  # 写入迁移规模指数counter_date += 1  # 移动到下一个日期列workbook.close()  # 关闭工作簿QUANGUO = {'全国': 0}  # 全国编码if __name__ == "__main__":migration_index('全国', 'country', 'in', QUANGUO)  # 处理全国迁入数据migration_index('全国', 'country', 'out', QUANGUO)  # 处理全国迁出数据print('全部完成')

输出结果展示:

三个尺度的版本都在这里了,需要哪个尺度的直接用即可,另外这个数据是获取的是百度迁徙数据库有的所有历史数据,数据范围(20190112, 20190309),(20230104, 20230506),(20240123, 20240807(也就是截止数据获取日期前一天));

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C# 报表功能
  • Nginx隐藏欢迎页Welcome to CentOS
  • 百日筑基第四十五天-从JAVA8走到JAVA9
  • Spring的代理模式
  • Omit<T, K> 解释
  • 【电子数据取证】支持最新版微信、企业微信、钉钉等重点应用数据提取分析!
  • 网络安全知识讲解
  • C语言典型例题30
  • Vue 3 中,组件间传值有多种方式
  • 【知识】pytorch中的pinned memory和pageable memory
  • Android Fragment:详解,结合真实开发场景Navigation
  • Java开发笔记--通用基础数据校验的设计
  • 思科CCIE最新考证流程
  • 工业三防平板助力MES系统打造工厂移动式生产管理
  • 视频编辑与制作软件哪个好 会声会影视频制作教程 会声会影软件下载免费中文版
  • 【Amaple教程】5. 插件
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android框架之Volley
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Just for fun——迅速写完快速排序
  • MySQL QA
  • redis学习笔记(三):列表、集合、有序集合
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud Feign的两种使用姿势
  • Spring-boot 启动时碰到的错误
  • ViewService——一种保证客户端与服务端同步的方法
  • Yeoman_Bower_Grunt
  • 阿里云前端周刊 - 第 26 期
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 复杂数据处理
  • 高度不固定时垂直居中
  • 汉诺塔算法
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 怎样选择前端框架
  • 容器镜像
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​queue --- 一个同步的队列类​
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (十六)一篇文章学会Java的常用API
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • .net 4.0发布后不能正常显示图片问题
  • .net Signalr 使用笔记
  • .net 生成二级域名
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore如何运行环境安装到Linux服务器
  • .net反编译的九款神器
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET中两种OCR方式对比
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...