首页 > 解决方案 > 网页抓取 redoc web api

问题描述

我目前正在学习网络抓取,我的任务之一是使用使用Redoc 的 API 文档:OpenAPI/Swagger-generated API 参考文档https : //github.com/Redocly/redoc

为了学习结构,我去了他们的 github 并点击了现场演示

我正在使用 Scrapy,这是我用来简单地提取网站 HTML 的代码:

import scrapy

class QuoteSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://redocly.github.io/redoc/'
    ]

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = f'quotes-{page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body)

问题是,在刮板运行后,如预期的那样创建了一个新文件,但是它缺少大部分 HTML(在容器 div 内)。

你们有没有人遇到过这个问题,尤其是redoc?如果是这样,您是如何解决的?您是否认为这是不允许对其进行抓取的此文档生成器的配置?

谢谢!

标签: pythonhtmlweb-scrapingscrapydocumentation

解决方案


Redoc 是一个 React 应用程序,这意味着实际的 HTML 是在运行时构建的:

  • 首先加载页面的骨架,它也加载redoc javascript
  • 然后 Redoc 下载 OpenAPI json(或 yaml)文件并基于它动态呈现实际的 HTML

这对于许多使用现代 JS 框架(vuejs、react、angular)构建的应用程序来说是相似的。要抓取这些,您必须在浏览器中实际加载页面以运行所有 javascript。

我相信现在最常见的方法是使用puppeteer(有一个 python 绑定:https ://github.com/pyppeteer/pyppeteer/ )


推荐阅读