我正在用硒和nokogiri抓取instagram,我想优化自己的代码

问题描述

首先,英语不是我的母语,对不起,如果您以奇怪的方式写东西。 一位老师要求我下载instagram个人资料的图片,因此我决定使用红宝石,硒和nokogiri。在经历了很多不幸之后,我做到了,但是我想的不是很好。现在,我选择每个 img 元素,然后使用ruby查找其中的链接。

arr = doc.search('img').map(&:values)

images = []
arr.each do |ele|
  ele.each do |link|
    if link.include?("cover")
      images << ele[-2]
    end
  end
end

我似乎无法找到一种仅使用nokogiri查找链接的好方法。 链接位于 srcset 中,但我无法使用nokogiri的通用方式访问它,我认为可以搜索它,但我不知道如何。 我知道不推荐这样做,但我提供了一张图片,因为格式很难看。 Nokogiri pic

除此之外,我还有一个关于滚动的问题,因为正确地知道我只是在硬编码一些这样的滚动:

driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
sleep 1
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
sleep 2

我以为也许我可以监视arr = doc.search('img').map(&:values)的长度,但是如果我添加更多的滚动条,则长度开始缩小,我还不知道为什么。

因此您可以看到我的代码很烂。我想对nokogiri和selenium Web驱动程序有更好的了解,如果有人可以推荐一个很好的资源来学习这些主题(或者也许我只需要第三次阅读文档?),我将非常感谢。 / p>

最后,这里是完整代码https://pastebin.com/fscHf6Ah的链接,因为也许有人可以总体上给我指点。 在此先感谢您抽出宝贵的时间来阅读和帮助。

解决方法

我建议着重于基础知识,因为它们比Nokogiri和Selenium的任何细节都更重要且适用范围更广:

变量命名

links是一个体面的变量名的示例。但是,sele2clean很少说明它们是什么以及它们服务的目的。我猜它们是什么(我可能会误解),更合适的名称是:attrs_with_slash_pattrimg_rel_urls

我鼓励您甚至使用词典和同义词库来帮助查找更好的名称和单词。即使英语是我的第一语言,我也一直这样做!

变量命名2

通常,如果您无法为某件事起一个好名字,则可以对代码进行重组,以便您创建可以用好名字更好地识别的不同“事物”。恰当的例子:“ attrs_with_slash_p”既是笨拙的名称,又是要创建的笨拙的“事物”(抽象)。

这是一个替代示例:

link_attrs = links.flat_map { |ele| ele.to_a }
# "link_attrs" is a more natural name and "thing"

img_rel_urls = link_attrs.flat_map do |attr|
  attr.scan(/\/p\/.+/) # .include?('/p') not needed,this produces a strict subset
end

使用Ruby / w Enumerable

您将从上面的示例中看到,我使用了flat_map / map而不是each<<

与许多其他语言相比,Ruby的Enumerable具有非常强大且有用的API。和他们一起玩,了解他们的工作。充分利用其半功能性界面将大大改善您的代码。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...