【Python】基于Python的百度迁徙1——迁入、迁出数据(附代码)
2020年8月1日更:百度遷徙在5月8日后就不開放了,目前好像只能爬取到3月15日之前的數據,而且爬取的時候會遇到挺多問題的(具體我也不知道,不開放后我就沒爬過了,但是最近很多朋友在問)。評論里關于爬取遇到的問題很多我也沒遇到過,沒辦法幫到你們。如果想直接獲取數據(5月8日前的數據)的話,可以私聊或者電子郵件(chinshuuichi@qq.com)聯系我(會收一點手工費…)。
2020年10月21日更:百度遷徙重新開放了,數據從9月22開始都有。以下舊的代碼需要更改一個地方,即把代碼里所有r=response.text[3:-1]全部替換為r=response.text[4:-1]即可。
目錄
- 簡介
- 效果展示
- 準備——城市編碼
- 代碼
- 編輯日志
- 系列文章
簡介
百度遷徙 :百度遷徙
不多逼逼,相關的自己了解。趁這幾天比較好抓取數據,需要的數據就趕緊抓抓抓。
效果展示
不著急看代碼,先給你們看一波效果圖,各位看官看完效果圖看看是不是自己需要的再看代碼。
我是把獲得的數據存成一個xls格式,因為csv換列不太方便(我不會)所以我選擇了xls。這張圖里表是我的家鄉泉州一月、二月一共兩個月的遷出數據,左邊第一列是所有城市的編碼(身份證前6位,這也和url要求的編碼一樣),左邊第二列是所有城市的名稱,第一行是日期。為什么我要把表弄成這樣呢?因為我要把表丟進GIS里做可視化(后面有可視化的圖),又懶得改,所以這樣方便一點,直接丟進去就可以了。
然后為了讓各位看官看到像百度遷徙網站那樣的前一百名排序,我就特地點了排序截了一張圖(1月1日排序)如下。(這兩個是同一個表)
前面說要展示的可視化,我選的好像是泉州的1月9日的遷出。隨手一截。
準備——城市編碼
在正式搬出代碼前,可能需要個字典,要不然都不知道哪個城市是什么編碼。
這個我是新建一個py文件,和主程序丟在同一個文件夾里,然后在主程序里直接import調用。
CitiesCode為城市編碼,一行代表一個省份,部分比較長的省份我就分了兩行。
ProvinceCode為省份編碼。
#ChineseAdminiDivisionsDict.pyCitiesCode = {'北京市':110000,'天津市':120000,'石家莊市':130100,'唐山市':130200,'秦皇島市':130300,'邯鄲市':130400,'邢臺市':130500,'保定市':130600,'張家口市':130700,'承德市':130800,'滄州市':130900,'廊坊市':131000,'衡水市':131100,'太原市':140100,'大同市':140200,'陽泉市':140300,'長治市':140400,'晉城市':140500,'朔州市':140600,'晉中市':140700,'運城市':140800,'忻州市':140900,'臨汾市':141000,'呂梁市':141100,'呼和浩特市':150100,'包頭市':150200,'烏海市':150300,'赤峰市':150400,'通遼市':150500,'鄂爾多斯市':150600,'呼倫貝爾市':150700,'巴彥淖爾市':150800,'烏蘭察布市':150900,'興安盟':152200,'錫林郭勒盟':152500,'阿拉善盟':152900,'沈陽市':210100,'大連市':210200,'鞍山市':210300,'撫順市':210400,'本溪市':210500,'丹東市':210600,'錦州市':210700,'營口市':210800,'阜新市':210900,'遼陽市':211000,'盤錦市':211100,'鐵嶺市':211200,'朝陽市':211300,'葫蘆島市':211400,'長春市':220100,'吉林市':220200,'四平市':220300,'遼源市':220400,'通化市':220500,'白山市':220600,'松原市':220700,'白城市':220800,'延邊朝鮮族自治州':222400,'哈爾濱市':230100,'齊齊哈爾市':230200,'雞西市':230300,'鶴崗市':230400,'雙鴨山市':230500,'大慶市':230600,'伊春市':230700,'佳木斯市':230800,'七臺河市':230900,'牡丹江市':231000,'黑河市':231100,'綏化市':231200,'大興安嶺地區':232700,'上海市':310000,'南京市':320100,'無錫市':320200,'徐州市':320300,'常州市':320400,'蘇州市':320500,'南通市':320600,'連云港市':320700,'淮安市':320800,'鹽城市':320900,'揚州市':321000,'鎮江市':321100,'泰州市':321200,'宿遷市':321300,'杭州市':330100,'寧波市':330200,'溫州市':330300,'嘉興市':330400,'湖州市':330500,'紹興市':330600,'金華市':330700,'衢州市':330800,'舟山市':330900,'臺州市':331000,'麗水市':331100,'合肥市':340100,'蕪湖市':340200,'蚌埠市':340300,'淮南市':340400,'馬鞍山市':340500,'淮北市':340600,'銅陵市':340700,'安慶市':340800,'黃山市':341000,'滁州市':341100,'阜陽市':341200,'宿州市':341300,'六安市':341500,'亳州市':341600,'池州市':341700,'宣城市':341800,'福州市':350100,'廈門市':350200,'莆田市':350300,'三明市':350400,'泉州市':350500,'漳州市':350600,'南平市':350700,'龍巖市':350800,'寧德市':350900,'南昌市':360100,'景德鎮市':360200,'萍鄉市':360300,'九江市':360400,'新余市':360500,'鷹潭市':360600,'贛州市':360700,'吉安市':360800,'宜春市':360900,'撫州市':361000,'上饒市':361100,'濟南市':370100,'青島市':370200,'淄博市':370300,'棗莊市':370400,'東營市':370500,'煙臺市':370600,'濰坊市':370700,'濟寧市':370800,'泰安市':370900,'威海市':371000,'日照市':371100,'臨沂市':371300,'德州市':371400,'聊城市':371500,'濱州市':371600,'菏澤市':371700,'鄭州市':410100,'開封市':410200,'洛陽市':410300,'平頂山市':410400,'安陽市':410500,'鶴壁市':410600,'新鄉市':410700,'焦作市':410800,'濮陽市':410900,'許昌市':411000,'漯河市':411100,'三門峽市':411200,'南陽市':411300,'商丘市':411400,'信陽市':411500,'周口市':411600,'駐馬店市':411700,'濟源市':419001,'武漢市':420100,'黃石市':420200,'十堰市':420300,'宜昌市':420500,'襄陽市':420600,'鄂州市':420700,'荊門市':420800,'孝感市':420900,'荊州市':421000,'黃岡市':421100,'咸寧市':421200,'隨州市':421300,'恩施土家族苗族自治州':422800,'仙桃市':429004,'潛江市':429005,'天門市':429006,'神農架林區':429021,'長沙市':430100,'株洲市':430200,'湘潭市':430300,'衡陽市':430400,'邵陽市':430500,'岳陽市':430600,'常德市':430700,'張家界市':430800,'益陽市':430900,'郴州市':431000,'永州市':431100,'懷化市':431200,'婁底市':431300,'湘西土家族苗族自治州':433100,'廣州市':440100,'韶關市':440200,'深圳市':440300,'珠海市':440400,'汕頭市':440500,'佛山市':440600,'江門市':440700,'湛江市':440800,'茂名市':440900,'肇慶市':441200,'惠州市':441300,'梅州市':441400,'汕尾市':441500,'河源市':441600,'陽江市':441700,'清遠市':441800,'東莞市':441900,'中山市':442000,'潮州市':445100,'揭陽市':445200,'云浮市':445300,'南寧市':450100,'柳州市':450200,'桂林市':450300,'梧州市':450400,'北海市':450500,'防城港市':450600,'欽州市':450700,'貴港市':450800,'玉林市':450900,'百色市':451000,'賀州市':451100,'河池市':451200,'來賓市':451300,'崇左市':451400,'海口市':460100,'三亞市':460200,'三沙市':460300,'儋州市':460400,'五指山市':469001,'瓊海市':469002,'文昌市':469005,'萬寧市':469006,'東方市':469007,'定安縣':469021,'屯昌縣':469022,'澄邁縣':469023,'臨高縣':469024,'白沙黎族自治縣':469025,'昌江黎族自治縣':469026,'樂東黎族自治縣':469027,'陵水黎族自治縣':469028,'保亭黎族苗族自治縣':469029,'瓊中黎族苗族自治縣':469030,'重慶市':500000,'成都市':510100,'自貢市':510300,'攀枝花市':510400,'瀘州市':510500,'德陽市':510600,'綿陽市':510700,'廣元市':510800,'遂寧市':510900,'內江市':511000,'樂山市':511100,'南充市':511300,'眉山市':511400,'宜賓市':511500,'廣安市':511600,'達州市':511700,'雅安市':511800,'巴中市':511900,'資陽市':512000,'阿壩藏族羌族自治州':513200,'甘孜藏族自治州':513300,'涼山彝族自治州':513400,'貴陽市':520100,'六盤水市':520200,'遵義市':520300,'安順市':520400,'畢節市':520500,'銅仁市':520600,'黔西南布依族苗族自治州':522300,'黔東南苗族侗族自治州':522600,'黔南布依族苗族自治州':522700,'昆明市':530100,'曲靖市':530300,'玉溪市':530400,'保山市':530500,'昭通市':530600,'麗江市':530700,'普洱市':530800,'臨滄市':530900,'楚雄彝族自治州':532300,'紅河哈尼族彝族自治州':532500,'文山壯族苗族自治州':532600,'西雙版納傣族自治州':532800,'大理白族自治州':532900,'德宏傣族景頗族自治州':533100,'怒江傈僳族自治州':533300,'迪慶藏族自治州':533400,'拉薩市':540100,'日喀則市':540200,'昌都市':540300,'林芝市':540400,'山南市':540500,'那曲市':540600,'阿里地區':542500,'西安市':610100,'銅川市':610200,'寶雞市':610300,'咸陽市':610400,'渭南市':610500,'延安市':610600,'漢中市':610700,'榆林市':610800,'安康市':610900,'商洛市':611000,'蘭州市':620100,'嘉峪關市':620200,'金昌市':620300,'白銀市':620400,'天水市':620500,'武威市':620600,'張掖市':620700,'平涼市':620800,'酒泉市':620900,'慶陽市':621000,'定西市':621100,'隴南市':621200,'臨夏回族自治州':622900,'甘南藏族自治州':623000,'西寧市':630100,'海東市':630200,'海北藏族自治州':632200,'黃南藏族自治州':632300,'海南藏族自治州':632500,'果洛藏族自治州':632600,'玉樹藏族自治州':632700,'海西蒙古族藏族自治州':632800,'銀川市':640100,'石嘴山市':640200,'吳忠市':640300,'固原市':640400,'中衛市':640500,'烏魯木齊市':650100,'克拉瑪依市':650200,'吐魯番市':650400,'哈密市':650500,'昌吉回族自治州':652300,'博爾塔拉蒙古自治州':652700,'巴音郭楞蒙古自治州':652800,'阿克蘇地區':652900,'克孜勒蘇柯爾克孜自治州':653000,'喀什地區':653100,'和田地區':653200,'伊犁哈薩克自治州':654000,'塔城地區':654200,'阿勒泰地區':654300,'石河子市':659001,'阿拉爾市':659002,'圖木舒克市':659003,'五家渠市':659004,'北屯市':659005,'鐵門關市':659006,'雙河市':659007,'可克達拉市':659008,'昆玉市':659009,'臺灣省':710000,'香港特別行政區':810000,'澳門特別行政區':820000}ProvinceCode = {'北京市':110000,'天津市':120000,'河北省':130000,'山西省':140000,'內蒙古自治區':150000,'遼寧省':210000,'吉林省':220000,'黑龍江省':230000,'上海市':310000,'江蘇省':320000,'浙江省':330000,'安徽省':340000,'福建省':350000,'江西省':360000,'山東省':370000,'河南省':410000,'湖北省':420000,'湖南省':430000,'廣東省':440000,'廣西自治區':450000,'海南省':460000,'重慶市':500000,'四川省':510000,'貴州省':520000,'云南省':530000,'西藏自治區':540000,'陜西省':610000,'甘肅省':620000,'青海省':630000,'寧夏自治區':640000,'新疆自治區':650000,'臺灣省':710000,'香港特別行政區':810000,'澳門特別行政區':820000}代碼
這個代碼運行的話可以直接獲取一月份、二月份的數據。三月份由于才過了兩天,我就打上了#,因為我有強迫癥,三月份到時候再搞。
在調用里,我們記得要調用我們寫的字典文件,調用城市編碼和省份編碼。
# -*- coding: utf-8 -*- import requests import json import time import xlrd import xlwt from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCodedef migration_all_date(areaname,classname,no,direction): #定義生成不同時期,不同城市,不同遷徙方向if no == -1 :no = CitiesCode[str(areaname)]#######創建一個workbook########workbook = xlwt.Workbook(encoding = 'utf-8') # 創建一個workbook 設置編碼worksheet = workbook.add_sheet('Sheet', cell_overwrite_ok=True) # 創建一個worksheet#################寫入行頭各城市代碼及其城市名###############if direction == 'in' :nameofdire = '遷入來源地'if direction == 'out':nameofdire = '遷出目的地'CitiesOrder = {} #存放城市序號的空字典worksheet.write(0 , 0 , label='城市代碼') #寫入行頭worksheet.write(0 , 1 , label=str(nameofdire)) #寫入行頭times = 1for key , value in CitiesCode.items():worksheet.write(times , 0 , label=str(value)) #寫入城市代碼worksheet.write(times , 1 , label=str(key)) #寫入城市名CitiesOrder[str(key)] = times #寫入城市序號字典 times += 1########################設定日期##############################datelist = [] #日期列表counter_data = 2 #日期計數器for date1 in range(20200101,20200132): #一月份datelist.append(date1)for date2 in range(20200201,20200230): #二月份datelist.append(date2)for date3 in range(20200301,20200302): #三月份datelist.append(date3)for date in datelist: #遍歷所有日期datename = datetime.sleep(1) url=f'http://huiyan.baidu.com/migration/cityrank.jsonp?dt={classname}&id={no}&type=move_{direction}&date={date}'print(url)response=requests.get(url, timeout=2) #發出請求并json化處理time.sleep(1) r=response.text[4:-1] #去頭去尾data_dict=json.loads(r) #字典化if data_dict['errmsg']=='SUCCESS':data_list=data_dict['data']['list']time.sleep(1)################寫入###############worksheet.write(0 , counter_data , label=datename) #寫入表頭————日期for a in range(len(CitiesCode)):worksheet.write(a+1 , counter_data , label=0) #先把當前日期下該列所有城市值置0############獲取數據###########for i in range (len(data_list)):city_name=data_list[i]['city_name'] #城市名value=data_list[i]['value'] #當日遷徙量所占百分比值##############寫入#############worksheet.write(CitiesOrder[str(city_name)] , counter_data , label=value) #查找城市序號字典,在對應的行里寫入相應的值counter_data += 1 #日期計數器自加一workbook.save(f"{areaname}-{nameofdire}.xls") #保存def circu_exe_direction(areaname,classname,no):mukous = ['in','out']for mukou in mukous:migration_all_date(areaname,classname,no,mukou)print(str(areaname)+'---','完成')if __name__=="__main__":circu_exe_direction('泰安市','city',-1)circu_exe_direction('威海市','city',-1)circu_exe_direction('昌吉回族自治州','city',-1)circu_exe_direction('福建省','province',350000)circu_exe_direction('湖北省','province',420000)circu_exe_direction('北京市','province',110000)circu_exe_direction('全國','country',0)print('全部完成')我可能需要重點說明一下這個函數migration_all_date(areaname,classname,no,direction),areaname是給你輸出的xls文件命名的;classname是填url的;no是城市編碼,如果是城市的話就填-1就行了,它就會自己去字典里找,避免手殘輸錯,如果是省份的話就得手動輸入,direction是遷徙方向,因為一個城市有兩個遷徙方向(遷入和遷出),所以會生成兩個xls表。
因為還要手動填direction好麻煩,所以我就又加了circu_exe_direction(areaname,classname,no),具體用法如下。
如果要獲取市的數據,直接就circu_exe_direction('泰安市','city',-1)就行了,最后數字填-1它就自己去字典里查對應的城市編碼。另外名字一定要填官方的名字,不能多字少字,不然字典找不到,或者可以事先看看字典里怎么寫的,反正我按省份分行的,很好查。
如果是省的話,就需要circu_exe_direction('福建省','province',350500),中間要改成province(直轄市也需要改成province),最后的編碼要手動輸入,不知道編碼的百度一下就行。
如果要獲取全國數據的話,就需要circu_exe_direction('全國','country',0),注意中間變成了country。
編輯日志
3月7日:修正了字典里 永州市 的城市編碼。
3月8日:在“準備——城市編碼”部分添加了省份編碼,并在代碼部分添加了相關的模塊。
系列文章
【Python】基于Python的百度遷徙2——遷徙規模指數(附代碼)
【Python】基于Python的百度遷徙3——城內出行強度(附代碼)
【Python】基于Python的百度遷徙4——上班和休閑指數(附代碼)
-----------------------分割線(以下是乞討內容)-----------------------
總結
以上是生活随笔為你收集整理的【Python】基于Python的百度迁徙1——迁入、迁出数据(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net Core 3.0依赖注入替换
- 下一篇: python123第三周测验答案_pyt