【Python】基于Python的百度迁徙2——迁徙规模指数(附代码)
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]即可。
目錄
- 簡介
- 效果展示
- 準備——城市編碼
- 代碼(舊版本—xlwt)
- 代碼(新版本—xlsxwriter)
- 編輯日志
- 系列文章
簡介
百度遷徙 :百度遷徙
不多逼逼,相關的自己了解。趁這幾天比較好抓取數據,需要的數據就趕緊抓抓抓。
效果展示
本文的數據主要是來自百度遷徙里面的遷徙規模指數,如下圖。
本文提供的代碼可以批量抓取數據,如抓取所有城市級別的遷入規模指數放進一個表格里,遷出規模指數放進另一個表格里,這樣。或者你也可以設定抓取所有省份級別的數據。如下圖,我分別按全國級別、省份級別、城市級別抓取,共獲得五個表格,為什么是五個呢,因為全國的數據沒有分遷入遷出,按照百度遷徙的說法是“全國為總體遷徙規模,不區分遷入或遷出”。當然也可以通過自定義字典來抓取你想要的城市,具體可參考第三部分“準備——城市編碼”。
先展示一波抓取后的數據,各位看官看看是不是自己需要的,如下圖。
因為上上圖的遷徙規模指數的曲線有和去年農歷同期對比,所以我就連去年的指數也抓取了,第一行是日期,去年的日期在前面,今年的在后面,你越晚抓取,今年的日期就越多。
準備——城市編碼
城市編碼和我的上一篇文章一樣,可以直接參考。
代碼(舊版本—xlwt)
記得調用相關的城市編碼和省份編碼數據。
# -*- coding: utf-8 -*- import requests #導入請求模塊 import json #導入json模塊 import time #導入時間模塊 import xlwt from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCodedef migration_index(FileTittle,classname,direction,CodeDict): #CodeDict字典里所有城市的遷徙規模指數,以全國列表形式列出#######創建一個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='城市') #寫入行頭times = 1for key , value in CodeDict.items():worksheet.write(times , 0 , label=str(value)) #寫入城市代碼worksheet.write(times , 1 , label=str(key)) #寫入城市名CitiesOrder[str(key)] = times #寫入城市序號字典 times += 1########################開始抓取數據##############################for Area , Code in CodeDict.items():url=f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={classname}&id={Code}&type=move_{direction}'print(f'{Area}:{url}')response=requests.get(url, timeout=2) # #發出請求并json化處理time.sleep(3) r=response.text[3:-1] #去頭去尾data_dict=json.loads(r) #字典化if data_dict['errmsg']=='SUCCESS':data_list=data_dict['data']['list']counter_date = 2 #日期計數器datelist = []for date , index in data_list.items(): #按日期排序datelist.append(date)datelist.sort()for date in datelist:index = data_list[date]# print(f'{date} : {index}')worksheet.write(0 , counter_date , label=date)worksheet.write(CitiesOrder[str(Area)] , counter_date , label=index)counter_date += 1 #日期計數器自加一else:print('錯誤')workbook.save(f'{FileTittle} {nameofdire}規模指數.xls')quanguo = {'全國':0} #全國編碼if __name__=="__main__":migration_index('城市','city','in',CitiesCode)migration_index('城市','city','out',CitiesCode)print('全部完成')代碼(新版本—xlsxwriter)
# -*- coding: utf-8 -*- import requests #導入請求模塊 import json #導入json模塊 import time #導入時間模塊 import xlsxwriter from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCodedef migration_index(FileTittle,classname,direction,CodeDict): #CodeDict字典里所有城市的遷徙規模指數,以全國列表形式列出if direction == 'in' :nameofdire = '遷入'if direction == 'out':nameofdire = '遷出'#######創建一個workbook########workbook = xlsxwriter.Workbook(f'百度遷徙數據V3.1\\遷徙規模\\{FileTittle} {nameofdire}規模指數.xlsx')worksheet = workbook.add_worksheet('Sheet')#################寫入行頭各城市代碼及其城市名###############if direction == 'in' :nameofdire = '遷入'if direction == 'out':nameofdire = '遷出'CitiesOrder = {} #存放城市序號的空字典worksheet.write(0 , 0 , '城市代碼') #寫入行頭worksheet.write(0 , 1 , '城市') #寫入行頭times = 1for key , value in CodeDict.items():worksheet.write(times , 0 , str(value)) #寫入城市代碼worksheet.write(times , 1 , str(key)) #寫入城市名CitiesOrder[str(key)] = times #寫入城市序號字典 times += 1########################開始抓取數據##############################for Area , Code in CodeDict.items():url=f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={classname}&id={Code}&type=move_{direction}'print(f'{Area}:{url}')response=requests.get(url, timeout=2) # #發出請求并json化處理time.sleep(3) r=response.text[4:-1] #去頭去尾data_dict=json.loads(r) #字典化if data_dict['errmsg']=='SUCCESS':data_list=data_dict['data']['list']counter_date = 2 #日期計數器datelist = []for date , index in data_list.items(): #按日期排序datelist.append(date)datelist.sort()for date in datelist:index = data_list[date]# print(f'{date} : {index}')worksheet.write(0 , counter_date , float(date))worksheet.write(CitiesOrder[str(Area)] , counter_date , float(index))counter_date += 1 #日期計數器自加一else:print('錯誤')workbook.close()quanguo = {'全國':0} #全國編碼if __name__=="__main__":migration_index('城市','city','in',CitiesCode)migration_index('城市','city','out',CitiesCode)print('全部完成')重點說明一下這個函數,migration_index(FileTittle,classname,direction,CodeDict),FileTittle是你要設定的文件夾的名字,僅作標識區分,你要寫個狗蛋也行,自己能知道是啥就行了;classname是城市級別,如果你抓取城市級別數據就寫city,抓取省份級別就寫province,抓取全國的就寫country,這和我的上一篇文章的這個部分是一樣的;direction是遷徙方向,如果你要抓取遷入強度,就寫in,抓取遷出強度就寫out;CodeDict是需要你導入的帶有城市編碼的字典,如果想直接抓取全部城市或全部省份就直接導入我給的CitiesCode或ProvinceCode,具體參考“準備——城市編碼”部分。
編輯日志
2020年5月4日:剛才有小伙伴私信我說今天的代碼跑不了了,我看了一眼是因為數據的更新導致數據量變大了,而xlwt包寫不了255列以上的數據,所以在這里我建議今后要使用代碼且有一定條件的朋友改為調用xlsxwriter包,相關的代碼當然也要同步更改。我也在這兩天會把更新的代碼放上來。另外感謝小伙伴們的支持!
2020年5月4日:把原來的xlwt包換成了xlsxwriter包,解決了無法寫入超過255列的問題。
系列文章
【Python】基于Python的百度遷徙1——遷入、遷出數據(附代碼)
【Python】基于Python的百度遷徙3——城內出行強度(附代碼)
【Python】基于Python的百度遷徙4——上班和休閑指數(附代碼)
-----------------------分割線(以下是乞討內容)-----------------------
總結
以上是生活随笔為你收集整理的【Python】基于Python的百度迁徙2——迁徙规模指数(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络知识:为什么你家里的网速慢,看完你就
- 下一篇: 前端: 42 种前端常用布局方案,值得收