原文:https://www.eternitywith.xyz/posts/2a36.html
mac中安装python3
mac自带python,不过是2.7版本,但是现在一般使用3以上版本,安装过程如下:
下载python3
python官网:https://www.python.org/downloads/mac-osx/
从官网下载一个合适版本的安装包,直接打开安装,一直next就行。
安装完成之后,命令行输入python --version,这是python默认的环境还是python2,输入python3才是python3的版本。pip也是一样,需要输入pip3才是python3的环境。
如果需要让python变为python3的环境,需要进行环境配置,改变python的运行时环境指向。
配置python和pip环境
进入配置文件
vi ~/.bash_profile
添加如下如下三行配置,其中的数字按照下载的版本写,我这里是3.8
alias python="/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8"
export PATH=$PATH:/Library/Frameworks/Python.framework/Versions/3.8/bin/pip3.8
alias pip="/Library/Frameworks/Python.framework/Versions/3.8/bin/pip3.8"
保存退出后,输入如下命令重新加载配置文件:
source .bash_profile
然后再输入python --version,就变成刚刚安装的版本了,输入pip --version,pip的环境也成了python3的环境。
说明:本文以下的python和pip命令都是默认python3环境,如果你的不是,则请使用python3和pip3。
致谢:MAC 下 python3 环境安装和配置
VSCode中使用python
我这里使用VSCode,当然也可以用别的编辑器。
直接安装一个名为python的插件就行。
也可以装其他的辅助包,比如flake8和yapf用来语法检查和格式化代码,可以参考:用VScode配置Python开发环境
爬取数据
这里使用GoPUP,直接按照接口说明使用即可。
如果有地方用到百度指数登录后的cookie,直接使用cookie的value值即可。
导出数据
我这里使用pandas库将其导出为json格式。
先在终端输入pip list查看是否安装了pandas,没有的话需要安装pandas,终端输入pip install Pandas即可。
导出数据参考:https://tzzsmaster.blog.csdn.net/article/details/81137998
import gopup as gp
import pandas as pd
migration_scale_baidu_df = gp.migration_scale_baidu(area="西安市",indicator="move_in",date="20140101")
df = pd.DataFrame(migration_scale_baidu_df)
df.to_json("target.json",force_ascii=False,date_format = 'iso')
target.json为文件名,如果不存在会自动创建,force_ascii=False
最终结果
GoPUP中为迁徙数据提供了两个接口,一个迁入迁出详情,得到某一天内该地区的前一百迁入迁出规模(比例)。一个是迁徙规模,得到某段时间内该城市每天的迁徙规模指数。
最终的结果是得到三百多个城市每两个城市在某一天的迁徙指数值,迁徙指数=该城市在该天的迁出规模指数*该天该城市在另一个城市的迁徙规模。
import gopup as gp
import pandas as pd
from pandas.core.frame import DataFrame
#以第二列为索引读取excel数据
xlsx = pd.read_excel('./city.xlsx',index_col=1)
# 测试表
# xlsx = pd.read_excel('./312.xlsx',index_col=1)
#获取城市名
city = xlsx.index.values
# print(city)
#总迁出地详情
# migrationArea = {}
#总迁徙规模
# migrationScale = {}
#迁出地详情爬取失败的城市
migrationAreaErrorCity = []
#迁出规模爬取失败的城市
migrationScaleErrorCity = []
row = []
col = []
for item in city:
row.append(item)
col.append(item)
# 最终的表格
finalTable = pd.DataFrame(index=row,columns=col,dtype='float32')
# print(finalTable)
for item in city:
# ----------详情----------
baiduAreaData = gp.migration_area_baidu(area=item, indicator="move_out", date="20210107")
# print(baiduAreaData)
if isinstance(baiduAreaData,DataFrame):
#收集总的详情数据
# migrationArea[item] = baiduAreaData.values
#单个城市数据导出成表格
df = pd.DataFrame(baiduAreaData)
df.to_excel("./migrationArea/"+item+".xlsx",encoding='utf-8')
else:
#获取读取失败的城市
migrationAreaErrorCity.append(item)
# -----------规模-----------
baiduScaleData = gp.migration_scale_baidu(area=item, indicator="move_out", date="20210107")
if isinstance(baiduScaleData,DataFrame):
#收集总的规模数据
# migrationScale[item] = baiduScaleData.loc['2020-01-07','迁徙规模指数']
#单个城市数据导出成表格
df = pd.DataFrame(baiduScaleData)
df.to_excel("./migrationScale/"+item+".xlsx",encoding='utf-8')
else:
#获取读取失败的城市
migrationScaleErrorCity.append(item)
# ------------填表-------------
if isinstance(baiduAreaData,DataFrame) & isinstance(baiduScaleData,DataFrame):
for areaValues in baiduAreaData.values:
for cityItem in city:
if cityItem == areaValues[0]: #在详情中遍历查找city列表中的某个城市
finalTable.at[item,cityItem] = baiduScaleData.loc['2020-01-07','迁徙规模指数']*areaValues[2]
# 导出表格
finalTable.to_excel('./finalData.xlsx',encoding='utf-8')
# 未爬取到数据的城市导出到表格
pd.DataFrame(migrationAreaErrorCity).to_excel('./areaErrorCity.xlsx',encoding='utf-8')
pd.DataFrame(migrationScaleErrorCity).to_excel('./scaleErrorCity.xlsx',encoding='utf-8')
print(migrationAreaErrorCity)
print('--------------------')
print(migrationScaleErrorCity)
print('--------------------')
# print(finalTable)
相应API参考官网:pandas.DataFrame API