上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: xiaooooooo - 

js动态加载的内容如何获取

[复制链接]
  • TA的每日心情
    开心
    2023-7-13 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    9

    主题

    93

    回帖

    120

    积分

    中级工程师

    积分
    120

    油中2周年油中3周年

    发表于 2023-6-5 22:02:41 | 显示全部楼层

    大佬 elmGetter 这个脚本能不能获取一些流式数据?比如说websocket发送的字节流、弹幕之类的
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-6-5 22:24:13 | 显示全部楼层
    xiaooooooo 发表于 2023-6-5 22:02
    大佬 elmGetter 这个脚本能不能获取一些流式数据?比如说websocket发送的字节流、弹幕之类的 ...

    不能,这个不属于元素获取的范畴,你应该考虑劫持请求或者劫持对应函数,当然如果数据以元素的方式呈现,比如弹幕会在屏幕上生成元素,这种就可以用库抓取。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-7-13 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    9

    主题

    93

    回帖

    120

    积分

    中级工程师

    积分
    120

    油中2周年油中3周年

    发表于 2023-6-6 00:37:59 | 显示全部楼层
    cxxjackie 发表于 2023-6-5 22:24
    不能,这个不属于元素获取的范畴,你应该考虑劫持请求或者劫持对应函数,当然如果数据以元素的方式呈现, ...

    ElementGetter对这个网站似乎失效了 我只能拿到第一页的数据 如果翻页的话还是拿不到第2页

    // ==UserScript==
    // @match        https://www.nmpa.gov.cn/datasearch/*
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=nmpa.gov.cn
    // @require      http://cdn.bootcss.com/jquery/1.11.2/jquery.js
    // @require      https://scriptcat.org/lib/513/2.0.0/ElementGetter.js
    // @grant        GM_xmlhttpRequest
    // ==/UserScript==

    (function() {
        'use strict';

        elmGetter.selector($);
        elmGetter.each('tbody tr.el-table__row', items_name => {
            console.log(items_name);
            console.log('page is fully loaded');
            console.log('xx');
            var dataList = [];
            for (var i=0; i<items_name.length; i++){
                var xuhao = $(items_name).find('td.el-table_1_column_1 div.cell div').text();
                var pizhunwenhao = $(items_name).find('td.el-table_1_column_2 div.cell p').text();
                var chanpinmingcheng = $(items_name).find('td.el-table_1_column_3 div.cell p').text();
                var shengchandanwei = $(items_name).find('td.el-table_1_column_4 div.cell p').text();
                var yaopinbenweima = $(items_name).find('td.el-table_1_column_5 div.cell span span div.el-popover__reference').text();
                var xiangqing = $(items_name).find('td.el-table_1_column_6 div.cell button span').text();
                dataList.push({
                    'xuhao': xuhao,
                    'pizhunwenhao': pizhunwenhao,
                    'chanpinmingcheng': chanpinmingcheng,
                    'shengchandanwei': shengchandanwei,
                    'yaopinbenweima': yaopinbenweima,
                    'xiangqing': xiangqing
                })


            }
            console.log(dataList);

            
        });

        // Your code here...
    })();
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-6-6 22:42:28 | 显示全部楼层
    xiaooooooo 发表于 2023-6-6 00:37
    ElementGetter对这个网站似乎失效了 我只能拿到第一页的数据 如果翻页的话还是拿不到第2页

    // ==UserScr ...

    因为你定位的元素本身没有发生替换,实际是同一个父元素下对子元素进行了替换,可以换种思路,监听子元素的插入行为,再定位到父级:
    1. elmGetter.each('tbody tr.el-table__row .el-table_1_column_1', column1 => {
    2.     const items_name = column1.parent();
    3. });
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-7-13 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    9

    主题

    93

    回帖

    120

    积分

    中级工程师

    积分
    120

    油中2周年油中3周年

    发表于 2023-6-7 11:29:05 | 显示全部楼层
    cxxjackie 发表于 2023-6-6 22:42
    因为你定位的元素本身没有发生替换,实际是同一个父元素下对子元素进行了替换,可以换种思路,监听子元素 ...

    谢谢大佬 这个代码我尝试了一下似乎没有出现对应的效果
    可否再另外请教您一个元素定位的问题?就是我下面写的这个路径定位不到对应的文本是什么原因?就是我打印这个dataList出来是空白的
    var xuhao = $(items_name).find('td.el-table_1_column_1 div.cell div').text();
                var pizhunwenhao = $(items_name).find('td.el-table_1_column_2 div.cell p').text();
                var chanpinmingcheng = $(items_name).find('td.el-table_1_column_3 div.cell p').text();
                var shengchandanwei = $(items_name).find('td.el-table_1_column_4 div.cell p').text();
                var yaopinbenweima = $(items_name).find('td.el-table_1_column_5 div.cell span span div.el-popover__reference').text();
                var xiangqing = $(items_name).find('td.el-table_1_column_6 div.cell button span').text();
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-6-7 21:08:31 | 显示全部楼层
    xiaooooooo 发表于 2023-6-7 11:29
    谢谢大佬 这个代码我尝试了一下似乎没有出现对应的效果
    可否再另外请教您一个元素定位的问题?就是我下面 ...

    这网站有点怪,我昨天测试的时候还能抓到元素插入的,今天又变成文本修改了,虽然有可能通过监听其他元素来实现,不过不太好找切入点,直接双管齐下了:
    1. function getDataList(p) {
    2.     const items_name = p.parents('tr.el-table__row').eq(0);
    3.     return {
    4.         'xuhao': items_name.find('td.el-table_1_column_1').text(),
    5.         'pizhunwenhao': items_name.find('td.el-table_1_column_2').text(),
    6.         'chanpinmingcheng': items_name.find('td.el-table_1_column_3').text(),
    7.         'shengchandanwei': items_name.find('td.el-table_1_column_4').text(),
    8.         'yaopinbenweima': items_name.find('td.el-table_1_column_5').text(),
    9.         'xiangqing': items_name.find('td.el-table_1_column_6').text()
    10.     };
    11. }
    12. elmGetter.selector($);
    13. elmGetter.each('.el-table_1_column_5 p', p => {
    14.     const dataList = getDataList(p);
    15.     console.log(dataList);
    16. });
    17. const MutationObserver = window.MutationObserver || window.WebkitMutationObserver || window.MozMutationObserver;
    18. const observer = new MutationObserver(mutations => {
    19.     for (const mutation of mutations) {
    20.         const parentNode = $(mutation.target.parentNode);
    21.         if (parentNode.is('.el-table_1_column_5 p')) {
    22.             const dataList = getDataList(parentNode);
    23.             console.log(dataList);
    24.         }
    25.     }
    26. });
    27. observer.observe(document, {subtree: true, characterData: true});
    复制代码

    这个库我有考虑过做文本监听,就是不好解决“在监听文本修改的回调函数中修改文本会陷入死循环”这种问题,所以一直搁置,可能后面我想到了什么解决方案再加进来。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-7-13 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    9

    主题

    93

    回帖

    120

    积分

    中级工程师

    积分
    120

    油中2周年油中3周年

    发表于 2023-6-8 02:10:57 | 显示全部楼层
    cxxjackie 发表于 2023-6-7 21:08
    这网站有点怪,我昨天测试的时候还能抓到元素插入的,今天又变成文本修改了,虽然有可能通过监听其他元素 ...

    it works!
    谢大佬 好强 待我消化一下这一堆语法
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-7-13 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    9

    主题

    93

    回帖

    120

    积分

    中级工程师

    积分
    120

    油中2周年油中3周年

    发表于 2023-6-10 15:54:51 | 显示全部楼层
    本帖最后由 xiaooooooo 于 2023-6-10 18:48 编辑

    大佬 我可以在这个问题的基础上追问一个吗?还是这个网站

    // @match        https://wenshu.court.gov.cn/website/wenshu/*
    // @require      http://cdn.bootcss.com/jquery/1.11.2/jquery.js
    // @require      https://scriptcat.org/lib/513/2.0.0/ElementGetter.js
    // @grant        GM_xmlhttpRequest

    // ==/UserScript==

    (function() {
        'use strict';


        elmGetter.selector($);
        elmGetter.each('div.detailBox div.item_table', company_name => {
            console.log(company_name);
            console.log('page is fully loaded');
            console.log('xx');
            var dataList = [];
            for (var i=0; i<company_name.length; i++){
                var title = $(company_name).find('div.PDF_title').text();
                var casenumber = $(company_name).find('div.ahdiv').text();
                var judgedate = $(company_name).find('tbody tr')[1].find('td')[1].text();
                var casecontent = $(company_name).find('div.PDF_pox div').text();
                dataList.push({
                    'title': title,
                    'casenumber': casenumber,
                    'judgedate': judgedate,
                    'casecontent':casecontent
                });
            }
            console.log(dataList);
        });
        // Your code here...
    })();

    本来我一开始想用elmGetter.get的,因为并不需要循环列表,但是获取不到内容,只能又套用elmGetter.each的写法,也没有获取到dataList,可否指点我一下?

    另:请问这种元素监听有没有好的调试方法?感觉我每次都是硬套框架也不是个办法

    至今就没成功过几个
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-6-10 23:18:38 | 显示全部楼层
    本帖最后由 cxxjackie 于 2023-6-10 23:23 编辑
    xiaooooooo 发表于 2023-6-10 15:54
    大佬 我可以在这个问题的基础上追问一个吗?还是这个网站

    // @match        https://wenshu.court.gov.cn ...

    你这个代码有好几处错误:首先是选择器写的不好,item_table有3个而你只需要1个,父级太宽泛也容易出现之前说过的父级先于子级插入的情况,此时在父级中获取子级就会是空的;其次是遍历company_name时少写了i,其实库的设计中each每次只会返回1个元素,所以没有必要对其遍历,直接操作即可;最后是jQuery的下标访问返回的是元素节点而非jQuery节点,不能直接find,除非用$()套一下,或者用eq访问。代码修改后如下:
    1. elmGetter.selector($);
    2. elmGetter.each('.PDF_box', company_name => {
    3.     console.log(company_name);
    4.     console.log('page is fully loaded');
    5.     console.log('xx');
    6.     var dataList = [];
    7.     var title = company_name.find('div.PDF_title').text();
    8.     var casenumber = company_name.find('div#ahdiv').text();
    9.     var judgedate = company_name.find('tbody tr').eq(1).find('td').eq(1).text();
    10.     var casecontent = company_name.find('div.PDF_pox div').text();
    11.     dataList.push({
    12.         'title': title,
    13.         'casenumber': casenumber,
    14.         'judgedate': judgedate,
    15.         'casecontent':casecontent
    16.     });
    17.     console.log(dataList);
    18. });
    复制代码
    这类不需要获取多次的还可以用get+数组的方式来获取,需要对选择器写法有一定了解:
    1. elmGetter.selector($);
    2. elmGetter.get([
    3.     '.PDF_box .PDF_title',
    4.     '.PDF_box #ahdiv',
    5.     '.PDF_box tr:nth-child(2) > td:nth-child(2)',
    6.     '.PDF_box .PDF_pox div',
    7. ]).then(([title, casenumber, judgedate, casecontent]) => {
    8.     const dataList = {
    9.         'title': title.text(),
    10.         'casenumber': casenumber.text(),
    11.         'judgedate': judgedate.text(),
    12.         'casecontent':casecontent.text()
    13.     };
    14.     console.log(dataList);
    15. });
    复制代码
    调试的话可以用这种方式观察元素插入的情况(最好指定详细的父级以避免元素过多):
    1. elmGetter.selector('css');
    2. elmGetter.each('*', document.body, el => {
    3.     console.log(el.cloneNode(true));
    4. });
    复制代码

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-7-13 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    9

    主题

    93

    回帖

    120

    积分

    中级工程师

    积分
    120

    油中2周年油中3周年

    发表于 2023-6-11 00:04:38 | 显示全部楼层
    cxxjackie 发表于 2023-6-10 23:18
    你这个代码有好几处错误:首先是选择器写的不好,item_table有3个而你只需要1个,父级太宽泛也容易出现之 ...

    谢谢 非常耐心、详细的解答。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表