傻瓜式提取网页数据的油猴脚本(JavaScript 代码)

这篇具有很好参考价值的文章主要介绍了傻瓜式提取网页数据的油猴脚本(JavaScript 代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

一、脚本适用范围

二、将脚本配置到浏览器

三、脚本用法

四、脚本原理

五、脚本代码


一、脚本适用范围

脚本适用范围:一次性提取任意网站的布局类似的数据,例如 淘宝的商品价格、微博的热搜标题、必应搜索的图片链接

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

脚本不适用范围:页面布局不相似的数据。如下图圈出了两种样式的数据,不能一次性提取,需要手动分两次提取。

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

二、将脚本配置到浏览器

步骤:

(1)浏览器安装Tampermonkey(中文名 油猴、篡改猴)(可参考:油猴(Tampermonkey)安装教程-CSDN博客)

(2)将脚本源码(见本文最后一章节)保存到 Tampermonkey (中文名 油猴、篡改猴)中(可参考:)

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

(3)之后每次打开任意一个网页,浏览器页面右下角会出现三个输入框和一个按键,如下图

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

三、脚本用法

步骤:

(1)从类似的数据中选择两条,拷贝它们的 xpath 粘贴到脚本生成的前两个输入框中

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

(2)填入数据对应的标签的属性名称到第三个框中,如果不填,则提取标签体的文本(innerText)

js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本js 油猴脚本 属性,爬虫,爬虫,网站数据爬取,xpath,提取网页数据,javascript,Tampermonkey,油猴脚本

(3)点击提取数据,会出现弹窗,说明运行结果。成功提取出的数据会被拷贝到粘贴板,直接Ctrl+V即可粘贴

四、脚本原理

如果元素样式类似,则它们在HTML源码的标签树路径应该是类似的(xpath路径就是寻找元素的一种方式)。

给定两个xpath:

/html/body/div[1]/div[1]/div[2]/div[3]/div/div/div[14]/div/div/div/div/span[2]/span[1]

/html/body/div[1]/div[1]/div[2]/div[3]/div/div/div[17]/div/div/div/div/span[2]/span[1]

找出它们的数字差异,删除,得到的xpath即可匹配页面中所有类似的元素

/html/body/div[1]/div[1]/div[2]/div[3]/div/div/div/div/div/div/div/span[2]/span[1]

再给出需要提取的数据在标签中对应的属性名称,就可以提取出需要的数据

五、脚本源码

 脚本源码(JavaScript):文章来源地址https://www.toymoban.com/news/detail-815704.html

// ==UserScript==
// @name         傻瓜式提取网页数据
// @namespace    gzp
// @version      0.1
// @description  用XPath与属性名提取数据
// @author       gzp
// @match        *://*/*
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function () {
    'use strict';
    // 给页面添加输入框与按键,并绑定回调函数。clickFunction 为点击按键时的回调函数
    function insertElement(clickFunction) {
        // 创建 XPath 输入框 1
        let xpathInput1 = document.createElement("input");
        xpathInput1.setAttribute('type', 'text')
        xpathInput1.setAttribute('placeholder', '填写第一个标签的XPath路径')
        xpathInput1.setAttribute('id', xpathInputId1)
        xpathInput1.style.cssText = 'font-weight: normal; border: 2px solid #5813fe;box-shadow: 0px 0px 12px 0px rgba(98, 19, 254, 0.6); border-radius: 5px; height: 32px;width: 350px;margin: 5px; padding-left: 10px;'
        // 创建 XPath 输入框 1
        let xpathInput2 = document.createElement("input");
        xpathInput2.setAttribute('type', 'text')
        xpathInput2.setAttribute('placeholder', '填写第二个标签的XPath路径')
        xpathInput2.setAttribute('id', xpathInputId2)
        xpathInput2.style.cssText = 'font-weight: normal; border: 2px solid #5813fe;box-shadow: 0px 0px 12px 0px rgba(98, 19, 254, 0.6); border-radius: 5px; height: 32px;width: 350px;margin: 5px; padding-left: 10px;'
        // 创建 需要提取的属性名称
        let attributeInput = document.createElement("input");
        attributeInput.setAttribute('type', 'text')
        attributeInput.setAttribute('placeholder', '输入需要的属性名称(不输入时提取标签内文本)')
        attributeInput.setAttribute('id', attributeInputId)
        attributeInput.style.cssText = 'font-weight: normal; border: 2px solid #5813fe;box-shadow: 0px 0px 12px 0px rgba(98, 19, 254, 0.6); border-radius: 5px; height: 32px;width: 350px;margin: 5px; padding-left: 10px;'
        // 创建 按键
        let extractButton = document.createElement('button')
        extractButton.setAttribute('id', 'extractButton')
        extractButton.textContent = '提取数据'
        extractButton.style.cssText = 'background-color: #4CAF50;  border: none; color: white; margin: 5px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px;border-radius: 5px; height: 32px;padding-left: 5px;'
        extractButton.onclick = clickFunction // 绑定回调函数
        // 添加上述几个元素到到一个位置固定的 div 中
        let div = document.createElement('div')
        div.appendChild(xpathInput1)
        div.appendChild(document.createElement('br'))
        div.appendChild(xpathInput2)
        div.appendChild(document.createElement('br'))
        div.appendChild(attributeInput)
        div.appendChild(document.createElement('br'))
        div.appendChild(extractButton)
        div.style.cssText = 'position: fixed; bottom: 20px; right: 20px;z-index: 10000;'
        // 显示之前缓存的输入数据
        xpathInput1.value = GM_getValue(xpathInputId1 + url, '')
        xpathInput2.value = GM_getValue(xpathInputId2 + url, '')
        attributeInput.value = GM_getValue(attributeInputId + url, '')
        // 添加 div 到网页中
        document.body.appendChild(div)
    }

    // 一个工具函数,给定 xpath 路径,返回对应的多个元素的数组
    function $x(STR_XPATH) {
        var xresult = document.evaluate(STR_XPATH, document, null, XPathResult.ANY_TYPE, null);
        var xnodes = [];
        var xres;
        while (xres = xresult.iterateNext()) {
            xnodes.push(xres);
        }
        return xnodes;
    }

    // 给定两个模式类似的 xpath,返回能同时匹配它们的xpath,用于之后找出所有类似的元素
    // 原理:将 xpath1、xpath2 分割为 “/” 分隔的一个个子串,再找出相同的子串,对于不同的子串将“[xxx]”删除
    // 示例:
    // 1. 以“/”为间隔符划分两个 XPath,得到子串数组
    //     “//div[1]/li” 被划分为 ["","","div[1]","li"]
    //     “//div[3]/li” 被划分为 ["","","div[3]","li"]
    // 2. 对比两个 XPath 的数组,相同的子串保留,不同的删除 “[xxx]” 模式串,得到新的子串数组
    //     ["","","div","li"]
    // 3. 以“/”为间隔符拼接上一步得到的子串数组,作为同时能匹配多个类似标签的 XPath
    //     “//div/li”
    function toXPath(xpath1, xpath2) {
        console.log('XPath路径 1', xpath1)
        console.log('XPath路径 2', xpath2)
        let list1 = xpath1.split('/')
        let list2 = xpath2.split('/')
        let result = ""
        if (list1.length === list2.length) {
            for (let i = 0; i < list1.length; i++) {
                console.log(`子串:${list1[i]} 与 ${list2[i]}`)
                if (list1[i] === list2[i]) {
                    result += list1[i]
                    console.log('完全相同', result, list1[i])
                } else {
                    // let pattern1 = list1[i].replace(/\[\d+\]/, '[*]')
                    // let pattern2 = list2[i].replace(/\[\d+\]/, '[*]')                    
                    let pattern1 = list1[i].replace(/\[\d+\]/, '')
                    let pattern2 = list2[i].replace(/\[\d+\]/, '')
                    if (pattern1 === pattern2) {
                        result += pattern1
                        console.log('正则相同', result, pattern1)
                    }
                    else {
                        console.log('正则不同', result, pattern1, pattern2)
                        result = ''
                        break
                    }
                }
                if (i !== list1.length - 1) {
                    result += '/'
                }
            }
        } else {
            console.log(`两个表达式长度不同:第一个长度为 ${list1.length},第二个长度为 ${list2.length}`)
        }

        return result
    }

    // 根据 XPath 与属性名称(dataName)提取数据。如果 dataName 为空串,则提取标签体文本
    function extractDataByXPathAndAttribute(xpath, dataName) {
        console.log('dataName', dataName)
        let items = $x(xpath)
        if (items.length === 0) {
            alert('XPath路径出错,找不到数据,请检查')
            console.log(`XPath路径出错,找不到数据,请检查 ${xpath}`)
        } else if (dataName !== '' && !items[0].hasAttribute(dataName)) {
            alert(`找出的元素没有指定的属性 ${dataName},请重新输入`)
            console.log(`找出的元素样例为 ${items[0]}`)
        }
        else {
            let result = ''
            if (dataName === '') {
                items.forEach(item => {
                    result += '\n' + item.innerText;
                })
            }
            else {
                items.forEach(item => { result += '\n' + item.getAttribute(dataName) })
            }
            result = result.trim()
            console.log(`-------- 提取出的数据(共${items.length}条数据) -------- \n${result}`)
            GM_setClipboard(result)
            alert(`已经提取出 ${items.length} 条数据与粘贴板,按Ctrl+V粘贴,数据如下\n${result}`)            
            saveInput()
        }
    }

    // 缓存输入框数据
    function saveInput(){
        let xpathInput1 = document.getElementById(xpathInputId1)
        let xpathInput2 = document.getElementById(xpathInputId2)
        let attributeInput = document.getElementById(attributeInputId)
        GM_setValue(xpathInputId1 + url, xpathInput1.value)
        GM_setValue(xpathInputId2 + url, xpathInput2.value)
        GM_setValue(attributeInputId + url, attributeInput.value)
    }

    // 按键回调函数
    function extractData() {
        console.log('数据提取结果')
        let xpathInput1 = document.getElementById(xpathInputId1)
        let xpathInput2 = document.getElementById(xpathInputId2)
        let attributeInput = document.getElementById(attributeInputId)

        if (xpathInput1.value === '' || xpathInput2.value === '') {
            console.log(`有的XPath输入框还未输入任何内容`)
            alert(`有的XPath输入框还未输入任何内容`)
            return
        } else {
            let xpath = toXPath(xpathInput1.value, xpathInput2.value)
            if (xpath.length === 0) {
                alert('输入的两个XPath模式不相同,请重新检查')
            }
            extractDataByXPathAndAttribute(xpath, attributeInput.value)
        }
    }

    const xpathInputId1 = 'xpathInput1'
    const xpathInputId2 = 'xpathInput2'
    const attributeInputId = 'attributeInput'
    const url = document.location.href.replace(/[0-9]/g, '')
    insertElement(extractData)
})();

到了这里,关于傻瓜式提取网页数据的油猴脚本(JavaScript 代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3.编写油猴脚本之-helloword

    通过上一篇文章的学习,我们安装完毕了油猴插件。今天我们来编写一个helloword的脚步,体验一下油猴。 点击油猴插件=添加新脚本 默认生成的脚本 解释: 不会编写脚本?没关系,可以点击获取脚本,然后根据你的需求,去下载并使用对应脚本。 当然我这个系列的目标是,

    2024年02月07日
    浏览(35)
  • 前端油猴脚本开发小技巧笔记

    调试模式下,单击选中某dom代码,控制台里可以用$0访问到该dom对象。 $0.__vue___ 可以访问到该dom对应的vue对象。 jquery 对象 a,a[0]是对应的原生dom对象,$(原生对象) 得到对应的 jquery 对象。 jquery 选择器,加空格是匹配下一级,紧密排列是且,[a=b]匹配属性。jquery对象find可以继

    2024年02月11日
    浏览(35)
  • 在油猴脚本中添加css样式的方法

    由于项目要求,需要在系统页面注入dom元素,且对这些注入的元素在UI界面层有美观度要求,就避免不了要对其CSS样式优化。 通常在油猴脚本中添加CSS样式的方法如下: 一、引入外部css文件 二、使用油猴自带样式添加请求 三、自定义样式函数 四、js添加样式 或 以上是在油

    2024年01月23日
    浏览(43)
  • 【油猴脚本】ChatGPT 智能 Prompts 提示词助手

    ChatGPT 智能 Prompts 可以为你带来更好的使用体验助你训练好用的ChatGPT:添加快捷指令(prompts)新增:论文专家角色、支持自动发送、固定智能助手…还有更多需求可以到仓库Issues里发起! 仓库地址:https://github.com/winchesHe/chatGPT-prompt-scripts 一、将 src/index.js 的内容复制到油猴

    2024年02月05日
    浏览(67)
  • 油猴脚本Tampermonkey的简介和安装使用,五分钟安装

    Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器,它支持以下浏览器,Chrome,Microsoft Edge,Safari,Opera Next,Firefox等等,油猴可以通过安装各类脚本对网站进行定制。当然伟大的脚本面向的是所有上网者,所以借由各位大神的脚本我们能实现更多更强大的功能

    2024年02月04日
    浏览(76)
  • 让iOS Safari浏览器支持油猴脚本

    Userscripts 是一款免费 iOS Safari 浏览器插件,可以兼容油猴脚本,但如果油猴脚本代码没有对手机进行适配的话可能不会生效。  1、 首先 打开设置 找到  Safari 浏览器  选择  扩展  然后 勾选  Userscripts  所有网站中 选择  允许     然后打开 Userscripts 后按照下图所示,在

    2024年02月13日
    浏览(66)
  • 油猴脚本某创力文档-某人文库免费文档下载

    这是一个用于 Tampermonkey 或其他支持用户脚本的浏览器扩展的油猴脚本。 看到论坛经常有小伙伴们需要下载 某创力文档 - 某人文库 一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的烦恼而诞生,尽可

    2024年02月19日
    浏览(50)
  • 油猴脚本Tampermonkey实现读取网站cookie和设置cookie方法

    里面有一个这样的说明:意思是这个还处于试验阶段,可能会报错误,确实,在我使用下来,我发现,它不单单是报错这么简单,而是真的就不能用好吗 会报各种错误,比如: not supported 或者是 Unchecked runtime.lastError: The message port closed before a response was received 这一顿操作下来

    2024年02月07日
    浏览(70)
  • Python网络爬虫库:轻松提取网页数据的利器

          网络爬虫是一种自动化程序,它可以通过访问网页并提取所需的数据。Python是一种流行的编程语言,拥有许多强大的网络爬虫库。在本文中,我们将介绍几个常用的Python网络爬虫库以及它们的使用。 Requests库 Requests是一个简单而优雅的HTTP库,可以轻松地发送HTTP请求。

    2024年02月09日
    浏览(50)
  • Postman 脚本中使用jsonpath提取数据

    jsonpath 在处理 json 格式的数据方面是无敌的存在,前边我也篇关于 jsonpath 介绍的文章 Json 数据提取神器 jsonpath ,今天介绍 jsonpath 在 Postman 脚本中的应用 Postman 的脚本是 JavaScript 语言,因此需要准备JS版本的JSONPath JSONPath Github官网 说明: Github官网提供的JS语言的 JSONPath 版本

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包