如何写出《黄焖鸡米饭是怎么火起来的》这样的文章

去年开始研究做爬虫,搞了一套分布式的爬虫系统,主要目标是帮别人做数据采集。后来看到黄焖鸡米饭是怎么火起来的? - 何明科的回答,进而关注了《数据冰山》,发现里面的大数据分析的文章都相当有意思,图表也一个比一个专业。

我当时的表情大约是这样的:

我的天哪,这么神奇吗? 放下手机,操起键盘,正准备也搞上一篇 “大数据分析:郭德纲和女演员的相爱相杀之后,wuli涛涛是如何火起来的”。后来转念一想,这不是赤果果的抄袭了,妈妈是怎么教导我的。再说了,以我这样的实力,写了这样的文章,以后别人还怎么写呢?

俗话说得好:授人以鱼不如授人以渔,独乐乐不如众乐乐。不如我们就以黄焖鸡米饭为例,给大家讲讲如何才能写出这样一篇图文并茂的分析文章来吧。

先来一段硬广:本文所有代码,都需要运行在本人搭建的神箭手云爬虫框架上,打算完全自己写爬虫的同学,领会精神即可。

·        数据来源分析

首先需要黄焖鸡米饭门店的创建时间,来分析黄焖鸡米饭随时间的增长,其次需要门店的地域信息来分析不同地域黄焖鸡米饭的增长情况。

分析大众点评的商户门店信息,可以在商户的贡献榜页面找到相关的信息,如下图:

这里需要对数据作几个近似处理:

  1. 仅选取商户名中包含"黄焖鸡米饭"的门店
  2. 将商户的添加时间近似看作门店的创建时间
  3. 大众点评无法查到已经关闭的商户,所以这里不考虑门店的关闭,仅选取现存的门店
  • 开始写爬虫

上面分析了对数据的需求,下面就开始动手写爬虫爬取数据啦~

熟悉爬虫的人都知道,一个爬虫的基本工作流程是:

  1. 首先挑选一部分种子URL(也可以叫入口URL),并放入到待爬队列中
  2. 从待爬队列中取出一个URL,下载内容并从中抽取信息,同时发现新URL,并加入到待爬队列中。重复此步骤,直至待爬队列为空。

上面加粗了3个重点,种子URL、抽取信息和发现新URL。

  • 种子URL

也可以叫入口URL,爬虫以这些URL为入口,以某种规则发现新的URL,最终爬遍所有想要的网页。为了爬取高效,我决定直接用大众点评的搜索,选择大众点评的搜索结果页作为入口URL,爬取结果页的所有商户并筛选后作为样本数据。大众点评的搜索也是分区域的,要把所有区域的搜索结果页都作为入口URL,形如

http://www.dianping.com/search/keyword/{region_id}/0_%E9%BB%84%E7%84%96%E9%B8%A1%E7%B1%B3%E9%A5%AD

其中region_id从1到2323(很容易可以发现此范围内是中国的区域,数字再大就到国外了,如果多了或者少了请告诉我)。

  • 抽取信息

从网页中抽取信息,最常用的是xpath,这里我们需要抽取商户id(防止重复),商户名称(过滤掉不含黄焖鸡米饭的),创建时间,区域名称,省份是没有的,需要根据区域名称得到。xpath可以结合Chrome的开发者工具来写,并通过xpath插件来验证,下面给出这几项数据的xpath:

商户id,抽取的数据中包含其他商户id,需要进一步处理来得到id

//div[contains(@class,‘shop-review-wrap‘)]/div/h3/a/@href

商户名称

//div[contains(@class,‘shop-review-wrap‘)]/div/h3/a/text()

创建时间,需要进一步字符串处理后得到时间

//div[contains(@class,‘block raw-block‘)]/ul/li[1]/span

区域名称,同样文本需要处理

//div[@class=‘breadcrumb‘]/b[1]/a/span/text()

  • 发现新URL

URL的发现规则不是必须配置的,但是配置之后,可以大大提高爬虫的速率。对于大众点评这样规整的列表页+详情页,配置好列表页的url规则和详情页的url规则,爬虫的目标就很明确,爬取速率杠杠的。一般这种规则用正则来表示,对于这里的爬虫,列表页规则为

http://www.dianping.com/search/keyword/\\d+/0_.*

详情页规则为

http://www.dianping.com/shop/\\d+/editmember

另外,大众点评限制了IP的访问频率,这里可以把降低爬取速率,或是使用代理。如果你使用的是神箭手云爬虫,则代码如下

configs.enableProxy = true;

自己写爬虫的同学,请自行Google代理IP,此处不再赘述。

  • 用爬取的数据配置出图表

折腾出了这么多代码,约摸着看到这的都是真爱了,那么赶紧看看我们的成果吧:

总共爬取到14000多条数据,现在就以这些数据作为样本来分析(下面涉及到的图表的设置,都是在神箭手云平台上操作完成的)。

1. 黄焖鸡米饭的整体增长

像原文里的分析一样,以季度为单位,作出2012年至2016年,黄焖鸡米饭的门店数随时间的增长情况。先看下出来的图:

上图中,柱形绘制的是各个季度门店的新增数,折线绘制的是截止到某个季度的总门店数。对于柱形图/折线图,首先设置X轴和Y轴。Y轴比较简单,就是门店数,值类型是value,一个Y轴就可以了,不需要第二个Y轴;X轴是按季度划分的,值类型是category,需要在爬取结果的create_time字段上作区间划分,这里展示的"新增"和"总店数"两个数据,它们的统计区间是不一样的,"新增"统计的是create_time落在某个季度的门店数,而"总店数"统计的是create_time在某个季度之前的门店数,所以这里的区间划分需要定义两个。

X轴和Y轴定义好之后,开始定义数据。

新增数展示为柱形图。X轴的字段选择create_time,在create_time上划分区间,这里通过简单的字符串比较就可以划分出季度区间,比如"2013-Q2",定义它的最小值为"2013-04-01",最大值为"2013-07-01"。Y轴只需要对划分出的区间作count操作就可以,所以配置Y轴字段为‘*‘,操作选择计数。

总店数展示为折线图。总店数跟新增数唯一的区别就是区间划分,比如"2013-Q2",只定义它的最大值为"2013-07-01"就好了。

下图为部分设置界面。

配置完成后保存,就可以查看生成的图表了。

2. 分区域分析黄焖鸡米饭的增长

逐年观察各个省份黄焖鸡米饭门店数的增长情况,时间维度体现在多张图上,省份的数据通过中国地图的着色深浅来表示。先看效果图:

图表类型为中国地图,配置也比较简单。首先在create_time上添加过滤条件来配置年份,比如要配置2014年的地图,添加过滤条件,字段选择create_time,设置最大值为"2015-01-01";配置区域字段为province_name,数据还是计数操作,选择字段为‘*‘,操作为count。这样就会筛选出2014年底黄焖鸡米饭的门店,并以省为单位,分别统计门店个数。最后设置图例,不同门店数用不同的颜色填充,就可以作出上面的系列图。

大功告成,一碗热腾腾的黄焖鸡米饭就可以上桌了,如果想搞什么大盘鸡,小盘鸡,红烧肉,KTV啥的的,相信你都已经不在话下了吧。如果想要完整代码的,请直接私信我,为了降低这篇软文的广告密度,在这里就不贴了。

-----------------------一觉醒来决定还是贴个源码链接----------------------------------------

samples/dianping.js at master ·ShenJianShou/samples · GitHub

时间: 2024-11-08 02:43:18

如何写出《黄焖鸡米饭是怎么火起来的》这样的文章的相关文章

今天把饭倒进黄焖鸡里,同桌上楼就拉肚子

今天把饭倒进黄焖鸡里,同桌上楼就拉肚子 今日主要内容 1. 文件操作 open() 文件句柄 open()打开一个文件, 获取的是文件句柄 read() readline() readlines() write() for line in f: 遍历文件中的内容 路径的问题: 1. 绝对路径 从磁盘根目录寻找 2. 相对路径 从当前程序运行的文件夹内寻找 2. 文件操作的相关模式Mode r: 只读 w: 只写 a: 追加 r+: w+: a+: 非文本文件 rb wb ab r+b w+b a

【IT界的厨子】家常版本的黄焖鸡

前言: 周末在家,闲来无事, 使用简单的食材,满足家人的味蕾,做出秒杀馆子的黄焖鸡(我是这么认为的).虽然没有厨师的手艺,但为家人做饭,也是一种幸福. 用料: 主料:老母鸡一只,要求店老板剁好 配料: 土豆       一只   姜片       若干   青椒       一只 可选:  辣椒      我家有孩子,不能吃辣,此项列为可选 调料: 老抽,生抽,盐,白糖,料酒 步骤: 1.老母鸡洗净血水  2.姜切片 3.香菇切片,青椒切条状         4.炒糖色(sha 三音),凉油放糖

如何写出兼容性很好的页面

写出好的页面前首先你要把HTML4与HTML5学会了,然后CSS,CSS3也有一定的掌握. 通常情况下,不同类型的网站都去认认真真的排版后,对前端就有一定的掌握程度,对写静态页面问题就不大了.至于个数嘛,3个完整网站以上. 提醒:如果要写出非常好的页面,js是必不可少的,这对初学前端的人来说,就有点难度了,但也别胆怯,按照学习的先后进度来学习,先学HTML+CSS,再学习HTML5+CSS3,学到一定程序后,再去接触javascript,我相信就算是自学,HTML+CSS 2个月左右,javas

【技能】使用纯CSS+html写出方向箭头,简单大方,好看

使用纯CSS+html写出方向箭头,贴出来就可以用,100%原创 <html> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <style type="text/css"> .pointsRule{ display: inline-blo

我的Java历程_写出这个数

lzJava基础进行中,今天偶然间看到的一个题目: 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字.如下代码: import java.util.*;public class Main2{ public static void main(String[] args){ String[] date = {"Ling", "Yi", "Er", "San", "Si", "Wu&q

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

写出一个缓存系统的伪代码001

/** * 写出一个缓存系统的伪代码 * @author ysloong * */ public class CacheDemo { private Map<String, Object> map = new HashMap<String, Object>(); public static void main(String[] args) { // TODO Auto-generated method stub } public synchronized Object getDat

如何写出优雅的CSS代码 ?(转)

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代

Discuz论坛写出的php加密解密处理类(代码+使用方法)

PHP加密解密也是常有的事,最近在弄相关的东西,发现discuz论坛里的PHP加密解密处理类代码,感觉挺不错,在用的时候,要参考Discuz论坛的passport相关函数,后面我会附上使用方法,先把类代码帖上来: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <?php /*