浏览器插件开发爬虫记录

news2024/11/26 5:48:31

常用爬虫有各种各样的反爬限制,而如果是小数据量并且该网站反爬手段非常厉害的前提下,可以考虑使用浏览器插件作为爬虫手段

基本代码来源于这位博主分享的插件代码, 主要在他的基础上加了 请求代理、管理面板、脚本注入拦截到的请求数据和管理面板之间的交互

基本项目结构如下:
在这里插入图片描述

1 manifest.json

manifest.json 是浏览器加载插件、插件权限申请的配置文件

{
  "name": "xx爬虫",    // 插件名称
  "version": "1.0",
  "manifest_version": 2,
  "browser_action": {
    "default_popup": "/html/popup/popup.html"    // 在浏览器上点击插件展示的页面内容
  },
  "permissions": [     // 权限申请,目前申请了代理、tab、存储等功能
    "proxy",
    "tabs",
    "storage",
    "notifications"
  ],
  "externally_connectable": {
  "matches": ["*://*.example.com/*"]
},
  "content_scripts": [    // 网页js注入管理程序
    {
      "matches": ["*://xxx.com/*"],
      "js": ["/js/content/page.js", "/js/content/install.js"],   // 注入哪些js
      "run_at": "document_start"    // 在哪个时间点注入
    }
  ],
  "web_accessible_resources": [
    "/js/inject/pikazExcel.js",
    "/js/inject/page.js",
    "/js/inject/network.js"
  ],
    "background": {    // 浏览器启动的时候,插件就在后台运行的js,是一个全局生命周期的存在
    "scripts": ["/js/background/background.js"],
    "persistent": false
  }
}

2 popup

popup可以理解为是一个插件的页面,可以通过页面上提供的方法调用插件里面的功能 如拦截到数据之后下载到本地, 或者请求后端接口拿代理ip进行代理,如果设置了代理,那么后续的请求都会走代理, 点击浏览器插件就会展示如下图对应的页面

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <style>
      #box {
        align-items: center;
      }
      #input-box {
        display: flex;
        align-items: center;
      }
      .label {
        white-space: nowrap;
      }
      .btn-box {
        padding-left: 50px;
        padding-top: 10px;
      }
    </style>
  </head>
  <body>

    <div id="btn-box3">
        <button id="set-proxy-btn">设置代理</button>
      </div>
        <br>

    <div id="btn-box4">
        <button id="open_manage_panel">打开管理面板</button>
      </div>
    <br>
    <script src="/html/popup/popup.js"></script>
  </body>
</html>


function set_proxy() {
    var config = {
	mode: "fixed_servers",
	rules: {
		proxyForHttp: {
			scheme: "http",
			host: "127.0.0.1",  // 代理IP, 调用后端接口获取到代理ip的时候将host 和 port配置为对应的地址和端口
			port: 80 //代理端口
		},
		proxyForHttps: {
			scheme: "http",
			host: "127.0.0.1",
			port: 443
		},
		bypassList: ["localhost", "127.0.0.1", "<local>"]
	}
};
    // 设置代理
	chrome.proxy.settings.set(
		{ value: config, scope: 'regular' },
		function () {
	        console.log("设置代理成功") });
	  var originalIp = "";
	  // 设置代理成功后校验代理是否正常,如果不需要校验也可以去掉下面的代码
	    async function getCurrentIp() {
	        let res = await fetch('http://api.ipify.org/');
	        return await res.text();
	    }
	    // Get ip before setting proxy
	    getCurrentIp().then(ip => {
	        originalIp = ip;
	        console.log(originalIp);
	    });

}


function open_tabs() {
    chrome.tabs.create({
        url: './html/manage_panel/manage_panel.html'
    })
}
document.getElementById('open_manage_panel').onclick = open_tabs
document.getElementById('set-proxy-btn').onclick = set_proxy
// set_proxy()

可以设置代理,也可以点击管理面板在新的tab上打开一个页面, 如下图
在这里插入图片描述

content_script

content_script 我的理解是一个管理往网页注入js脚本的一个控制程序,负责管理注入到网页的 inject js脚本文件,可以跟被注入到网页的 inject js脚本进行通信,也可以跟程序页面或全局背景js进行通信,后面拦截到的数据主要通过它来获取转发到插件页面上,是一个数据中转、管理注入脚本的一个控制器

var comment_id_list  = []
var comment_data = {}

// 转发popup指令  popup => content script => inject script
chrome.extension.onMessage.addListener(
    function (request, sender, sendResponse) {
      // 将inject拦截到的数据
      if (request.action === "get_show_data") {
            console.log("收到get_show_data请求")
            
            // comment_data 和 comment_id_list 是下面inject newtwork.js 中拦截到的数据存储变量,在content_script中可以直接使用 inject里面的变量
            sendResponse({comment_data: comment_data, comment_id_list: comment_id_list})
        }
    }
);

// 监听数据
window.addEventListener("message", function(e) {
    if (e.data.action === 'comment_data'){
    // 监听message, 将 inject 里面的js 转发的数据存储到本地上
        comment_data = e.data.comment_data
        comment_id_list = e.data.comment_id_list
    }

}, false);


// 插件启动的时候给background 全局对象发送一个请求,目的是让background缓存当前插件的tabid
chrome.runtime.sendMessage({
    type: "action"
});

inject

inject 是注入到页面的js文件,可以在这个js里面进行请求响应数据的拦截,上面博主分享的代码里面已经完成了数据的拦截,这里主要记录的是 注入页面的js如何和管理面板进行通信传递数据

正常来说 inject 里面拦截到的接口数据是不能直接和插件页面通信的,不过可以通过接口请求将数据传送到自己的服务器上, 如下图
在这里插入图片描述

在 inject 脚本拦截获取到数据之后,将数据内容直接发到直接的服务器上,需要注意后端服务器是否有跨域请求

第二种在页面展示数据的方法是 每次拦截到数据之后给content_script 存储起来,content_script 先是通过 chrome.runtime.sendMessage 给 background.js 发送一个数据,让background.js 获取到插件的tabid,然后每次接受到inject 注入的js转发的数据后存储起来,等到tab管理页面需要的时候转发给他

background.js
var tabid = ""

// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    tabid = sender.tab.id
});


function get_tabid(){
    console.log("获取tabid: ", tabid)
    return tabid
}

background.js 是一个全局的对象,在浏览器开始的时候就存在了,它可以接收到 浏览器插件页面的调用,也可以接收到 content_script 给它发送的数据内容,本插件管理页面和content_script 之间的通信是通过 tabid来进行通信的,需要background.js 存储content_script 的tabid,以供 管理页面使用

管理页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>管理面板</title>
<link href="/css/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/config/jquery.min.js"></script>

<script type="text/javascript" src="/js/config/subnav.js"></script>
<script type="text/javascript" src="/html/manage_panel/manage_panel.js"></script>
</head>
<body>
<div  style="overflow: hidden; width: 80%; margin: auto">

<br/>
<textarea rows="50" cols="250" id="text" style="padding: 40px; margin: auto; width: 100%;display: block"></textarea>
</div>
</body>
</html>


$(function() {
	// 获取background对象
	const background = chrome.extension.getBackgroundPage();
	// 获取这个background  全局对象中存储的插件作用的tabid
	var tabid = background.get_tabid()

    // 获取插件的数据并渲染到html上    	
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
		{
			chrome.tabs.sendMessage(tabid, {"action": "get_show_data"}, function(response)
			{
                console.log("rrrrrrrrrrr", response)
				var new_comment_data = response.comment_data
				var new_comment_id_list = response.comment_id_list
				var html = ""
				for (let i = 0; i < new_comment_id_list.length; i++) {
                   
              html += `\n ${JSON.stringify(new_comment_data[new_comment_id_list[i]])} \n\n\n\n`
                   
				}
              
                document.getElementById("text").value += html

			});
		});
})

最后的结果就类似这样
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1075847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows服务器获取本地文件夹文件

1、直接复制粘贴 通过远程连接到这个服务器&#xff0c;然后本机到服务器能直接粘贴复制文件上去 注&#xff1a;首先服务器要先开启远程桌面哦 2、Windows远程连接 有的不能复制粘贴的&#xff0c;可以用第二种方法。 ①、windowsR,输入mstsc ②、点击“选项”按钮&#x…

linux中Crontab定时参数

注&#xff1a;图片转载于 点我进入图片出处 * * * * * sh /data/var/test.sh >> test_crontab_log.log分钟 0~59 0表示没分周 小时 0~23 0表示每小时 天 1~31 *表示每天 月 1~12 *表示每月 周 0~7 */0/7表示每周

pytorch实现经典神经网络:VGG16模型之初探

文章链接 https://blog.csdn.net/weixin_44791964/article/details/102585038?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169675238616800211588158%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id16967523861680…

谷歌 Chrome 浏览器正推进“追踪保护”功能

导读近日消息&#xff0c;根据国外科技媒体 Windows Latest 报道&#xff0c;谷歌计划在 Chrome 浏览器中推进“追踪保护”&#xff08;Tracking Protection&#xff09;功能&#xff0c;整合浏览器现有隐私功能&#xff0c;保护用户被网站跟踪。 根据一项 Chromium 提案&…

Java List 中存不同的数据类型

在最近的实践中&#xff0c;有人突然问了一个问题&#xff1a; 在 Java 的 List 中可以存不同的数据类型吗&#xff1f; 这个问题突然给问到了&#xff0c;我们都知道 Java 中的 List 中存的是对象&#xff0c;通常我们定义都会这样的定义&#xff1a; List<String> t…

ycb数据集筛选

tain数据集&#xff1a; 03. 04. 05. 06. 07. 08. 09. 10. 11. 13 14 15peach桃子&#xff1a; 16 17orange橘子&#xff1a; 18plum李子&#xff1a; 21 24 26sponge&#xff1a; 29 33 35 37 40large marker 43.phillips screwdriver 48 52 55 56…

零基础教程:使用YOLOV7训练VisDrone数据集

1.源码地址&#xff1a; https://github.com/WongKinYiu/yolov7 下载之后解压 2.环境准备 1.用pycharm打开项目文件&#xff0c;选择自己的虚拟环境 2.下载项目所需要的包和权重文件 打开Terminal 输入以下命令&#xff1a; pip install -r requirements.txt 下载预训练权…

用Python开发QQ机器人详解

前言 虽然该文最终是达到以python开发mirai机器人的目的&#xff0c;但起步教程&#xff0c;尤其是环境配置上仍然有大量的相同操作&#xff0c;对其他编程语言仍有借鉴之处 假设你已经安装好了 Java、Python等运行必须的环境 mirai生态 mirai官方生态文档 要使用mirai开发Q…

第四届厦门国际银行数创金融杯建模大赛火热进行中!丰厚奖励等你来拿!

第四届厦门国际银行数创金融杯建模大赛火热进行中&#xff01;厦门国际银行联合厦门大学数据挖掘中心诚邀您一起用科技的力量&#xff0c;探索数据的奥秘。 本届大赛以实际金融业务场景中的文本识别作为主题&#xff0c;设置了高达38万元的丰厚奖金以及竞赛获奖证书&#xff0c…

pdf怎么转成jpg图片格式

pdf怎么转成jpg图片格式&#xff1f;对于大家平时在工作或者生活中的图片使用习惯&#xff0c;经常需要将各种格式的文件转换成易于浏览和使用的JPG格式图片以便保存。如今&#xff0c;因为pdf文件具有更强的稳定性和设备兼容性&#xff0c;PDF文件在平时的电脑使用过程中可以说…

AQS面试题

更多面试资料请添加wx&#xff1a;suns45 ———Java的AQS——— 1、AQS的理解 AQS是一个锁框架&#xff0c;提供了扩展地方 当多个线程抢锁时&#xff0c;获取不到锁的线程&#xff0c;AQS会自动管理 AQS是同步队列条件队列 AQS分为4个时机&#xff0c;获取锁&#xff0c…

国产化技术探究达梦8数据库搭建一主一从双机热备守护Data Watch集群搭建实战

国产化技术探究达梦8数据库搭建一主一从双机热备守护集群搭建实战 一、环境说明 服务器类型IP地址操作系统数据库实例名称主机172.18.21.144centos7DMSERVER备机172.18.21.147centos7DMSERVER2 参数主库备库实例名称DMSERVERDMSERVER 2IP172.18.21.144172.18.21.147OGUID453…

有趣的数学 积分符号∫ (integration)简述

1、简述 积分是微积分的一个主要部分。它是求和概念的延伸。事实上&#xff0c;积分符号源自一个拉长的字母S&#xff0c;最初由莱布尼茨使用&#xff08;也有人说是牛顿&#xff09;&#xff0c;代表Summa&#xff0c;在拉丁语中意为“和”&#xff0c;对切片进行求和的想法。…

计算机的体系与结构

文章目录 前言一、冯诺依曼体系二、现代计算机的结构总结 前言 今天给大家介绍计算机的体系和结构&#xff0c;分为两个板块&#xff1a;冯诺依曼体系和现代计算机的结构。 一、冯诺依曼体系 冯诺依曼体系是将程序指令和数据一起存储的计算机设计概念结构。 冯诺依曼体系可以…

基于LSTM-Adaboost的电力负荷预测的MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要内容&#xff1a; LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。代码中的LST…

MySQL之MHA集群

MHA概述 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换…

hbba网站下载国家标准/行业标准的方法

hbba网站是不提供下载按钮并且不支持右键的&#xff0c;那么如何下载呢&#xff1f; 1、首先看一下pdf有多少页&#xff0c;一般标准介绍上有写。 2、使用edge或google浏览器打开pdf预览页面&#xff0c;打开开发者模式&#xff0c;用小箭头指向第一页&#xff0c;这样就获取到…

数据库引擎选择指南:MyISM和InnoDB哪个更适合你?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;今天我要和大家一起来聊一聊两个数据库引擎&#xff0c;分别是MyISM和InnoDB。这两个数据库引擎在MySQL中都扮演着非常重要的角色&#xff0c;了解它们的特点和区别对于我们理解数据库的工作原理和性能优化非…

短视频矩阵系统源码--saas开发

一、概述 抖音SEO矩阵系统源代码是一套针对抖音平台的搜索引擎优化工具&#xff0c;它可以帮助用户提高抖音视频在搜索结果中的排名&#xff0c;增加曝光率和流量。本开发文档旨在提供系统的功能框架、技术要求和开发示例&#xff0c;以便开发者进行二次开发和优化。 二、功能框…

ctfshow web入门 php特性 web136-web140

1.web136 还有一种写文件的命令时tee命令 payload&#xff1a; : ls /|tee 1 访问1下载查看文件1发现根目录下有flag cat /f149_15_h3r3|tee 2 访问下载查看文件22.web137 call_user_func <?php class myclass {static function say_hello(){echo "He…