python爬取餓了麼數據(2)

上一節我們去到了關鍵字 查詢得到的附近商圈地點,

這一節我們查詢地點附近的所有商家的月銷售情況


1、網頁信息


在上一節展現的那個網頁隨便選取一處地點,就會跳轉到上面的頁面,

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

分析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:

  1. accept:application/json, text/plain, */*
    accept-encoding:gzip, deflate, sdch, br
    accept-language:zh-CN,zh;q=0.8
    cookie:ubt_ssid=plds7ye19rj2rghg3oaar8hkt89yy7f1_2017-02-07; _utrace=ac9073c509bedb74b28a1482bd95a9d8_2017-02-07
    origin:https://www.ele.me
    referer:https://www.ele.me/place/wx4ffdh2dge
    user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36

url請求參數:

  1. extras[]:activities
    geohash:wx4ffdh2dge
    latitude:39.86949
    limit:24
    longitude:116.48301
    offset:24
    terminal:web
分析url請求和請求參數 也可以發現,“?”後面的內容是編碼之後的請求參數,

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

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

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


所以我們的策略是

構造header請求,

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

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

2、代碼如下

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

#https://mainsite-restapi.ele.me/v2/pois?
#extras%5B%5D=count&geohash=wx4g0bmjetr7&keyword=%E6%9C%9D%E9%98%B3&limit=20&type=nearby
import urllib.request
import os
import json
import time
from  openpyxl  import Workbook
from  openpyxl  import load_workbook

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

keywords=[]

targetDir ="D:\worksapce\python\爬蟲餓了麼"  #文件保存路徑
def excelName():#根據日期生成文件
    if not os.path.isdir(targetDir):  
        os.mkdir(targetDir)
    excelName=str(time.strftime ("%Y-%m-%d")+".xlsx")
    completePath=targetDir+"\\"+excelName
    return completePath

def reqsetting():#初始化url請求,需要實時替換的是extral  和  header裏的referer
    weburl = "https://mainsite-restapi.ele.me/shopping/restaurants?"
    extra1="extras%5B%5D=activities&geohash=wx4g56v1d2m&latitude=39.91771&limit=24&longitude=116.51698&offset=0&terminal=web"
    webheaders={
    "Accept":"application/json, text/plain, */*",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Connection":"keep-alive",
    "Cookie":"ubt_ssid=plds7ye19rj2rghg3oaar8hkt89yy7f1_2017-02-07; _utrace=ac9073c509bedb74b28a1482bd95a9d8_2017-02-07",
    "Host":"mainsite-restapi.ele.me",
    "Origin":"https://www.ele.me",
    #"Referer":"https://www.ele.me/place/wx4g56v1d2m",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
        }
    req=urllib.request.Request(url=weburl,headers=webheaders)
    
    return req

def write2Excel(jsondata,title):#根據不同的商圈地點寫入數據,每個商圈地點佔用excel 的一個sheet
    fileName=excelName()
    isexit="false"
    if(os.path.exists(fileName)):
        wb=load_workbook(fileName)
        isexit="true"
    else :
       wb=Workbook()
    if(wb.__contains__(title)):
        ws=wb[title]
        ws.append([])
    else:
        ws=wb.create_sheet(title)
        ws.column_dimensions["A"].width =10.0
        ws.column_dimensions["B"].width =40.0
        ws.column_dimensions["C"].width =60.0
        ws.column_dimensions["D"].width =10.0
        ws.column_dimensions["E"].width =18.0
        ws.column_dimensions["F"].width =10.0
        ws.append(["ID","店名","地址","距離","人均消費","月銷售額"])
    

    for i  in range(len(jsondata)):
        row=jsondata[i]
        #print(type(row))
        if("average_cost" not  in row.keys()):
            row["average_cost"]="無人均消費數據"
        ws.append([row["id"],row["name"],row["address"],row["distance"],row["average_cost"],row["recent_order_num"]])

    wb.save(fileName)
    
def readKeyWordFromExcel():#從上一節生成的keywordExcel 中加載商圈地點
    fileName=keywordExcel
    if(os.path.exists(fileName)):
        wb=load_workbook(fileName)
    else:
        return
    for title in wb.sheetnames:
        ws=wb[title]
        for i in range(2,ws.max_row):
            infos={}#商圈地點數據,爲生成請求參數做準備
            infos["name"]=ws.cell(row=i,column=4).value
            print("正在爬取 %s 附近外賣商家的數據..." % infos["name"])
            infos["ID"]=ws.cell(row=i,column=1).value
            infos["geohash"]=ws.cell(row=i,column=3).value
            infos["longitude"]=ws.cell(row=i,column=7).value
            infos["latitude"]=ws.cell(row=i,column=8).value
            if(infos["geohash"]):
                req=reqsetting()
                req.add_header("Refer","https://www.ele.me/place/%s" % infos["geohash"])#修改請求頭的refer
                newUrl=req.get_full_url()
                offset=0
                contentBytes=""
                while(contentBytes!="[]"):#構造請求參數,基本上只修改offset 偏移量數據
                    params={
                    "extras[]":"activities",
                    "geohash":"%s" % infos["geohash"],
                    "latitude":"%s" % infos["latitude"],
                    "longitude":"%s" % infos["longitude"],
                    "terminal":"web",
                    "limit":24,
                    "offset":offset
                       }
                    params=urllib.parse.urlencode(params)#請求參數編碼
                    req.full_url=newUrl+params   #重新生成url請求
                    webpage=urllib.request.urlopen(req)
                    contentBytes = webpage.read().decode("utf-8")
                    if(contentBytes!="[]"):
                        jsondata=json.loads(contentBytes)        
                        write2Excel(jsondata,infos["name"])#將請求數據寫入excel中
                        offset+=24 #便宜
                    else :
                        break
                
        
if __name__ == '__main__':  #程序運行入口
    offset=0;
    readKeyWordFromExcel()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章