如何通过Ruby使用Selenium从复杂的网页中提取信息

b91juud3  于 2023-06-05  发布在  Ruby
关注(0)|答案(2)|浏览(513)

作为一个实验,我想测试如何使用Ruby,Selenium和Web驱动程序来访问一个复杂的网站。在这个测试中,我想我可以访问flights.google.com,看看如何在页面上找到一些东西,快速浏览一下视觉上看起来简单但复杂的生成视图的动态本质。
看起来很简单例如,站点为flights.google.com,输入两个目的地点(例如SFO到LAX),URL将为https://www.google.com/travel/flights/search?tfs=CBwQAhogEgoyMDIzLTA2LTE0KABqBwgBEgNTRk9yBwgBEgNMQVgaIBIKMjAyMy0wNi0xOCgAagcIARIDTEFYcgcIARIDU0ZPQAFIAXABggELCP___________wGYAQE
现在,当页面生成时,您会得到一些很好的航班显示列表,如果我想找到一个结果,它不是一个可读的命名项目集。

<div class="yR1fYc" jsaction="click:O1htCb;gP4E0b:O1htCb;DIjhEc:YmNhJf" jsname="BXUrOb">
<div class="mxvQLc ceis6c uj4xv uVdL1c A8qKrc" jsname="HSrbLb">…</div>
</div>

我通常会使用Webdriver和Selenium

require 'selenium-webdriver'
require 'capybara'

driver = Selenium::WebDriver.for :chrome
driver.get 'https://www.google.com/flights/'

然后使用查找元素的方法处理一些命名元素

flights = driver.find_elements_by_class_name('flight')

在这种情况下,它是一个更神秘的名称,所以不知道如何解决这个问题,如果我假设类的名称可能是动态生成的。
有什么建议或办法吗?

bxfogqkk

bxfogqkk1#

TL;DR

如果混淆是故意的并且不断发展,您可能无法永久解决问题。但是,对于那些不故意违反标准的网站,您可以遵循一些最佳实践。您可能只需要重新构建您的解决方案,以便在面对动态内容时不那么脆弱,并找出页面上的哪些内容没有改变。

分析及建议

如果您正在处理动态生成的内容,则需要以下一项或多项:

  • 一个可以为JavaScript依赖的站点呈现JavaScript的驱动程序,但不是所有的驱动程序都可以。
  • 您的Chrome驱动程序可以,但可能不会以与其他JavaScript驱动程序相同的方式呈现;其他的可能值得一试。
  • 如果Google故意使用Chrome的功能来混淆页面,使用不同的JavaScript驱动程序或引擎可能会有所帮助。YMMV与此。
  • 如果不能依赖给定的类或ID名,可以使用某种父子、第n个元素或基于容器的搜索来查找所需的内容。
  • 如果您知道有可靠的前缀、后缀或其他基于字符串的逻辑来识别您想要的数据或HTML元素附近的文本,那么您应该愿意将方法更改为整页regexp或固定字符串搜索。
  • 考虑在可用时对纯HTML版本的网站进行测试。
  • 你可以用felinks或类似的东西来测试,看看没有JavaScript会呈现什么。
  • 您可以搜索他们的屏幕阅读器或辅助功能启用的页面,以查找您试图查找的内容。
  • 您可以查看它们是否支持Web Accessibility Initiative Accessible Rich Internet Applications WAI-ARIA或类似的可以正确解析的优雅降级接口。
  • 请考虑API访问。
  • 有时,当有RESTful或GraphQL选项可用时,Web抓取是解决数据检索问题的错误方法。
  • 例如,Google曾经提供Google Flight Search (GFS),但似乎已经停止了。我没有找到一个替代品,但我只花了大约30秒试图找到一个。

例如,如果您可以依赖于给定div容器中的某个地方的“First Name”,则可以使用XPath表达式查找父容器,然后从那里进行更结构化或更宽松的搜索。
水豚是相当强大的,但有时你必须做自己的解析。如果发生这种情况,看看Nokogiri提供了什么,看看你是否可以做你想要的,即使你必须执行多个提取/搜索步骤来完成它。
并不是所有的事情都有一行程序作为解决方案。动态网站被设计成破坏标准工具,如机械化或基于CSS的解析器,我想,这样做通常是有原因的,即使它经常破坏与标准的兼容性。假设他们也没有故意破坏辅助功能,如ALT文本或其他辅助功能属性,你可能会考虑利用这些或类似的辅助功能,因为商业网站通常需要满足ADA或508节标准,无论他们如何滥用DOM。

yquaqz18

yquaqz182#

你仍然可以依靠结构,因为结构不是随机的;像这样的CSS选择器应该能够给予你结果的列表元素,而不依赖于类名:

body > c-wiz:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) >
c-wiz:nth-of-type(1) > div:nth-of-type(1) >
c-wiz:nth-of-type(1) > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(3) >
ul:nth-of-type(1) > li

相关问题