阿水的世界。

标签 #shadow-root(open)反爬措施 下的文章

02月 19

easyspider采集内容遇到#shadow-root(open)反爬措施解决办法

使用采集字段的采集内容类型设置:(针对该元素的)JavaScript代码返回值(需以return 开头)

使用javascript脚本内容如下:

return (function() {
    // 假设XPath表达式已经给出承载#shadow-root(open)元素的父节点定位,例如:'//div[@id="TabContent_e19c965497fcdcc686df0ae5a39702c32"]',
    const xpath = '//div[@id="TabContent_e19c965497fcdcc686df0ae5a39702c32"]';//这句需要修改定位内容,其他内容不用修改
    
    // 使用 document.evaluate 方法执行XPath查询
    const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    const shadowHost = result.singleNodeValue;
    
    if (!shadowHost) {
        console.error('未找到匹配的元素');
        return '未找到匹配的元素';
    }
    
    // 检查是否可以直接访问 shadowRoot 属性
    if (shadowHost.shadowRoot) {
        // 如果可以访问,则返回其 innerHTML
        return shadowHost.shadowRoot.innerHTML;
    } else if (typeof shadowHost.getRootNode === 'function') {
        // 使用 getRootNode 方法尝试获取 open 或 closed Shadow Root
        const rootNode = shadowHost.getRootNode();
        if (rootNode instanceof ShadowRoot) {
            // 如果是 ShadowRoot 实例,返回其 innerHTML
            return rootNode.innerHTML;
        }
    }
    
    // 如果无法访问 Shadow DOM,返回错误信息
    console.error('无法访问指定元素的 Shadow DOM');
    return '无法访问指定元素的 Shadow DOM';
})();