闲来无事,爬取大学城周边的饿了么夜晚外卖信息打发时间。
完整代码放在Github上:https://github.com/why19970628/Python_Crawler/tree/master/ele_me
数据来源平台:饿了么
地点选择:新乡大学城(夜晚)
抓取地址:https://www.ele.me/place/wtw0tgvd7yr
抓取数据:店名(name)和店的口味(flavors)。
1.首先观察网页结构,需要登录饿了么官网,F12查看
找到以restaurants开头的信息,并双击打开
2.这时,可以观察到网页的结构信息,这时就比较简单了,
观察网页URL,发现‘offset=’在控制网页页数,limit为24。
def Getdata(page): # 爬虫
print('正在爬取第{}页'.format(page/24))
url = 'https://www.ele.me/restapi/shopping/restaurants?extras%5B%5D=activities&geohash=ww30b9kh3zmq&latitude=35.295722&limit=24&longitude=113.933798&offset='+str(page)+'&terminal=web'
print(url)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36",
"cookie": "你的cookie信息"}
html = requests.get(url, headers=headers)
content = re.findall(r'"flavors":.*?,"next_business_time"', html.text) # 用正则获取包含数据的那部分
print(content)
for con in content:
#print(con)
jsonstring = "{" + con.replace(',"next_business_time"', "}") # 完善格式,使其成为准确的json格式
#print(jsonstring)
jsonobj = json.loads(jsonstring)
restaurant_id = jsonobj["id"]
restaurant_name = jsonobj["name"].encode("gbk", "ignore").decode("gbk")
print(restaurant_name)
flavors = jsonobj["flavors"]
restaurant_type = []
for f in flavors: # 有些flavors中只有一个值,有些有2个,所以要for循环
restaurant_type.append(f["name"])
restaurants.append(restaurant_name) # 用于后面词云图
foodtype.append(restaurant_type) # 用于后面条形图
data.append([restaurant_id, restaurant_name, restaurant_type])
with open("elemedata.csv", "w", newline="") as f: # 保存数据到本地
writer = csv.writer(f)
writer.writerow(["restaurant_id", "restaurant_name", "restaurant_type"])
for d in data:
writer.writerow(d)
return restaurants, foodtype # 返回值应用到下面2个函数
爬取结果如下
csv文件:
外卖种类信息直方图
除简餐外,炸鸡炸串,盖浇饭、烧烤是夜间外卖三巨头,果汁奶茶和川湘菜,面食也是大家的心头好。