广告
  1. 代码
  2. 红宝石
  3. Rails上的Ruby

构建您的第一个Web Scraper,第3部分

在本教程中,我们将详细介绍如何提取数据,帮助器和实用程序方法如何完成其工作,以及所有拼图块是如何组合在一起的。
滚动到顶部

欢迎回到关于构建web scraper的本系列。在本教程中,我将介绍一个从我自己的播客网站抓取数据的示例。我将详细介绍我是如何提取数据的,助手和实用程序方法是如何完成它们的工作的,以及所有的拼图是如何组合在一起的。

话题

  • 删除我的播客
  • 窥探
  • 刮刀
  • 帮助方法
  • 写作帖子

删除我的播客

让我们把迄今为止所学的付诸实践。出于各种原因,我的播客进行了重新设计在|屏幕之间早该了。当我早上醒来时,有些问题让我尖叫。所以我决定建立一个全新的静态站点,用Middleman构建,用GitHub Pages托管。

我根据自己的需要调整了一个Middleman博客,然后在新设计上投入了大量时间。剩下要做的就是从我的数据库中导入内容西纳特拉应用程序,所以我需要删除现有内容并将其转移到新的静态站点。

用笨蛋的方式手工完成这项工作并不在桌面上,甚至不是一个问题,我可以依靠我的朋友Nokogiri和Mechanize为我做这项工作。你面前的是一个相当小的琐碎工作,并不太复杂,但提供了一些有趣的转折点,应该对网络浏览新手有教育意义。

下面是我的播客的两张截图。 

旧播客截图

一个旧播客的屏幕截图一个旧播客的屏幕截图一个旧播客的屏幕截图

屏幕截图新播客

新播客的屏幕截图新播客的屏幕截图新播客的屏幕截图

让我们把我们想要完成的事情分门别类。我们希望从分布在21个分页索引站点上的139集中提取以下数据:

  • 标题
  • 被采访者
  • 主题列表的子标题
  • 每集的SoundCloud曲目编号
  • 日期
  • 剧集编号
  • 节目注释中的文本
  • 来自节目注释的链接

我们反复浏览分页,让Mechanize单击某一集的每个链接。在下面的详细页面上,我们将找到上面我们需要的所有信息。使用刮取的数据,我们想填充前沿问题和每集标记文件的“正文”。

下面你可以看到我们将如何用提取的内容组成新的降价文件的预览。我想这会让你对我们面前的范围有一个很好的了解。这是我们小剧本的最后一步。别担心,我们会详细讨论的。 

定义compose_markdown

1
定义 组合_降价(选项={})
2
<<-赫里多克
---
4
标题:#{选项[:受访者]}

5
受访者:#{选项[:受访者]}

6
主题列表(_L):#{选项[:标题]}

7
标签:#{选项[:标记]}

8
声音云id:#{选项[:sc_id]}

9
日期:#{选项[:date(日期)]}

10
情节_编号:#{选项[:epiode_number]}

11
---
12


13
#{选项[:text(文本)]}

14
赫里多克
15
结束

我还想添加一些旧网站无法使用的技巧。有一个定制的、全面的标签系统对我来说至关重要。我想让听众有一个深度发现工具。因此,我需要每个受访者的标签,并将副标题拆分为标签。由于我仅在第一季就制作了139集,所以我不得不为网站的内容量变得难以梳理的时候做准备。一个带有智能推荐的深度标签系统是我们的发展方向。这使我能够保持站点的轻量级和快速性。

让我们看一看我的网站内容的完整代码。环顾四周,试着弄清正在发生的事情的大局。因为我希望你是初学者,所以我避免了太多抽象,并且在清晰方面犯了错误。我做了几次重构,目的是帮助代码清晰,但我也留下了一些细节,供您在读完本文后参考。毕竟,当你超越阅读,独自玩一些代码时,就会有高质量的学习。

在此过程中,我强烈建议您开始思考如何改进面前的代码。这将是本文末尾的最后一项任务。我的一点提示是:将大型方法分解为较小的方法始终是一个很好的起点。一旦你理解了代码的工作原理,你应该会有一段愉快的时间来磨练重构

我已经开始将一系列方法提取为小型、专注的助手。你应该能够很容易地应用我以前的文章中关于代码气味及其重构如果你现在还不明白,别担心,我们都去过那里。只要坚持下去,总有一天事情会变得更快。

完整代码

1
要求 “机械化”
2
要求 “撬”
要求 '日期'
4
5
#助手方法
6
7
#(提取方法)
8
9
定义 提取受访者(详细信息页面)
10
  受访者_选择器 = '.pepiode_sub_title跨度'
11
  详细信息页面.搜索(受访者_选择器).文本.
12
结束
13
14
定义 提取_标题(详细信息页面)
15
  标题_选择器 = “.情节_标题”
16
  详细信息页面.搜索(标题_选择器).文本.gsub公司(/[?#]/, '')
17
结束
18
19
定义 提取声音云id(详细信息页面)
20
  供应链 = 详细信息页面.iframes包含(网址:/soundcloud.com网站/).
21
  供应链.扫描(/\d{3,}/).第一
22
结束
23
24
定义 提取_显示_文本(详细信息页面)
25
  shownote_selector(显示选择器) = “#shownote_container>p”
26
  详细信息页面.搜索(shownote_selector(显示选择器))
27
结束
28
29
定义 提取器字幕(详细信息页面)
30
  副标题_选择器 = “.情节_子标题”
31
  详细信息页面.搜索(副标题_选择器).文本
32
结束
33
34
定义 提取_情节_编号(插曲字幕)
35
   = /[编号]\d*/.比赛(插曲字幕)
36
  清除索引编号()
37
结束
38
39
#(实用方法)
40
41
定义 清洁_日期(插曲字幕)
42
  字符串_日期 = /[^|]*([,])(.....)/.比赛(插曲字幕).
43
  日期.解析(字符串_日期)
44
结束
45
46
定义 内置标签(标题, 被采访者)
47
  提取的标签 = 条带管道(标题)
48
  "#{被采访者}"+ ",#{提取的标签}"
49
结束
50
51
定义 条带管道(文本)
52
  标签 = 文本.信托收据('|', ',')
53
  标签 = 标签.gsub公司(/[@?#&]/, '')
54
  标签.gsub公司(/[w\/]{2}/, '与')
55
结束
56
57
定义 清除索引编号()
58
  ..信托收据('#', '')
59
结束
60
61
定义 使……变漂亮(文本)
62
  文本.l行程.第一次旅行.信托收据(' ', '-')
63
结束
64
65
定义 提取数据(详细信息页面)
66
  被采访者 = 提取受访者(详细信息页面)
67
  标题 = 提取_标题(详细信息页面)
68
  sc_id = 提取声音云id(详细信息页面)
69
  文本 = 提取_显示_文本(详细信息页面)
70
  插曲字幕 = 提取器字幕(详细信息页面)
71
  情节_编号 = 提取_情节_编号(插曲字幕)
72
  日期 = 清洁_日期(插曲字幕)
73
  标签 = 内置标签(标题, 被采访者)
74
75
  选项 = {
76
    受访者:被采访者,
77
    标题:标题,
78
    sc_id:sc_id,
79
    文本:文本,
80
    标签:标签,
81
    日期:日期,
82
    情节_编号:情节_编号
83
  }
84
结束
85
86
定义 组合_降价(选项={})
87
<<-赫里多克
88
---
89
标题:#{选项[:受访者]}

90
受访者:#{选项[:受访者]}

91
主题列表(_L):#{选项[:标题]}

92
标签:#{选项[:标记]}

93
声音云id:#{选项[:sc_id]}

94
日期:#{选项[:date(日期)]}

95
情节_编号:#{选项[:epiode_number]}

96
---
97


98
#{选项[:text(文本)]}

99
赫里多克
100
结束
101
102
定义 写_页(链接)
103
  详细信息页面 = 链接.点击
104
105
  提取的数据 = 提取数据(详细信息页面)
106
107
  标记向下文本 = 组合_降价(提取的数据)
108
  日期 = 提取的数据[:date(日期)]
109
  被采访者 = 提取的数据[:受访者]
110
  情节_编号 = 提取的数据[:epiode_number]
111
112
  文件.打开("#{日期}-#{使……变漂亮(被采访者)}-#{情节_编号}.html.erb.md“, “w”) { |文件| 文件.(标记向下文本) }
113
结束
114
115
定义 
116
  链接范围(_R) = 1
117
  代理人 ||= 机械化.新的
118
119
  直到 链接范围(_R) == 21
120
    第页 = 代理人.得到("https://between-screens.herokuapp.com/?页面=#{链接范围(_R)}")
121
    链接范围(_R) += 1
122
123
    第页.链接[2..8].地图  |链接|
124
      写_页(链接)
125
    结束
126
  结束
127
结束
128
129

为什么我们没有需要“Nokogiri”? 机械化为我们提供了所有的刮削需求。正如我们在前一篇文章中所讨论的,Mechanize构建在Nokogiri之上,并允许我们提取内容。然而,重要的是要在第一篇文章中介绍这个gem,因为我们需要在它的基础上进行构建。

窥探

首先要做的事。在我们开始讨论代码之前,我认为有必要向您展示如何高效地检查代码在每一步的工作情况。正如您肯定注意到的那样,我在这个组合中添加了另一个工具。除此之外,窥探对于调试来说真的很方便。 

如果您放置撬起(绑定)在代码中的任何位置,都可以在此时检查应用程序。您可以在应用程序中的特定点窥探对象。这确实有助于您一步一步地完成应用程序,而不会绊倒您自己。例如,让我们将其放在写_页功能并检查链接是我们所期望的。

窥探

1
...
2
定义 
4
  链接范围(_R) = 1
5
  代理人 ||= 机械化.新的
6
7
  直到 链接范围(_R) == 21
8
    第页 = 代理人.得到("https://between-screens.herokuapp.com/?页面=#{链接范围(_R)}")
9
    链接范围(_R) += 1
10
11
    第页.链接[2..8].地图  |链接|
12
      写_页(链接)
13
      窥探.开始(结合)
14
    结束
15
  结束
16
结束
17
18
...

如果你运行脚本,我们会得到这样的东西。

输出

1
»$ruby noko_scraper.rb
2
321:清除
4
322:link_range=1
5
323:代理||=Mechanize.new
6
324:
7
326:直到link_range==21
8
327:page=agent.get(“https://between-screens.herokuapp.com/?页面=#{链接范围}“)
9
328:链接范围+=1
10
329:
11
330:page.links[2..8].map do|链接|
12
331:write_page(链接)
13
=>332:撬起(绑定)
14
333:结束
15
334:结束
16
335:结束
17
18
[1] 撬(主)>

当我们要求链接对象,我们可以在继续其他实现细节之前检查我们是否在正确的轨道上。

终点站

1
[2] 撬,撬(主要的)> 链接
2
=> #<机械化::页面::链接
 “大师@工作|潜意识|截止日期|设计个性|设计问题|团队|推信封|愉快的体验|完美的细节|公司价值观”
4
 “/集/139”>

看起来像是我们需要的。很好,我们可以继续了。在整个应用程序中一步一步地进行这项操作是一项重要的实践,可以确保您不会迷路,并且您真正了解它的工作原理。我不会在这里详细介绍Pry,因为这至少需要另一篇完整的文章。我只能建议使用它作为标准IRB shell的替代品。回到我们的主要任务。

刮刀

既然你已经有机会熟悉了这些拼图,我建议我们逐一复习,并澄清一些有趣的地方。让我们从中心部分开始。

播客_抓取者.rb

1
...
2
定义 写_页(链接)
4
  详细信息页面 = 链接.点击
5
  
6
  提取的数据 = 提取数据(详细信息页面)
7
8
  标记向下文本 = 组合_降价(提取的数据)
9
  日期 = 提取的数据[:date(日期)]
10
  被采访者 = 提取的数据[:受访者]
11
  情节_编号 = 提取的数据[:epiode_number]
12
13
  文件名 = "#{日期}-#{使……变漂亮(被采访者)}-#{情节_编号}.html.erb.md“ 
14
15
  文件.打开(文件名, “w”) { |文件| 文件.(标记向下文本) }
16
结束
17
18
定义 
19
  链接范围(_R) = 1
20
  代理人 ||= 机械化.新的
21
22
  直到 链接范围(_R) == 21
23
    第页 = 代理人.得到("https://between-screens.herokuapp.com/?页面=#{链接范围(_R)}")
24
    链接范围(_R) += 1
25
26
    第页.链接[2..8].地图  |链接|
27
      写_页(链接)
28
    结束
29
  结束
30
结束
31
32
...

方法?首先,我循环查看旧播客中的每个索引页面。我使用的是Heroku应用程序中的旧URL,因为新网站已经在线屏幕之间.fm。我有20页的剧集需要翻阅。 

我通过链接范围(_R)变量,我用每个循环更新了它。分页过程就像在每个页面的URL中使用这个变量一样简单。简单有效。

清除刮痕

1
第页 = 代理人.得到("https://between-screens.herokuapp.com/?页面=#{链接范围(_R)}")

然后,每当我有一个新的页面需要删除另外八集时,我都会使用页面链接以确定我们要点击的链接,并关注每一集的详细信息页面。我决定使用一系列链接(链接[2..8])因为每页都是一致的。这也是从每个索引页面找到我需要的链接的最简单方法。没有必要在这里摸索CSS选择器。

然后,我们将详细信息页面的链接提供给写_页方法。这是完成大部分工作的地方。我们获取该链接,单击它,然后跟踪到详细信息页面,在那里我们可以开始提取其数据。在那个页面上,我们找到了我为新网站撰写新的降价剧集所需的所有信息。 

定义write_page

1
提取的数据 = 提取数据(详细信息页面)

定义extract_data

1
定义 提取数据(详细信息页面)
2
  被采访者 = 提取受访者(详细信息页面)
  标题 = 提取_标题(详细信息页面)
4
  sc_id = 提取声音云id(详细信息页面)
5
  文本 = 提取_显示_文本(详细信息页面)
6
  插曲字幕 = 提取器字幕(详细信息页面)
7
  情节_编号 = 提取_情节_编号(插曲字幕)
8
  日期 = 清洁_日期(插曲字幕)
9
  标签 = 内置标签(标题, 被采访者)
10
11
  选项 = {
12
    受访者:被采访者,
13
    标题:标题,
14
    sc_id:sc_id,
15
    文本:文本,
16
    标签:标签,
17
    日期:日期,
18
    情节_编号:情节_编号
19
  }
20
结束

如你所见,我们认为详细信息页面并对其应用一系列提取方法。我们提取被采访者,标题,sc_id,文本,情节_标题、和情节_编号。我重构了一系列负责这些提取职责的集中帮助器方法。让我们快速了解一下:

助手方法

提取方法

我提取了这些帮助程序,因为它使我能够拥有更小的总体方法。封装他们的行为也很重要。代码读起来也更好。他们大多数人都会详细信息页面作为一个论点,并提取一些我们在Middleman帖子中需要的具体数据。

1
定义 提取受访者(详细信息页面)
2
  受访者_选择器 = '.pepiode_sub_title跨度'
  详细信息页面.搜索(受访者_选择器).文本.
4
结束

我们在页面中搜索特定的选择器,得到的文本没有不必要的空白。

1
定义 提取_标题(详细信息页面)
2
  标题_选择器 = “.情节_标题”
  详细信息页面.搜索(标题_选择器).文本.gsub公司(/[?#]/, '')
4
结束

我们取下标题并删除?#因为这些与我们剧集帖子中的头条内容不太协调。下面是关于前面的内容的更多信息。

1
定义 提取声音云id(详细信息页面)
2
  供应链 = 详细信息页面.iframes包含(网址:/soundcloud.com网站/).
  供应链.扫描(/\d{3,}/).第一
4
结束

在这里,我们需要更加努力地提取托管曲目的SoundCloud id。首先我们需要Mechanize iframeshref公司属于soundcloud.com网站并使其成为用于扫描的字符串。。。

1
“[#<机械化::页码::框架\n个\n个 \"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/221003494&amp;auto_play=false(&amp;);hide_related=false(&amp;);show_comments=false&amp;show_user=true(&amp;);show_reposts=假;可视=真\">\n个]"

然后匹配一个正则表达式作为其track id-our的数字声音云id "221003494".

1
定义 提取_显示_文本(详细信息页面)
2
  shownote_selector(显示选择器) = “#shownote_container>p”
  详细信息页面.搜索(shownote_selector(显示选择器))
4
结束

提取演出笔记也很简单。我们只需要在详细页面中查找演出说明的段落。这里没有什么惊喜。 

1
定义 提取器字幕(详细信息页面)
2
  副标题_选择器 = “.情节_子标题”
  详细信息页面.搜索(副标题_选择器).文本
4
结束

字幕也是如此,只是为了准备从中清晰地提取剧集号。

1
定义 提取_情节_编号(插曲字幕)
2
   = /[编号]\d*/.比赛(插曲字幕)
  清除索引编号()
4
结束

这里我们需要另一轮正则表达式。让我们看看应用正则表达式的前后。

插曲字幕

1
“Joáo Ferreira | 12分钟| 2015年8月26日|第139集”

1
"#139"

再往前走一步,直到我们得到一个干净的数字。

1
定义 清除索引编号()
2
  ..信托收据('#', '')
结束

我们把那个数字加上散列#然后删除它。对了,我们有了第一集的号码139同时提取。我建议我们在将所有方法结合在一起之前,也看看其他实用方法。

实用程序方法

在完成了所有的提取工作之后,我们需要做一些清理工作。我们已经可以开始准备用于构成降价的数据了。例如,我将插曲字幕还有一些,以获得明确的日期并构建标签使用内置标签方法。 

定义清除日期

1
定义 清洁_日期(插曲字幕)
2
  字符串_日期 = /[^|]*([,])(.....)/.比赛(插曲字幕).
  日期.解析(字符串_日期)
4
结束

我们运行了另一个regex,它查找如下日期:“2015年8月26日”如你所见,这还没有太大帮助。字符串_日期我们从字幕中了解到,我们需要创造一个真实的日期对象。否则,创建Middleman帖子将毫无用处。

字符串_日期

1
“2015年8月26日”

因此,我们将该字符串作为日期.parse。结果看起来更有希望。

日期

1
2015-08-26

定义build_tags

1
定义 内置标签(标题, 被采访者)
2
  提取的标签 = 条带管道(标题)
  "#{被采访者}"+ ",#{提取的标签}"
4
结束

这需要标题被采访者我们在提取数据方法并删除所有管道字符和垃圾邮件。我们用逗号替换管道字符,@,?,#、和&使用空字符串,最后注意缩写具有.

定义strip_pipes

1
定义 条带管道(文本)
2
  标签 = 文本.信托收据('|', ',')
  标签 = 标签.gsub公司(/[@?#&]/, '')
4
  标签.gsub公司(/[w\/]{2}/, '与')
5
结束

最后,我们也将受访者的名字包括在标签列表中,并用逗号分隔每个标签。

之前

1
“大师@工作|潜意识|截止日期|设计个性|设计问题|团队|推信封|愉快的体验|完美的细节|公司价值观”

之后

1
“乔·费雷拉(Joáo Ferreira),大师作品,潜意识,截止日期,设计个性,设计问题,团队,推信封,愉快的体验,完美的细节,公司价值观”

这些标签中的每一个都将成为指向该主题的帖子集合的链接。所有这些都发生在提取数据方法。让我们再看看我们的位置:

定义extract_data

1
定义 提取数据(详细信息页面)
2
  被采访者 = 提取受访者(详细信息页面)
  标题 = 提取_标题(详细信息页面)
4
  sc_id = 提取声音云id(详细信息页面)
5
  文本 = 提取_显示_文本(详细信息页面)
6
  插曲字幕 = 提取器字幕(详细信息页面)
7
  情节_编号 = 提取_情节_编号(插曲字幕)
8
  日期 = 清洁_日期(插曲字幕)
9
  标签 = 内置标签(标题, 被采访者)
10
11
  选项 = {
12
    受访者:被采访者,
13
    标题:标题,
14
    sc_id:sc_id,
15
    文本:文本,
16
    标签:标签,
17
    日期:日期,
18
    情节_编号:情节_编号
19
  }
20
结束

这里剩下要做的就是返回一个包含我们提取的数据的选项散列。我们可以将这个散列输入组合_降价方法,它使我们的数据准备好作为我的新站点所需的文件写出。

写作帖子

定义compose_markdown

1
定义 组合_降价(选项={})
2
<<-赫里多克
---
4
标题:#{选项[:受访者]}

5
受访者:#{选项[:受访者]}

6
主题列表(_L):#{选项[:标题]}

7
标签:#{选项[:标记]}

8
声音云id:#{选项[:sc_id]}

9
日期:#{选项[:date(日期)]}

10
情节_编号:#{选项[:epiode_number]}

11
---
12


13
#{选项[:text(文本)]}

14
赫里多克
15
结束

为了在我的Middleman网站上发布播客,我选择重新调整博客系统的用途。我没有创建“纯”博客帖子,而是为我的剧集创建了展示笔记,通过iframes显示SoundCloud托管的剧集。在索引站点上,我只显示iframe加上标题和其他内容。 

我需要的工作格式是由所谓的前端组成的。这基本上是我的静态站点的密钥/值存储。它正在取代我的旧Sinatra网站上的数据库需求。 

受访者姓名、日期、SoundCloud曲目id、剧集编号等数据位于三个破折号之间(---)在我们的插曲文件上。下面是每个情节的内容,如问题、链接、赞助商资料等。

前部物质

1
---
2
键:值
键:值
4
键:值
5
键:值
6
---
7
8
此处显示剧集内容。

组合_降价方法,我使用赫里多克为我们循环浏览的每一集编写带有封面的文件。从我们提供给此方法的选项散列中,我们提取在提取数据helper方法。

定义compose_markdown

1
...
2
<<-赫里多克
4
---
5
标题:#{选项[:受访者]}

6
受访者:#{选项[:受访者]}

7
主题列表(_L):#{选项[:标题]}

8
标签:#{选项[:标记]}

9
声音云id:#{选项[:sc_id]}

10
日期:#{选项[:date(日期)]}

11
情节_编号:#{选项[:epiode_number]}

12
---
13


14
#{选项[:text(文本)]}

15
赫里多克
16
17
...

这是一个新播客集的蓝图。这就是我们来的目的。也许你想知道这个特殊的语法:#{选项[:受访者]}。我像往常一样使用字符串进行插值,但由于我已经在<<-此处,我可以去掉双引号。

只是为了定位我们自己,我们仍然在循环中,在写_页每个点击链接的功能都指向一个详细页面,其中包含一集的节目注释。接下来要做的是准备将此蓝图写入文件系统。换句话说,我们通过提供文件名和合成的标记向下文本

最后一步,我们只需要准备以下内容:日期、受访者姓名和剧集编号。加上标记向下文本当然,我们刚收到组合_降价.

定义write_page

1
...
2
标记向下文本 = 组合_降价(提取的数据)
4
日期 = 提取的数据[:date(日期)]
5
被采访者 = 提取的数据[:受访者]
6
情节_编号 = 提取的数据[:epiode_number]
7
8
文件名 = "#{日期}-#{使……变漂亮(被采访者)}-#{情节_编号}.html.erb.md“ 
9
10
...

那么我们只需要文件名以及标记向下文本并写入文件。

定义write_page

1
...
2
文件.打开(文件名, “w”) { |文件| 文件.(标记向下文本) }
4
5
...

让我们把这个也分解一下。对于每个帖子,我需要一个特定的格式:2016年10月25日-Avdi-Grimm-120。我想写出以日期开头的文件,包括被采访者姓名和剧集编号。

为了与Middleman期望的新帖子格式相匹配,我需要取被采访者的名字并通过助手方法将其输入到使……变漂亮我的名字,来自阿夫迪·格林Avdi-Grimm公司没有什么神奇之处,但值得一看:

定义dasherize

1
定义 使……变漂亮(文本)
2
  文本.l行程.第一次旅行.信托收据(' ', '-')
结束

它删除了我们为被采访者的名字而抓取的文本中的空白,并用破折号替换了Avdi和Grimm之间的空白。文件名的其余部分在字符串中用虚线连在一起:“查看日期-姓名-编号”.

定义write_page

1
...
2
"#{日期}-#{使……变漂亮(被采访者)}-#{情节_编号}.html.erb.md“
4
5
...

由于提取的内容直接来自HTML站点,我不能简单地使用.md文件.降价作为文件扩展名。我决定去.html.erb.md文件。对于我以后不用刮擦就创作的剧集,我可以去掉.html.erb部分且仅需要.md文件.

在此步骤之后功能结束,我们应该有一集这样的:

2014年12月1日-Avdi-Grimm-1.html.erb.md

1
---
2
标题:Avdi Grimm
受访者:Avdi Grimm
4
topic_list:Rake是什么|起源| Jim Weirich |常见用例| Rake的优点
5
标签:Avdi Grimm、Rake是什么、起源、Jim Weirich、常见用例、Rake的优点
6
声音云id:179619755
7
日期:2014-12-01
8
epiode_number:1
9
---
10
11
问题:
12
-Rake是什么?
13
-你能告诉我们Rake的起源吗?
14
-关于吉姆·威里奇,你能告诉我们什么?
15
-Rake最常见的用例是什么?
16
-Rake最显著的优点是什么?
17
18
链接:
19
在“>中http://www.youtube.com/watch?v=2ZHJSrF52bc“>纪念伟大的吉姆·威里奇
20
耙“>https://github.com/jimwelich/rake“>GitHub上的耙子
21
吉姆“>https://github.com/jimwerich“>GitHub上的Jim Weirich
22
基本“>http://www.youtube.com/watch?v=AFPWDzHWjEY“>Jim Weirich的基本Rake演讲
23
电源“>http://www.youtube.com/watch?v=KaEqZtulOus网站“>Jim Weirich的Power Rake演讲
24
学习“>http://devblog.avdi.org/2014/04/30/learn-advanced-rake-in-7-episodes/“>在7集中学习高级Rake-来自Avdi Grimm(免费)
25
阿夫迪“>http://about.avdi.org/“>Avdi Grimm
26
Avdi Grimm的放映:Ruby“>网址:http://www.rubytapas.com/“>鲁比塔帕斯
27
红宝石“>http://devchat.tv/ruby-roughes/“>Ruby Rogues与Avdi Grimm的播客
28
很棒的电子书:Rake“>http://www.amazon.com/Rake-Management-Eessentials-Andrey-Koleshko/dp/1783280778“>耙任务管理要点来自https://twitter.com/ka8725“>安德烈·科莱什科

当然,这个刮板会从最后一集开始,一直循环到第一集。为了演示的目的,第01集和任何一集都一样好。你可以从我们提取的数据中看到最前面的内容。 

所有这些之前都被锁定在我的Sinatra app-epicode编号、日期、受访者姓名等数据库中。现在,我们准备将其作为我的新静态Middleman网站的一部分。低于两个三破折号的所有内容(---)是来自节目注释的文本:主要是问题和链接。

最后的想法

我们已经完成了。我的新播客已经开始运行了。我真的很高兴我花时间从头开始重新设计这个东西。现在出版新的剧集要酷得多。对用户来说,发现新内容也应该更加顺畅。 

正如我前面提到的,这是您应该进入代码编辑器享受乐趣的时候。接受这段代码并与之较量一下。试着找到使它更简单的方法。有一些机会重构代码。

总的来说,我希望这个小例子能给你一个好主意,让你知道你可以用新的刮网排骨做什么。当然,你可以实现更复杂的挑战——我相信用这些技能甚至可以创造很多小商业机会。 

但和往常一样,一步一个脚印,如果事情没有马上发生,不要太沮丧。这不仅对大多数人来说是正常的,而且也是意料之中的。这是旅程的一部分。刮得开心!

广告
广告
寻找有助于启动下一个项目的东西?
环境市场有一系列可供出售的商品,帮助您开始。