如何抓取 javascript 哈希链接内容?

2024-04-28

您好,我对使用 Puppeteer 进行网页抓取有点陌生,目前我面临下一个问题:

在我尝试提取信息的网站中,我有一个带有典型 js 分页的引导表,例如以下示例:https://getbootstrap.com/docs/4.1/components/pagination/ https://getbootstrap.com/docs/4.1/components/pagination/

当我用 Chrome 检查器检查页面 html 时,我能看到的是2当我检查链接位置时我看到

https://webpage.com/works# https://webpage.com/works#

我怎么知道一共有多少页?我如何点击它们?我不明白如何访问这种类型分页的每个页面。

Thanks!


没有万无一失的方法,但我按这个顺序处理分页,

  • 等待目标元素出现
  • 从目标收集数据
  • 删除目标元素
  • 单击下一步按钮
  • ...循环直到没有下一个按钮或即使在等待后内容也没有加载

概念证明:

目标 HTML 代码:

<!-- Copied from: https://jsfiddle.net/solodev/yw7y4wez -->
<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Pagination Example</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta name="robots" content="noindex, nofollow">
    <meta name="googlebot" content="noindex, nofollow">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="https://www.solodev.com/assets/pagination/jquery.twbsPagination.js"></script>
    <style type="text/css">
        .container {
            margin-top: 20px;
        }
        
        .page {
            display: none;
        }
        
        .page-active {
            display: block;
        }
    </style>

    <script type="text/javascript">
        window.onload = function() {

            $('#pagination-demo').twbsPagination({
                totalPages: 5,
                // the current page that show on start
                startPage: 1,

                // maximum visible pages
                visiblePages: 5,

                initiateStartPageClick: true,

                // template for pagination links
                href: false,

                // variable name in href template for page number
                hrefVariable: '{{number}}',

                // Text labels
                first: 'First',
                prev: 'Previous',
                next: 'Next',
                last: 'Last',

                // carousel-style pagination
                loop: false,

                // callback function
                onPageClick: function(event, page) {
                    $('.page-active').removeClass('page-active');
                    $('#page' + page).addClass('page-active');
                },

                // pagination Classes
                paginationClass: 'pagination',
                nextClass: 'next',
                prevClass: 'prev',
                lastClass: 'last',
                firstClass: 'first',
                pageClass: 'page',
                activeClass: 'active',
                disabledClass: 'disabled'

            });

        }
    </script>

</head>

<body>
    <div class="container">
        <div class="jumbotron page" id="page1">
            <div class="container">
                <h1 class="display-3">Adding Pagination to your Website</h1>
                <p class="lead">In this article we teach you how to add pagination, an excellent way to navigate large amounts of content, to your website using a jQuery Bootstrap Plugin.</p>
                <p><a class="btn btn-lg btn-success" href="https://www.solodev.com/blog/web-design/adding-pagination-to-your-website.stml" role="button">Learn More</a></p>
            </div>
        </div>
        <div class="jumbotron page" id="page2">
            <h1 class="display-3">Not Another Jumbotron</h1>
            <p class="lead">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
            <p><a class="btn btn-lg btn-success" href="#" role="button">Sign up today</a></p>
        </div>
        <div class="jumbotron page" id="page3">
            <h1 class="display-3">Data. Data. Data.</h1>
            <p>This example is a quick exercise to illustrate how the default responsive navbar works. It's placed within a <code>.container</code> to limit its width and will scroll with the rest of the page's content.
            </p>
            <p>
                <a class="btn btn-lg btn-primary" href="../../components/navbar" role="button">View navbar docs »</a>
            </p>
        </div>
        <div class="jumbotron page" id="page4">
            <h1 style="-webkit-user-select: auto;">Buy Now!</h1>
            <p class="lead" style="-webkit-user-select: auto;">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet.</p>
            <p style="-webkit-user-select: auto;"><a class="btn btn-lg btn-success" href="#" role="button" style="-webkit-user-select: auto;">Get
                    started today</a></p>
        </div>
        <div class="jumbotron page" id="page5">
            <h1 class="cover-heading">Cover your page.</h1>
            <p class="lead">Cover is a one-page template for building simple and beautiful home pages. Download, edit the text, and add your own fullscreen background photo to make it your own.</p>
            <p class="lead">
                <a href="#" class="btn btn-lg btn-primary">Learn more</a>
            </p>
        </div>
        <ul id="pagination-demo" class="pagination-lg pull-right"></ul>
    </div>

    <script>
        // tell the embed parent frame the height of the content
        if (window.parent && window.parent.parent) {
            window.parent.parent.postMessage(["resultsFrame", {
                height: document.body.getBoundingClientRect().height,
                slug: "yw7y4wez"
            }], "*")
        }
    </script>
</body>

</html>

这是代码的示例工作版本,

const puppeteer = require('puppeteer');

async function runScraper() {
  let browser = {};
  let page = {};
  const url = 'http://localhost:8080';

  // open the page and wait
  async function navigate() {
    browser = await puppeteer.launch({ headless: false });
    page = await browser.newPage();
    await page.goto(url);
  }

  async function scrapeData() {
    const headerSel = 'h1';
    // wait for element
    await page.waitFor(headerSel);
    return page.evaluate((selector) => {
      const target = document.querySelector(selector);

      // get the data
      const text = target.innerText;

      // remove element so the waiting function works
      target.remove();
      return text;
    }, headerSel);
  }

  // this is a sample concept of pagination
  // it will vary from page to page because not all site have same type of pagination

  async function paginate() {
    // manually check if the next button is available or not
    const nextBtnDisabled = !!(await page.$('.next.disabled'));
    if (!nextBtnDisabled) {
      // since it's not disable, click it
      await page.evaluate(() => document.querySelector('.next').click());

      // just some random waiting function
      await page.waitFor(100);
      return true;
    }
    console.log({ nextBtnDisabled });
  }

  /**
   * Scraping Logic
   */
  await navigate();

  // Scrape 5 pages
  for (const pageNum of [...Array(5).keys()]) {
    const title = await scrapeData();
    console.log(pageNum + 1, title);
    await paginate();
  }
}

runScraper();

Result:

Server running at 8080
1 'Adding Pagination to your Website'
2 'Not Another Jumbotron'
3 'Data. Data. Data.'
4 'Buy Now!'
5 'Cover your page.'
{ nextBtnDisabled: true }

我没有分享服务器代码,它基本上是上面的 html 片段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何抓取 javascript 哈希链接内容? 的相关文章

  • 是否存在 IsCallable 为 false 但 IsConstructor 为 true 的 JS 对象?

    ECMAScript 规范函数可调用 https www ecma international org ecma 262 6 0 index html sec iscallable当且仅当其参数具有 Call 内部方法时返回 true 它在
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0

随机推荐

  • 使用VBA抓取实时数据

    我想从中抓取实时数据https iboard ssi com vn bang gia hose https iboard ssi com vn bang gia hose使用VBA 我的代码如下 但它不会返回其中包含数据的 html 文件
  • 什么是依赖注入的 Pythonic 方式?

    介绍 对于 Java 依赖注入作为纯 OOP 工作 即您提供要实现的接口 并在框架代码中接受实现定义的接口的类的实例 现在对于 Python 您可以执行相同的操作 但我认为该方法对于 Python 而言开销太大 那么如何以 Pythonic
  • Swashbuckle IDocumentFilter 实现 - 如何将 ActionDescriptor.MethodInfo 链接到操作

    项目 ASP Net Core 2 2 Web API 软件包 Swashbuckle AspNetCore 4 0 1 我正在写一个实现Swashbuckle AspNetCore SwaggerGen IDocumentFilter它在
  • 缓慢的 data.frame 行分配

    我正在使用 RMongoDB 需要用查询的值填充空的 data frame 结果相当长 大约有 200 万个文档 行 当我进行性能测试时 我发现将值写入行的时间随着数据帧的维度的增加而增加 也许这是一个众所周知的问题 而我是最后一个注意到它
  • 当元素被覆盖时取消 mouseout 事件

    希望这个 JSFiddle 能比我的话更好地说明这个问题 http jsfiddle net pmwRc 6 http jsfiddle net pmwRc 6 当地图悬停时 我在图像地图上显示绝对定位的 H4 作为标签 但是 当鼠标指针移
  • $.fn.function 的调用函数

    问题如下 有一个函数自定义 jquery 函数 里面有另一个函数 例如 fn slides function args function foo args 我现在的问题是 我如何调用方法 foo foo不是一种方法 这是一个本地函数 除非您
  • 字符串等于和 == 与字符串连接[重复]

    这个问题在这里已经有答案了 我试图理解字符串连接与字符串比较的输出 需要明确的是 我有一个类使用 和 equals 来比较两个字符串 我试图将 和 equals 的输出连接到一个字符串 equals 的输出是 concats 但是 的输出是
  • Android Fragment onCreateView 与 onActivityCreated

    我知道片段的视图层次结构必须在 onCreateView 中膨胀 但是 onCreateView 中还可以包含哪些其他功能 而不是应该等待 onActivityCreated 我当前的实现对所有内容都使用单独的活动 典型的活动在其 onCr
  • PHP 路由 - 样式表无效

    我用 PHP 创建了一个基本的路由系统 url 被分割成一个数组 这样我就可以根据 URL 决定显示什么 例如 www domain com page option param 因此 在我的index php 中 我为页眉 内容和页脚定义了
  • 如何在触摸时旋转图像并将图像拖动到另一个图像上

    我正在开发一个应用程序 我需要一个包含许多图像的图库 我想要做的是 当用户点击 单击任何图像时 它应该将该图像旋转到 90 度 如果用户将任何图像拖动到任何其他图像的顶部 那么这些图像应该交换它们的位置 或者我们可以说交换 彼此的位置 解释
  • UITableView:使用 moveRowAtIndexPath:toIndexPath: 和 reloadRowsAtIndexPaths:withRowAnimation: 一起出现损坏

    我想使用 iOS 5 漂亮的行移动调用来为表格视图设置动画以匹配某些模型状态更改 而不是旧式的删除和插入 更改可能包括重新排序和就地更新 并且我想对两者进行动画处理 因此某些行需要reloadRowsAtIndexPaths But UIT
  • 在 Python/Pandas 中执行不同操作的许多列上有条件地聚合分组数据

    考虑以下简化的示例数据帧df Department CustomerID Date Price MenswearDemand HomeDemand 0 Menswear 418089 2019 04 18 199 199 0 1 Mensw
  • React 测试库:测试属性/prop

    我正在使用 TypeScript 编写一个 React 应用程序 我使用material ui作为我的组件 使用react testing library作为我的单元测试 我正在为 Material ui 的 Grid 组件编写一个包装器
  • PhantomJs超时

    我使用 Jasmine 和 PhantomJS 来运行测试用例 在我的典型测试用例中 我拨打服务电话 等待响应并确认响应 有些请求可能会在几秒钟内返回 有些请求可能需要一分钟才能返回 当通过 PhantomJS 运行时 测试用例因服务调用而
  • 从 MS Graph API 获取联系人时找不到资源

    我尝试了下面的 github 示例进行 Azure AD 身份验证 并成功通过正确的回调 URL 获取访问令牌 https github com Microsoft BotBuilder Samples tree master sample
  • xpath查询到xpath查询结果

    例如我们有这个 xml a b b a
  • airflow webserver 命令失败并显示 {filesystemcache.py:224} 错误 - 不允许操作

    我正在 Cent OS 7 上安装 Airflow 我已经配置了 Airflow db init 并检查了 nginx 服务器的状态及其工作正常 但是当我运行airflow webserver命令时 我收到下面提到的错误 2021 03 2
  • WCF 服务限制

    我在控制台应用程序中部署了一个 WCF 服务 并启用了 BasicHTTPBinding 和 SSL 还设置了以下属性 AspNetCompatibilityRequirements RequirementsMode AspNetCompa
  • Chrome 扩展程序端口错误:无法建立连接。接收端不存在

    当我尝试从弹出窗口向我的内容脚本发送消息时 出现此错误 我想做的是从 content js 获取当前选项卡的文档并将其发送到弹出窗口 我该如何修复这个错误 manifest version 2 name Chrome Snapshot de
  • 如何抓取 javascript 哈希链接内容?

    您好 我对使用 Puppeteer 进行网页抓取有点陌生 目前我面临下一个问题 在我尝试提取信息的网站中 我有一个带有典型 js 分页的引导表 例如以下示例 https getbootstrap com docs 4 1 component