阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

今天收到一個消息,阿里95億美元拿下餓了麼。阿里巴巴已經簽訂收購協議,聯合螞蟻金服用95億美元兌餓了麼全資收購。現在我用Python抓取餓了麼的外賣數據。

■1、環境介紹:

win10 64bit

python 3.6.0

openpyxl 2.4.2(操作excel)

■、目的

根據區域統計該區域附近的外賣商家總數、和所有商家的月銷售情況

■3、網頁截圖

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

首先我們通過這張圖能發現

URL請求是:https://mainsite-restapi.ele.me/v2/pois?extras%5B%5D=count&geohash=wx4g0bmjetr7&keyword=%E6%9C%9D&limit=20&type=nearby

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

分析請求參數和url 就不難發現,其實URL 請求 “?” 後面的內容 其實是編碼之後的請求參數

這樣,我們抓取該頁面的數據就很好弄了,

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

■首先構造headers

■其次,我們自己維護一個關鍵字集合,

■通過遍歷,構造不同的請求參數,

■發送請求,獲取數據,並將數據保存在excel 中

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

輸入圖片描述

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

我們來看一下網頁信息:

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

網頁隨便選取一處地點,就會跳轉到上面的頁面,

我們向下滑動鼠標的時候,網頁是動態加載數據的,我們打開這個網頁的時候,首先清空所有的頁面請求,然後滑動鼠標,可以看到網頁會自動去請求數據,

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

分析url可以發現,

url請求是:

https://mainsite-restapi.ele.me/shopping/restaurants?extras%5B%5D=activities&geohash=wx4ffdh2dge&latitude=39.86949&limit=24&longitude=116.48301&offset=24&terminal=web

header:

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息

請分析url請求和請求參數 也可以發現,“?”後面的內容是編碼之後的請求參數,

limit參數 可以理解成,每次加載的數據條數是24條

至於offset,我們滾動幾次鼠標滑輪,就會發現,offset 是以24為基礎遞增的,0,24,48,72,96.....

這樣我們需要循環取數據,直到該商圈地點附近沒有外賣商家信息,進行下一個商圈地點的數據爬取

所以我們的策略是構造header請求,

根據上一節存儲到excel 的數據,構造請求參數,

循環發送請求,每次設定不同的偏移量(offset),取得數據,寫入新的excel 中

■2、代碼如下:

  1. #爬餓了麼外賣數據--區域下各個地點的商家集合

  2. #https://mainsite-restapi.ele.me/v2/pois?

  3. #extras%5B%5D=count&geohash=wx4g0bmjetr7&keyword=%E6%9C%9D%E9%98%B3&limit=20&type=nearby

  4. import urllib.request

  5. import os

  6. import json

  7. import time

  8. from openpyxl import Workbook

  9. from openpyxl import load_workbook

  10. keywordExcel="D:\worksapce\python\爬蟲餓了麼\\keyword.xlsx"

  11. keywords=[]

  12. targetDir ="D:\worksapce\python\爬蟲餓了麼"#文件保存路徑

  13. def excelName():#根據日期生成文件

  14. ifnot os.path.isdir(targetDir):

  15. os.mkdir(targetDir)

  16. excelName=str(time.strftime ("%Y-%m-%d")+".xlsx")

  17. completePath=targetDir+"\"+excelName

  18. return completePath

  19. def reqsetting():#初始化url請求,需要實時替換的是extral 和 header裡的referer

  20. weburl = "https://mainsite-restapi.ele.me/shopping/restaurants?"

  21. extra1="extras%5B%5D=activities&geohash=wx4g56v1d2m&latitude=39.91771&limit=24&longitude=116.51698&offset=0&terminal=web"

  22. webheaders={

  23. "Accept":"application/json, text/plain, */*",

  24. "Accept-Language":"zh-CN,zh;q=0.8",

  25. "Connection":"keep-alive",

  26. "Cookie":"ubt_ssid=plds7ye19rj2rghg3oaar8hkt89yy7f1_2017-02-07; _utrace=ac9073c509bedb74b28a1482bd95a9d8_2017-02-07",

  27. "Host":"mainsite-restapi.ele.me",

  28. "Origin":"https://www.ele.me",

  29. #"Referer":"https://www.ele.me/place/wx4g56v1d2m",

  30. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"

  31. }

  32. req=urllib.request.Request(url=weburl,headers=webheaders)

  33. return req

  34. def write2Excel(jsondata,title):#根據不同的商圈地點寫入數據,每個商圈地點佔用excel 的一個sheet

  35. fileName=excelName()

  36. isexit="false"

  37. if(os.path.exists(fileName)):

  38. wb=load_workbook(fileName)

  39. isexit="true"

  40. else :

  41. wb=Workbook()

  42. if(wb.__contains__(title)):

  43. ws=wb[title]

  44. ws.append([])

  45. else:

  46. ws=wb.create_sheet(title)

  47. ws.column_dimensions["A"].width =10.0

  48. ws.column_dimensions["B"].width =40.0

  49. ws.column_dimensions["C"].width =60.0

  50. ws.column_dimensions["D"].width =10.0

  51. ws.column_dimensions["E"].width =18.0

  52. ws.column_dimensions["F"].width =10.0

  53. ws.append(["ID","店名","地址","距離","人均消費","月銷售額"])

  54. for i in range(len(jsondata)):

  55. row=jsondata[i]

  56. #print(type(row))

  57. if("average_cost"notin row.keys()):

  58. row["average_cost"]="無人均消費數據"

  59. ws.append([row["id"],row["name"],row["address"],row["distance"],row["average_cost"],row["recent_order_num"]])

  60. wb.save(fileName)

  61. def readKeyWordFromExcel():#從上一節生成的keywordExcel 中加載商圈地點

  62. fileName=keywordExcel

  63. if(os.path.exists(fileName)):

  64. wb=load_workbook(fileName)

  65. else:

  66. return

  67. for title in wb.sheetnames:

  68. ws=wb[title]

  69. for i in range(2,ws.max_row):

  70. infos={}#商圈地點數據,為生成請求參數做準備

  71. infos["name"]=ws.cell(row=i,column=4).value

  72. print("正在爬取 %s 附近外賣商家的數據..." % infos["name"])

  73. infos["ID"]=ws.cell(row=i,column=1).value

  74. infos["geohash"]=ws.cell(row=i,column=3).value

  75. infos["longitude"]=ws.cell(row=i,column=7).value

  76. infos["latitude"]=ws.cell(row=i,column=8).value

  77. if(infos["geohash"]):

  78. req=reqsetting()

  79. req.add_header("Refer","https://www.ele.me/place/%s" % infos["geohash"])#修改請求頭的refer

  80. newUrl=req.get_full_url()

  81. offset=0

  82. contentBytes=""

  83. while(contentBytes!="[]"):#構造請求參數,基本上只修改offset 偏移量數據

  84. params={

  85. "extras[]":"activities",

  86. "geohash":"%s" % infos["geohash"],

  87. "latitude":"%s" % infos["latitude"],

  88. "longitude":"%s" % infos["longitude"],

  89. "terminal":"web",

  90. "limit":24,

  91. "offset":offset

  92. }

  93. params=urllib.parse.urlencode(params)#請求參數編碼

  94. req.full_url=newUrl+params #重新生成url請求

  95. webpage=urllib.request.urlopen(req)

  96. contentBytes = webpage.read().decode("utf-8")

  97. if(contentBytes!="[]"):

  98. jsondata=json.loads(contentBytes)

  99. write2Excel(jsondata,infos["name"])#將請求數據寫入excel中

  100. offset+=24#便宜

  101. else :

  102. break

  103. if __name__ == '__main__': #程序運行入口

  104. offset=0;

  105. readKeyWordFromExcel()

點擊此處輸入圖片描述

阿里95億美元拿下餓了麼,我用python抓取了餓了麼外賣數據信息


分享到:


相關文章: