【问题标题】:Scraping data to Google Sheets from a website that uses JavaScript从使用 JavaScript 的网站将数据抓取到 Google 表格
【发布时间】:2023-01-02 21:43:20
【问题描述】:

我正在尝试将数据从以下网站导入到 Google 表格。我想导入当天的所有比赛。

https://www.tournamentsoftware.com/tournament/b731fdcd-a0c8-4558-9344-2a14c267ee8b/Matches

我试过 importxmlimporthtml,但似乎这不起作用,因为该网站使用 JavaScript。我也尝试过使用 Aphipheny 但没有成功。

使用Apipheny时,报错信息是

'无法获取数据 - 请验证您的 API 请求:{DNS 错误'

【问题讨论】:

  • 指定您需要什么数据?每行包含很多数据,例如:BS U13 Semi final : [W] Uvin Gunawardena [5] - Pubudu Sathsara Melon [6] : 15-13 15-4

标签: javascript google-apps-script google-sheets web-scraping


【解决方案1】:

Tl;博士

改编自我的answerHow to know if Google Sheets IMPORTDATA, IMPORTFEED, IMPORTHTML or IMPORTXML functions are able to get data from a resource hosted on a website?(也是我发布的)

请花一些时间学习如何使用浏览器开发人员工具,以便您能够识别

  • 如果数据已经作为 JSON/文字 JavaScript 对象或其他形式包含在网页的源代码中
  • 如果网页正在执行 GET 或 POST 请求以检索数据,以及这些请求何时完成(即作为页面解析的某个点或事件)
  • 如果请求需要来自 cookie 的数据

关于如何使用网络浏览器查找有关要导入的网页/数据的有用详细信息的简要指南

  1. 打开源代码,查看是否包含所需数据。有时数据以 JSON 格式包含并使用 JavaScript 添加到 DOM。在这种情况下,可以使用 Google 表格函数或来自 Google Apps 脚本的 URL Fetch Service 检索数据。
  2. 假设您使用 Chrome。打开 Dev Tools,然后查看 Elements 选项卡。在那里你会看到 DOM。这可能有助于确定除了在可见元素上之外要导入的数据是否包含在隐藏/不可见元素(如 <script> 标签)中。
  3. 查看源代码,在那里您可能会看到 JavaScript 代码。它可能包含您要作为 JavaScript 对象(通常称为 JSON)导入的数据。

    有很多关于 + 的问题提到了使用 importhtml 和/或 importxml 的问题,这些问题已经有了答案,甚至许多包含可能会节省您的代码(JavaScript sn-ps、Google Apps 脚本函数等)必须使用具有更阶梯学习曲线的专门网络抓取工具。在此答案的底部有一个关于使用 Google 表格内置函数的问题列表,包括建议的解决方法的注释。

    Is there a way to get a single response from a text/event-stream without using event listeners? 上询问有关使用 EventSource 的问题。虽然这不能用于服务器端代码,但答案显示了如何使用 HtmlService 在客户端代码上使用它并将结果检索到 Google 表格。


    您已经意识到,Google 表格内置函数 importhtml()importxml()importdata()importfeed() 仅适用于不需要登录或其他形式的身份验证的静态页面。

    当使用 JavaScript 动态创建公共页面的内容时,无法使用这些功能访问它,另一方面,网站的网站管理员也可能有意阻止网络抓取。


    如何识别内容是否动态添加

    要使用 Chrome 检查内容是否动态添加,

    1. 打开源数据的 URL。
    2. F12打开 Chrome 开发者工具
    3. 控制+转移+P打开命令菜单。
    4. 开始输入javascript,选择禁用 JavaScript, 然后按进入运行命令。 JavaScript 现在被禁用。

      只要您打开 DevTools,JavaScript 就会在此选项卡中保持禁用状态。

      重新加载页面,查看是否显示了要导入的内容,如果显示则可以导入通过使用 Google 表格的内置函数,否则这是不可能的,但可以通过使用其他方式来做网页抓取.

      <1234565 class="剧透">

      根据Wikipedia网页抓取,网络收获, 要么网络数据提取data scraping用于websitesextracting data

      使用 robots.txt 来阻止网络爬虫

      网站管理员可以使用 robots.txt 文件来阻止对网站的访问。在这种情况下,结果将是#N/A Could not fetch URL

      用户代理的使用

      该网页可以设计为返回特殊的自定义消息而不是数据。


      下面是有关 Google 表格内置“网页抓取”功能如何工作的更多详细信息

      IMPORTDATA、IMPORTFEED、IMPORTHTML 和 IMPORTXML 能够从以下网站托管的资源中获取内容:

      • 公开可用。这意味着该资源不需要授权/登录任何服务即可访问它。
      • 内容是“静态的”。这意味着如果您使用现代网络浏览器的查看源代码选项打开资源,它将显示为纯文本。
        • 注意:Chrome 的检查工具显示已解析的 DOM;在其他作品中,网页的实际结构/内容可以通过 JavaScript 代码或浏览器扩展/插件动态修改。
      • 内容具有适当的结构。
        • IMPORTDATA 使用结构化内容作为 csvtsv 与资源的文件扩展名无关。
        • IMPORTFEED 使用标记内容作为 ATOM/RSS
        • IMPORTHTML 将标记内容作为 HTML 处理,其中包括正确标记的列表或表格。
        • IMPORTXML 将标记内容作为 XML 或其任何变体(如 XHTML)处理。
      • 内容未超过最大大小。谷歌没有透露这个限制,但当内容超过最大尺寸时会显示以下错误:

        url 内容中的资源超出了最大大小。

      • Google 服务器未被 robots.txt 或用户代理阻止。

      W3C Markup Validator 上,有几种工具可以检查资源是否已正确标记。

      关于 CSV 查看Are there known services to validate CSV files

      值得注意的是电子表格

      • 应该有足够的空间容纳导入的内容;根据this post,Google 表格的电子表格单元格限制为 1000 万个,列限制为 18278,单元格内容有 5 万个字符,即使是值或公式也是如此。
      • 它不能很好地处理大型单元内内容; “限制”取决于用户屏幕尺寸和分辨率,因为现在可以放大/缩小。

      参考

      有关的

      软件推荐

      网络应用

      下面的问题是关于不同的结果,#N/A Could not fetch URL


      类似问题

      其中一些问题可能会因为这个问题的重复而被关闭

【讨论】:

  • 当返回值的内容类型为text/event-stream时,在当前阶段由于超时问题无法使用UrlFetchApp、IMPORTXML、IMPORTHTML和IMPORTDATA。我认为检查响应内容类型和/或使用 text/event-stream 内容类型从服务器检索值的解决方法在您的答案中包含时也可能有用。 Ref
【解决方案2】:

ImportXML 适用于基本任务,但如果你认真地抓取,也不会让你走得太远:

  • 该方法仅适用于大多数基本网站(无法以这种方式抓取浏览器中呈现的 SPA,任何基本的 Web 抓取保护或连接问题都会中断流程,无法控制 HTTP 请求地理位置或重试次数)——yahoo finance 是不是一个简单的网站

  • 如果目标网站数据需要一些清理后处理,它会变得非常复杂,因为你现在是“用 excel 公式编程”,与用传统编程语言编写常规代码相比,这是一个相当痛苦的过程

  • 没有适当的启动和缓存控制,因此偶尔会触发该功能,如果 HTTP 请求失败,单元格将填充 ERR!价值观

我建议使用适当的工具(自动化框架 + 可以呈现 JS 驱动的网站的抓取引擎)并仅将 Google 表格用于基本存储目的: https://youtu.be/uBC752CWTew(用于自动化的 Pipedream + 用于抓取的 ScrapeNinja 引擎)

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 2022-10-31
    • 2023-01-15
    • 2023-01-15
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多