[音乐播放] ROBERT KRABEK:你好,伙计们。 我的名字是罗伯特Krabek,和 我会教你们 如何刮网络与 引入nokogiri,这是一个Ruby库, 与和服,这是一个Chrome扩展。 因此,首先有一个 两件事情,你 如果能做到,也许你已经 做所有pset时为止 和你的工作空间 开始有点满。 我们其实可以随便去 为您创建一个新的工作区 只是做一个全新的项目。 所以,如果你想继续 在CS50模板ID工作 您当前拥有, 感到自由,你可以只 与CFLAGS安装引入nokogiri equals--创业板安装引入nokogiri。 但是,否则我会告诉你 如何设置新一轮上涨。 然后这基本上是 下探更多的培训车轮。 而你的编码,如果你是 只是编码崇高什么的。 因此,如果我们在移动它。 所以说,这是你目前的CS 50号。 你可以只是去Cloud9这里。 你可以去到仪表板。 应当会区选项卡。 然后,你可以点击 在这里,创建一个新的工作空间。 命名您的新的工作区, 也许测试或刮。 然后单击这个自定义选项卡在这里, 而不是CS50模板选项卡。 然后你可以去 并创建一个新的工作区。 我已经创建了一个工作区在这里。 因此,我们将致力于与此有关。 如果你创建了一个新的 工作区,与自定义选项卡, 您只需键入创业板安装 引入nokogiri,这是不会在这里。 OK,这是一个有点冻结。 但是你可以键入创业板安装引入nokogiri。 这应该是所有 有对安装。 正如我所说的,如果你还在之前, 在您的CS50模板ID的工作, 你只需要键入CFLAGS 等于创业板安装引入nokogiri。 我已经安装了 在这里,所以我不会那么做的。 但是,对于那些以下 一直以来,觉得完全可以这样做。 所以,一旦你有你的引入nokogiri 工作区或库安装, 我想给你一点点 速成班的Ruby语法 因为是引入n​​okogiri一个Ruby库。 所以,你需要了解一些基本 Ruby的语法与工作引入nokogiri。 因此,一些基本的差异 从你已经习惯了 也许,如果你已经工作 到目前为止,在短短的C和PHP, 你有没有类型声明变量。 你不使用分号, 这是种解脱。 有没有括号现在各地 支持或while循环,例如。 你只需要一个代码块,和 那么你就把结束在该结束。 有没有加加 或减减,所以只 知道,对于当 你正在做的for循环, 只是加equals和减等于。 而不是哈希和包括, 你会使用需要,然后 无论库尝试 加载到你的程序。 Ruby是不是编译语言。 所以这是另一种救济。 它更类似于PHP在哪里 这是一种解释型语言。 您可以运行任何Ruby脚本 你写使用Ruby其次 通过脚本或程序的名称。 以表明它是一个Ruby程序, 你只需用.RB,而不是.C结束。 而且有变 大小的数组在Ruby中, 这是超级方便,当你 刮也许要追加 你已经刮到一个数组数据。 你不必对malloc一个新的阵列和 复制旧数组复制到新的数组。 你可以只用追加 两个箭头标志。 并且没有字符,有 只是单一的字母串。 所以这应该是一个更容易一些。 所以,我们只是给你一些 一些基本的Ruby语法的例子。 所以在这里,你可以看到,而不是 斜线斜线,以红宝石发表评论, 你只需要使用井号。 而变量声明,你 只需输入变量等于 任何你想要的变量是。 它们可以是字符串。 你可以有数组, 你填充值。 看跌期权和版画是相似的。 对于我们的目的, 唯一的区别是真的 这使,它代表 看跌期权,只是把一个新行 字符无论你打印。 因此,如果我们给小 示范这里, 我们可以运行这个with-- 打开一个新的终端。 你可以看到所有这些 这是在我的终端文件。 如果我只是运行 红宝石,红宝石intro.rb,它 提出了五您好 马瑟,昆西,载体。 亚当斯。 所以这是所有有 要声明数组。 听众:罗伯特,可以使 您的字体大些? ROBERT KRABEK:是的。 我可以放大,因为你不能 放大到终端字体明显。 这就是你如何打印 变量到终端。 您还可以使用 在字符串中的变量。 因此,最近在PHP中, 你可能已经学会 有串插。 所以,如果你在这里看看,如果我 声明三个变量名,图书馆, 和语言,我放,我 写一个字符串,你好我叫。 然后,而不是PHP 版本字符串插值 这看起来有点像这样, 你有井号,然后 一个大括号,然后 的变量的名称。 这就是你如何打印,说, 无论变量名。 然后你也可以 连接字符串。 红宝石使用户能够无比 容易与加号。 你只要有一根弦 左边加一个可变 或另一个字符串加上字符串。 所以,如果我打印出来,它应该 只是说你好,我的名字是罗伯特。 我会教你在Ruby中引入nokogiri。 而且,我们只是确认了 不愧是case--红宝石介绍。 你好,我的名字是罗伯特。 我会教你在Ruby中引入nokogiri。 继续前进,如果else语句, 这是一个有点不同 从你可能被用于 如果你一直在C.工作 你不需要括号。 你不需要花括号。 而不是其他人,如果和, 这是一个串联的ELSIF。 所以在这里,如果我宣布x向上 在这里,我们可以看到,X仍然是5。 因此,如果x小于3,它会把小。 如果它小于7,介质,否则大。 所以图5是介质编号。 而我最终的结尾代码块。 这是我的for循环。 而这个语法也 稍微不一样。 在0到五只本质 被宣布为0的阵列5。 因此,有在阵列中五个插槽。 然后在这每个时隙 阵,我将递增我。 因此,这应该打印0-5,或0-4。 这应该打印介质。 而我就杀出通过。 你们将有机会获得 这段代码以后。 所以你们可以运行这个自己。 因此,这是基本的while循环。 这仅仅是印刷Ĵ, 1递增,直到我们打5。 超快速的Ruby速成班 关于如何写一个函数。 相反的,说,INT因子 数字,我们只是清晰度。 而且基本上你 此处定义的功能。 这将是对 功能的名称, 这是任何变量,你 要传递到函数。 你可以有,如果在语句。 你可以返回。 在这种情况下,我们 定义一个递归 实现阶乘函数。 所以,我们只需要调用函数 在Ruby中是这样的。 所以,如果我们定义了这样,我 可以调用阶乘,传中3, 然后3将成为数字变量 我可以在函数中使用。 而这个to_s是刚刚开启 返回阶乘的值转换成字符串。 否则,这将抛出 一个错误,说哦,我 不能打印string-- 因为你还记得, 却将放在string--因为这 阶乘返回一个数。 因此,我们可以将其转换 像这样的字符串。 反之,你也可以转换 的字符串与to_i的整数。 所以,让一切超级简单, 如果我只是评论了这一点,保存 并运行阶乘函数。 我们应该能看到 三是阶乘是6。 这确实是真的。 所以,这是你的速成班红宝石。 现在你知道Ruby中,我们可以继续 基本拼抢引入nokogiri成立。 基本上所有你需要做的是, 在Ruby中,所需要的库。 而对于我们的目的,我们将使用 库OpenURI以及引入nokogiri。 然后你do--它会 给你的语法this-- 是你多开的网址,你会在 卷曲的要求,这表示C- URL。 所以,你需要的网址 该网站有问题。 您将它存储在一个变量。 然后你就可以通过该搜寻 变量使用唯一的HTML标签 名为.css命令。 然后你可以输出的 内容不管你想要的。 您可以在数据库启动。 您可以输出文件或 甚至只是将其打印到屏幕上。 因此,我们会告诉你一个基本的刮刀。 所以,在这里,你可以看到我们有 需要引入nokogiri,要求开放式的URI。 你的基本设置,让我们 称之为文档或文档, 等于引入nokogiri :: HTML开,这是 由OpenURI所提供的命令 图书馆。 而我们将搜索,对于那些 你们谁可能住在四, 自行车是在波士顿上市 波士顿Craigslist的自行车节 现场。 所以,如果你不熟悉 有袅袅,我就 告诉你真正的快什么卷曲会做。 如果我想获得的所有的URL从 Craigslist的网站,如果我输入卷曲, 它只是转储所有的网址 从Craigslist的自行车站点 到我的终端。 这不是特别 有用的,因为我不知道 要手动完成,并 找到我要找的东西。 但是,仅仅这样你就可以 看到我居然 使用正确的代码,如果你看 在bikes--的URL,Craigslist的 由于某种原因,它没有找到。 如果你看一下这个页面 你看一下网址, 这应该是相同的 我只是发卷曲请求。 事实上,这是什么东西被 存储在doc变量。 因此,当你回到我们的代码,我们 然后可以在这个文档变量进行操作 使用的CSS。 所以说,我想获得的所有的 这是span.txt的标签, 而该标签内的所有一个标签。 为什么会我们要 做到这一点,我听到你哭了吗? 如果我们检查元素,它给你一个 的URL是如何构成击穿。 如果我向下滚动 在这里,你可以看到 每个这些不同的什么 元素表示。 所以,也许我想访问 这个特殊的元素。 所以,我使用的是Chrome开发 工具来检查元素。 我可以看到,这到这里 是一个跨度内标签 标记与类TXT的。 因此,这得给我们 第一次运行该 是doc.css跨度,它是标记,它 我在寻找内的所有此URL。 然后.TXT操作起来非常象CSS 当你刚刚编写CSS做 在你的HTML文件 指定类。 因此,这个特定的运营商将 指定与类TXT跨度标签。 然后,如果我留出空间, 这将会进入该标签内 然后找到一个范围内的一个标签。 所以,如果我只是把这个 终端,我应该 可以看到基本上所有 即这个跨度类的txt的范围内。 所以我们给了一展身手。 红宝石Craigslist的刮板。 事实上,让我们所有的这些 各列表标记, 是Craigslist的页面上。 因此,如果我们回去,我们可以把这个 成一些更有益的。 也许我们只想要的链接。 因为这个标签内,我还会 有路径的超链接 这个页面去。 所以,如果你看一下这个代码在这里, 我会做什么是不是的CSS, 我可以去at_css。 这将刚刚得到的第一 所有这些事情的元素。 所以,如果我这样做了,在 代码我只是以前证明, 而不是返回所有 此,它会只是 返回这些中的第一个。 所以这是怎么at_css操作符。 因此,我们要保存 路径所有的第一标签的。 而由于会给我们A-- 所以我们还是要使用的CSS。 但因为这是要给 我们回到标签整个数组, 我们要访问 第一个元素。 因此,这是另一种方式,你可以 访问如果任何特定的元素 有元素的数组 即返回, 因为你可以把任何东西, 作为一个数组的CSS回报,本质上。 然后,我们要访问 该超文本引用属性。 所以,如果如果你看看, 你看起来很接近这里, 如果你只是本质 看一下地址栏, 这是路径 你会被刮。 因此,如果我们只是再次运行此, 并确保我们救了它。 您可以检查在家里。 这实际上符合了这个链接。 那么,为什么我们要用这个? 如果你想刮 它具有页 像链接的页面 Craigslist的呢,你 也许去,然后 在每个这些链接 然后刮 这些内容,这 这正是我们要做的。 所以,一旦你有路径作为 变,我不再真的 在意打印出来。 我只是需要将其保存为一个变量。 然后,我可以访问另一个 页面相同的方式,我访问 文档摆在首位。 除非网址,我们将 使用字符串插值 像我描述 红宝石早些时候追加 的路径的根的末端。 所以,这是什么要做的是 这是要放的道路上 我以前刮 然后把这一 进入一个新的项目,无论你想 调用它 - first_listing,例如。 但我要离开 它的项目现在, 因为那是我用在这里是什么。 所以说,我想获得的说明 在Craigslist网站的第一次发布。 所以,我会去到这里。 我会点击检查元素 再次,因为这是描述。 我会去这里往下看吧 如果我能找到我怎么可能 能够寻找这个独特的标记。 在这种情况下,它具有 一个ID,这使我们 以搜索为我们的下一个方式 标签,这是用一个#标签。 因此,对于类,可以 使用点运算符。 所以名.txt指定类TXT的, 而散列指定的ID。 因此,在这种情况下,该标记是 部,且ID为postingbody。 所以,这正好与认定 在first--因为我们 使用at_css--这正好和 发现的第一个元素,该元素 自带了部分的标签 和postingbody的ID。 然后你就可以访问文本元素 该项目的回用的.text。 然后我们可以存储 在描述。 所以,现在我们有一个 变量描述, 我们也许能够做的,比方说, 文件I / O。因此,文件I / O的红宝石 非常类似于文件I / O 在C中,我们打开一个文件。 我们可能会写入。 然后,我们会关闭该文件。 所以在这里,我们只是命名 文件中,一些任意变量。 我们也可以只是把这个在这里。 我们有我们要存储一个变量 打开文件File.open一样。 我们正在写这个文件, 所以我们用W运营商打开它。 然后我们把串入 文件与.puts运营商。 然后我们把变量我们 想写内的文件。 这时,只要关闭该文件。 因此,如果我们继续运行这个, 这应该产生一个文件 与description.txt会 有在这本说明书。 所以,如果我运行它 - 没有。 它的产生有一个文本文件, 希望,同样的事情。 因此,有可能是一个新的发布 是的来了,而我一直在谈论。 事实上,它看起来像一直存在。 因此,如果我们去这个经典的自行车, 1962年至1966年,这似乎来匹配。 而且你去那里。 所以这是最基础的 刮功能。 我们可以有,而不是 只是写此文件, 我们可以添加的东西到一个数组。 所以,如果我声明了三个阵列, 标题,价格和说明。 我们正在操作的文档项目现在。 我们可以通过与 找到所有的span.txt的。 请记住,这将返回一个数组 所有它找到的物品。 然后在Ruby中,你可以使用 。每遍历每个项目 该阵列。 然后对每项产品的 我只是要叫它 一个环节,因为这是 本质上,它是什么。 所以,如果我把每link.css点a.hdrlnk, 这实际上是将链接 并发现该链接的另一个内 HTML元素和相应的类。 因此,如果我们记住什么 这是中,span.txt, 你可以见式让我回去 在span.txt真正quick-- 我们有很多其他类的。 所以里面span.txt,我们正在寻找 与一类hdrlnk的标签。 所以,让我发现, 为你们真正的快。 所以,你可以在这里看到,这是一个标签 那类TXT的范围之内 具有类hdrlnk。 而这确实是 我们正在试图获得。 所以,我们现在要存储所有 标题里面的链接。 然后我们要打印 从每个这些链接。 不,对不起。 我们要打印出 每个那些的的价格。 因此,让我们运行这个真 快看看它做什么。 因此,这基本上只是去 通过每个链路 反过来,访问标签有问题, 然后掏出的价格。 它这样做是因为后 你拥有了一切的称号, 我们刚刚存储的称号在那里。 我们刚刚保存的链接 在阵列称号。 而在本作中环运行, 在那里,而不是去a.hdrlnk, 我们正在寻找一个span.price。 所以,如果我能真的很快找到 价格,如果您检查元素, 你会看到,这是一个跨度 与类价格。 这本质上是如何 我们得到的价格出现。 所以这是真的 刮基本情况。 这就是你得到的所有 页面上的元素 那,说,你已经知道的URL。 因此,如果我们想获得一个 多一点深入, 我们可以刮去内页的页面。 而在这个例子中,我会 可以输出到CSV文件。 所以我需要CSV在这里 因为Ruby没有,里面的自己, 具备的功能 刚刚输出的CSV文件。 所以这是超级简单。 让我去下。 我们覆盖的文件I / O。因此,这 类似于它是在C如何 而在之前,我们搬到和服, 我就告诉你真快如何 刮景点内的站点。 因此,我们已经学会了如何 在Ruby的声明数组。 所以,我只是声明 一堆任意阵列 我将在存储中的数据。 文档正在操作相同的方式 因为它没有以前的文件研究。 我们要去的,找到 每个span.txt的。 我们已经知道这一点。 即在容器内,每个 链接了所有我们需要的数据。 所以在这里,我们正在做的是为每 跨度类TXT联系,我们将在 我们正在寻找一个标签, 发现的第一要素。 请记住,的CSS返回一个数组, 所以你不能访问它的。 我们要找到的第一个元素。 即使它是一个的阵列 项目,你必须使用这种语法, 然后拉出href属性。 所以我们做这点。 因此,这看起来很熟悉。 所以,现在我们有一个数组 我们所有的环节叫做路径 那我们将要使用的。 因此,如果我们拥有所有的这阵 我们要使用的路径, 那么我们可以为每个项目 这些网页,当我们打开该网页。 所以,我们也看到了 之前,这里的语法 做字符串插补路径 这里,所以,语法是只为路径。 我能说出这个 变量的任意名称。 这是很重要的。 这是数组,你会 是访问每个元件。 但是,当你在路径中说的路径, 这个装置,用于在路径的每个元素, 把它叫做路径,并使用它。 这基本上就像当你 做一个循环,你使用int我。 所以,你可以把路径作为 变量多数民众赞成递增。 然后对每个那些, 进入其中每个环节。 因为我们将其存储在项目网页, 所以我们创造了新的一页,每次 我们访问它。 然后在这新的一页,找到 span.postingtitletext,span.price, 然后一节#postingbody。 我们已经覆盖部分#postingbody 当我们看着的说明。 因此,我们可以去看看在Craigslist的职位, 如果你只是看标题, 你可以看到它在这里, 跨度postingtitletext。 这就是为什么它的存在。 然后为代价的,你可以 与跨类价格的访问。 所以,我们也说不定可能 要存储的URL。 所以我们只需要运行这个 再次,将其存储在一个数组, 因为如果你正在寻找 在Craigslist,你 可能会想办法,如果 你看到的东西你感兴趣, 回到那个现场。 所以,你只是想存储 网址为参考的缘故。 这仅仅是本质上 另一种语法for循环。 我只是不paths.each代替 的用于与索引路径的路径。 而这个语法是红宝石for-- 路径为我们做了什么在这里, 声明为每个项目的变量。 而指数表现得像 在我的下循环。 所以,你可以跟踪 的索引是什么。 因此,这里仅仅是一个 小方便的事情 因为当你正在运行的刮刀。 如果你刮数百页, 以确保它不挂, 它只是输出, 我在访问该页面, 并确保 它仍在继续。 但我们的目的,因为 有一百余项, 我要访问只是他们三个 这样我们就没有用完的时间在这里。 但在此之前我们得到的是,我只是 要告诉你的真快, 我将输出的称号, 价格,描述,和URL 每次,我已经刮的联系的。 然后,这仅仅是 语法CSV库。 你打开一个CSV。 这就是我要调用它。 与写做打开它。 然后CSV将是文件 你输入的一切之中。 这仅仅是一个理智检查 我知道,它的运行。 这是我的理智检查 要知道,它的完成。 所以,我把标题分成行 该CSV,价格,链接,说明, 所有进入的CSV行。 因此,如果我们去运行 这now--我只是 确保我已经保存它 - 而不是 的只是其输出到终端, 我们应该有一个CSV 多数民众赞成生成的文件。 所以在这里我们可以看到CSV 一个已经生成的文件。 这是输出 SCAPE,我只是跑了。 正如你可以在这里看到, 访问页面0,1,2,3。 这些都是冠军, 价格描述。 如果我们看一下这个CSV 我们已经生成的文件, 你可以看到它在这里输出。 这是不擅长,所以它不是 格式化以行和列。 但是你可以想像 它可能被格式化。 CSV代表逗号分隔值。 所以,你可以想像,这可能是一排。 而每个逗号会 表示一个单独的列。 caution--只是一个字 有时你 刮事情有很多逗号。 因此,如果你输 到一个CSV文件, 它可能无法输出 你可能会想办法。 所以,这基本上所有 还有就是刮痧基本的HTML 与网页引入nokogiri。 因此,互联网的存在 创新的,因为它已经到来了 用更多的自动化和GUI 版本,虽然不太可靠 刮版不同的网站。 而对于我们的目的 我将演示 一个Chrome扩展名为和服。 和所有你需要做的就是您导航 为要刮的页面。 你点击感兴趣的领域。 你校准领域, 因为它会自动 检测它认为 你想被刮, 然后你只需创建一个API。 所以,如果我们要证明它 Craigslist的,它实际上是行不通的。 这就是我要回 说这件事不是那样强劲。 它创建API的麻烦。 但作为一个示范 的会怎样做, 如果你安装了Chrome扩展, 你要做的就是你点击它。 它Kimonofies页面,然后你 点击你想要的脚本的东西。 所以,如果我点击 即,它会突出 它认为我想 被刮落的页面。 所以,也许我把这个房源。 这就是很多项目我选择。 而且我可以证实或否认某些 其他推荐房源 把它添加到 什么都会被刮。 所以,现在我们可以看到有 选择的百余项。 如果我想有另一场,我 也凑这是关系到这一点, 说我想刮价格 还有,那么我就可以这样做。 所以这里的它是如何示范 更不用说强大的,因为现在它的 拿起城市,而不是 只是我想要的价格。 现在是捡到200的东西。 你可以回去和删除。 您可以再试一次。 但是,没有保证。 这是如何工作的时候。 正如你在这里看到,现在它说,96在这里。 它拿起大部分链接 要刮,但不 他们不一定所有。 和服的另外一个有用的工具,但 是,你可以去高级功能 在这里,去到高级, 它会告诉你 独特的击穿 的方式来访问HTML 要刮的标签。 因此,对于上市,如果你在这里, 如果您访问的div p跨度跨越, 实际上你可以只使用 这在你的代码中引入nokogiri, 我们已经span.txt之前在哪里 访问每个的目录。 如果我只是想文本 内房源, 我可以输入分区空间P 空间跨度空间跨度空间, 并会取得相同的效果。 而对于那些你们谁有兴趣 在使用正则表达式, 这恰好也给你正规 字符串输入表达式排序 找东西 你想找到的。 因此,有另一个很酷的功能 在这里你可以分页的和服, 这不仅是我可以凑 本页面的结果, 我可以点击这个小 这里按钮,分页, 指定的按钮,将 带我到下一个页面, 然后它会只知道, 它可以循环到下一个页面, 然后刮的是the--只要 因为它是course--的格式相同 SCAPE所有这些环节也是如此。 所以因为和服不希望 与Craigslist的工作,我们做了什么 是我Kimonofied哈佛深红。 我掏出一些排序 顶级精选文章,确认这里。 假设所有这些。 我编译此API 你的时间提前。 但是,否则你会做什么 是你只需单击完成。 输入您的API的细节。 它设置为 自动或手动抓取。 所以,你可以更新您的 数据每15分钟, 每周,每日,任何你想要的。 命名您的API。 创建API。 为了您的利益,我创建了 已经深红头版API。 所以,你只是创建一个 账户上的和服,并 将存储所有的API为您服务。 所以基本上这就是你的 独立的不同的擦伤。 因此,如果我们看这里,这是 我所收集的意见环节。 这些是功能 我收集了联系。 而这些都是最阅读 我所收集的链接 从这个最新的API景观。 所以,如果你可以在这里看到, 这将是功能, 这些将是意见, 在该示例中, 我一直都将它们结合在一起 为一个集合。 但如果你只是玩它 一点点,你可以把它分解了 然而,大家分着起来 要,只要 作为格式化略有不同。 只是为了玩弄这一点, 爬行成立,缺点之一 是你只能爬到 以每次25页。 那是限制因素之一。 但在这里,如果你将它设置 为手动抓取,这 是你如何能告诉它 更新您的数据。 在这里,你可以看到你的抓取历史记录 一切,你已经爬。 而且你们可以回去了,报名, 玩弄各种不同的方式 你可以修改和使用您的数据。 和服可以设置到 刮中的链接的链接。 你会首先这样做 刮链接列表, 然后使用该API作为 跳跃的起点另一个API 您创建的脚本。 但是,这不是更复杂 就是我们要进入今天。 所以这是和服。 我们将谈论的优点和 并引入nokogiri和服的利弊。 引入nokogiri,它的真快。 这很容易测试。 你可以只放什么 控制台,易于配置。 你可以决定到底是什么 要刮和存储。 没有页数限制。 其实,我用它来刮像 1800年南非学校网站 对电子邮件提供针对我做了一个实习的机会。 所以这是可能的,尽管最佳实践 将分裂的脚本。 因为如果失败,则 你什么也得不到。 但是,如果你做一百个, 也许200页的时间, 那么你有一些机会,至少 得到它零碎的,尤其是 如果你有不良上网。 不幸的是它只能刮HTML。 所以,如果你有 动态加载pages-- 我会告诉你一个例​​子 像独木舟在second-- 不幸的是引入nokogiri 不能刮了。 不过和服也很容易使用。 正如你所看到的,它本质 一个指向和点击。 它可以刮的JavaScript。 不幸的是,有一个最大 你能多少页刮。 有时,它是一个小 很难配置。 它会很困惑。 但它肯定 值得考虑 如果你不是想有 超级强大的维护刮。 如果你只是想获得 一切都关掉页面很快, 然后和服是真的 很好的工具来使用。 正如我前面提到的,有 和服的高级功能 这说明了如何 访问独特的HTML 元素,甚至是超级有用 如果您正在引入nokogiri。 因此,如果我们去的独木舟站点, 例如,你可以看到有is-- 也许你无法看到。 但是,如果我告诉你的URL,皮划艇, 这其实只是源URL。 这是URL之前被 用任何的JavaScript脚本修改 他们已经回事。 而且它会看起来不一样 从检查的元素。 所以,如果你通过你 匹配的检查元素 代码的源代码,它的 实际上是将不同。 而这基本上是为什么引入nokogiri 不能刮动态加载的网站。 因为是引入n​​okogiri 刮源URL, 而和服实际上是 刮你在做什么本质 看到在选择元素。 所以,如果我通过我 尝试Kimonofy皮艇, 我其实可以通过 并选择价格。 这是一个有点困难, 在这种情况下,它的 其实看到这个价格 因为不同于这些。 所以,而你可以configure--或 如果没有动态加载, 您可以配置引入nokogiri 让所有这些。 由于格式稍有 针对此房源的不同 因为它是比其余 他们,你可以在这里看到 它实际上不见了, 选择的所有航班价格。 也许我想选择 飞行时间为好。 我可以去通过,并 之类的配置。 我不希望出现这种情况。 我只是想下一个航班的时间。 然后经过这些夫妇 经历,它得到的图片。 所以和服的非常聪明。 这只是不是很强劲。 还有一些其他的 替代方案,您可以使用。 我会在这里告诉你他们。 如果你更舒服 Python的可能,而不是红宝石, 有一个图书馆 所谓美丽的汤。 您可以使用。 这非常类似于引入nokogiri。 它有一些更多的功能。 你可以找到一个HTML标记, 然后向上或向侧面移动。 有PyQt的。 这实际上可以刮动态 网站,因为这有点 是一个WebKit的伪装成 实际上不存在浏览器 是一个浏览器。 因此,它会等待所有的 JavaScript来第一次加载,然后 去和尝试,并刮去网站。 如果你想坚持使用Ruby,你 可以从引入nokogiri一个级别。 您可以使用水豚用 一个鬼驱人包装。 而这实际上可以 基本上做同样的事情 为PyQt的,这是它是一个WebKit的。 它等待 JavaScript来第一次加载。 如果你反复折腾还不够, 你甚至可以得到它的点击事情。 所以,如果有一个链接, 是不是一个典型的HREF哪里 路径是方便,而且 那就是检测一些JavaScript的事情 一点击,你其实​​可以做到这一点。 目前比较流行的库 以模拟一个用户 在JavaScript中,这是PhantomJS。 这可以明显地刮动 站点,因为这实际上是 假装是Chrome浏览器 没有用户界面。 然后,当然最 强劲,但最慢的选择, 是硒的浏览器自动化。 不幸的是, 你不会是 能够将您CS50 IDE中做到这一点。 因为基本上什么 做的是它启动你的浏览器, 火狐,无论浏览器 要使用, 它跟踪,也许你的鼠标 运动,无论你输入, 它只是有点 自动执行此过程。 因此,它被开发作为一种 网站的自动化测试工具。 但很多人使用 硒刮网站 他们其他方面的 不少难度刮 与一些这些,更快的工具。 所以,这就是我已经得到了网页抓取。 玩的开心。 听众:问题。 ROBERT KRABEK:是的。 听众:有没有一种机制来哈希 该网站让你可以基本上 通过它以后。 ROBERT KRABEK:是的。 所以,我们把在我们 例如,对于他们两个, 我们把整个网站成文档。 所以你实际上可以只取 可变文档,并将其写入文件。 所以,如果我想,我可以 写出来为HTML文件, 然后,而不是使用 OpenURI和卷曲的要求, 那么我可以只打开文档 HTML,然后搜索了。 听众:但是你能保持 在线体验排序 而你做下线。 例如。当你在 飞行数小时, 我想基本上存档 整个网站。 [听不清] ROBERT KRABEK:是啊,这是exactly-- 所以从字面上这是什么做 是它采取的一切 这将是在这个网址。 因此,如果我们跑卷曲,这是 采取这一切的HTML, 和它的存储它 里面的可变文档。 所以,那么你可以做任何 你想要做的文档。 可以输出到一个文件。 听众:但它不是挂了起来。 这不是动态的。 这不是递归的,对不对? 你明白我的意思吗? 我试图排序基本上是哈希 在我的硬盘驱动器的整个网站 所以,我基本上可以做到这一点 几个小时没有互联网。 ROBERT KRABEK:对。 所以,如果我had--那么哪里是我的文件I / O? 因此,这是文件I / O。所以说,不是 这一点,我称之为craigslist.html。 我打开了。 我倒是看跌文档进去。 我关闭文件。 然后,仅仅因为CS50 IDE 是在云上,这是什么。 我可以去这里。 我可以下载该文件。 然后,这将是对我的硬盘驱动器。 所以,你可以这样做的。 或者,如果你在家里,不使用 CS50 IDE,像崇高什么的, 这是更容易,因为 这是所有本地可用, 不依赖于互联网。 听众:我明白了。 这是一个特别的问题。 你可以递归做到这一点,这样你 走几层样的事情? 罗伯特KRABEK:我可以下载文件夹 还有,如果这就是你在问什么。 听众:是的。 ROBERT KRABEK:酷。