如果不用别人的数据,你能算出LuckinCoffee和StarbucksCoffee的门店数量吗?让自己计算一个准确的数值,你会用什么方法来计算一线城市的门店数量?难度有点高。你怎么知道二线城市的门店总数,甚至全国的门店数量?今天用我们的方法可以知道,瑞幸咖啡在一线城市的数量是:1634,而星巴克的数量是:1587。在看下面的答案之前,你可以想出几种方法来实现我们的目标。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,请访问这篇文章:超详细的Python安装指南进行安装。Windows环境打开Cmd(开始-运行-CMD),苹果系统环境打开Terminal(command+空格进入Terminal),准备开始输入命令安装依赖。当然,我推荐大家使用VSCode编辑器,复制本文代码,在编辑器下方的终端中安装依赖模块。多么惬意的一件事:Python编程的最佳搭档——VSCode详解指南。输入以下命令安装我们需要的依赖模块:pipinstallrequests如果看到Successfullyinstalledxxx,则安装成功。Python实战宝典后台回复即可获取本文完整数据和代码公众号:咖啡店数。2.获取门店数量如何?你有没有想过文章开头提出的问题的答案?其实很简单,就是调用地图的接口来搜索店铺。通过这种方式,我们不仅可以计算门店数量,还可以得到每家门店对应的位置,可以用于后续的数据分析:所以现在问题转化为寻找提供搜索接口的地图提供者,而且这个接口肯定是免费的,所以我找到了腾讯地图的接口:https://lbs.qq.com/只需要上去注册一个账号,申请一个Key就可以调用相关的接口,记得要申请后打开webserviceAPI,选择签名学校验证形式调用接口:2.1初始化为了使用API??,首先要初始化请求链接及其所需参数:classLocationSearch(object):def__init__(self,keyword:str):self.keyword=keywordself.key='你的Key'self.sk='你的验证sk'self.url=('https://apis.map.qq.com/ws/place/v1/search?''boundary=region({},0)&key={}&keyword={}''&page_index={}&page_size=20')Key会当你申请API权限时分配给你,当你选择签名验证时会调用sk接口分配给你。那么我们如何使用这两个数据请求接口呢?请看下面的函数:defrequest_data(self,location:str,page:int):"""请求接口数据参数:location{str}--locationpage{int}--页数Returns:{list}--该位置在该页面的数据{int}--该位置的结果总数"""#拼接链接url=self.url.format(location,self.key,self.keyword,page)#获取数字签名并签名添加到请求链接wait_sig=url.split('qq.com')[1]+str(self.sk)sig=hashlib.md5(wait_sig.encode('utf-8')).hexdigest()res=requests.get(url+'&sig='+sig)#获取数据returnpois=res.json()['data']#避开请求上限time.sleep(0.2)returnpois,res.json()['count']首先将初始化的请求链接拼接在一起,然后因为需要验签,所以我们要操作如下:GET请求分为三部分:域名,请求路径和参数,用于签名计算:请求路径:/ws/place/v1/搜索?请求参数:boundary=region({},0)&key={}&keyword={}&page_index={}&page_size=20注意{}为1要补。参数排序:按参数名升序排列(本例结果为boundary在前,key在后,如果首字母相同,则以第二个字母为准):boundary=region({},0)&key={}(....后面省略)2.签名计算(sig):请求路径+“?”+请求参数+SK进行拼接,计算拼接串md5值为签名(sig):要求:请求参数必须是没有任何编码(如urlencode)的原始数据md5("/ws/place/v1/search?boundary=region({},0)&key={}&keyword={}&page_index={}&page_size=20YourSK")计算结果类似:22dxxxxxxxxxxxxxx2b0bcc0e503。生成最终请求:将计算出的签名sig放入请求中(参数名称为:sig):https://apis.map.qq.com/ws/pl...boundary=region({},0)&key={}&keyword={}&page_index={}&page_size=20&sig=22dxxxxxxxxxxxxxx2b0bcc0e50注意:计算sig时,使用不对原始参数值进行任何编码,但最后发送时的参数需要经过url编码和最后得到返回值,其中包含所有结果的地理位置和结果数。2.2按位置返回结果的部分其实很简单,就是调用2.1的函数,然后实现分页保存变量,最后输出门店数并返回数据。defget_single_location(self,location:str):"""获取单个位置的数据参数:location{str}--location返回:{list}--该位置某个关键字的所有数据{int}--某个关键词在这个locationAllthekeywords"""page=1location_data=[]pois,total=self.request_data(location,page)forpoisitioninpois:location_data.append(poisition)#如果有多个页面while(total/20)>page:pois,_=self.request_data(location,page)forpoisitioninpois:location_data.append(poisition)page+=1print(f'{self.keyword}{location}总数storesis:{total}')returnlocation_data,total计算一线城市的结果如下:F:\\push\\20200315>pythonscrapy.py北京瑞幸咖啡门店总数:492总数上海瑞幸咖啡门店数:581广州瑞幸咖啡门店总数:301深圳瑞幸咖啡门店总数:2602.3总结resultsandsave接下来我们需要对2.2计算的各个城市的数据进行汇总,保存到json文件中,计算总和。defget_cities_data(self,cities:str):"""获取某个关键词在所有城市的数据参数:cities{list}--城市列表"""result=[]keyword_count=0forcityincities:#Get该城市所有门店及总数数据,count=self.get_single_location(city)keyword_count+=countresult.extend(data)print(f'{self.keyword}一线城市门店总数为:{keyword_count}')#exportdatawithopen(f'{self.keyword}.json','w')asmy_file:json.dump(result,my_file,ensure_ascii=False)最后可以得到一个LuckinCoffee.json文件,里面包含了每个城市的咖啡店的确切位置,并输出一个总数,这样调用就可以了:if__name__=='__main__':cities=['北京','上海','广州','深圳']loc=LocationSearch('瑞幸咖啡')loc.get_cities_data(cities)loc=LocationSearch('星巴克咖啡')loc.get_cities_data(cities)F:\\push\\20200315>pythonscrapy.py瑞幸咖啡总数北京店是:492瑞熙ngCoffee上海门店总数:581瑞幸咖啡广州门店总数:301瑞幸咖啡深圳门店总数:260一线城市瑞幸咖啡门店总数:1634北京星巴克门店总数:380总数上海星巴克门店总数:797家广州星巴克门店总数深圳星巴克门店总数:209家一线城市星巴克门店总数:1587家瑞幸咖啡在一线城市的门店比星巴克还多。不愧是给资本主义国家割韭菜,造福中国人民的企业!3.扩张如文章开头所说,如果需要计算每个城市的咖啡店数量,其实很简单。我们可以调用如下接口请求腾讯地图所有的行政区数据,获取所有城市的名称:https://apis.map.qq.com/ws/di...不过我已经甩了一个,还有大家在Python实战宝典后台回复公众号:咖啡店的数量可以用这个,只需要读取csv文件提取所有城市名称,然后放入cities变量中进行计算,如下代码所示:if__name__=='__main__':withopen('cities.csv','r',encoding='utf-8')ascsvfile:reader=csv.reader(csvfile)cities=[row[0]forrowinreader]loc=LocationSearch('瑞幸咖啡')loc.get_cities_data(cities)loc=LocationSearch('星巴克咖啡')loc.get_cities_data(cities)但是,请注意一些特殊情况。例如,当城市没有数据时,接口可能不会返回日期数据。这时候应该使用字典的get方法来处理:#pois=res.json()['data']pois=res.json().get('data',[])但是,如果你想算全国数据,这个方法不靠谱,因为无法避免假店的存在,假店也会被封杀腾讯地图上有记录,一线城市严管,假店比较少见,可以用这种方法计算。这是我们文章的结尾。如果喜欢我们今天的Python实战教程,请继续关注我们。如果对您有帮助,请在下方点赞/观看。有什么问题可以在下方评论留言,我们会耐心解答!Python实战宝典不只是合集欢迎关注公众号:Python实战宝典原文来自Python实战宝典:Python计算开店最多的瑞幸与星巴克
