记录一次爬虫

原文: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

python
105 views
Comments
登录后评论
Sign In