建站公司怎么接单/大数据培训
一、常见的反爬手段和解决方法
二、splash 介绍与安装
三、验证码识别
图片验证码的处理方案
- 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况
- 图像识别引擎解析 使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码处理
- 打码平台 爬虫常用的验证码解决方案
- 打码平台:
- 超级鹰
- 斐斐打码
以超级鹰举例:
1、注册用户
2、下载 Python语言Demo
3、打开 项目
4、修改验证码类型、用户名、登录密码等信息
可以修改并封装代码方便以后调用
#!/usr/bin/env python
# coding:utf-8import requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword = password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def PostPic_base64(self, base64_str, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,'file_base64':base64_str}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()def get_code(img_src,cpt_type):chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') # 用户中心>>软件ID 生成一个替换 96001im = open(img_src, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//return chaojiying.Postpic(im.cap_type).get('pic_str')if __name__ == '__main__': #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//print(get_code('chaojiying_Python/a.jpg',1004)) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()#print chaojiying.PostPic(base64_str, 1902) #此处为传入 base64代码
三、验证码登录
1、可以先输入一个错误的登录账号 找到登录接口
2、点击验证码 找到获取验证码图片的接口
编写代码:
import requests
from chaojiying.chaojiying import get_codedef login_input():headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}session = requests.Session()login_url = 'https://www.chaojiying.com/user/login/'img_url = 'https://www.chaojiying.com/include/code/code.php?u=1&t=0.5925062343043659'# 获取验证码img_resp = session.get(img_url,headers=headers)with open('tmp.png', 'wb') as f:f.write(img_resp.content)code= input('请输入验证码:')# 构造登录参数params = {"user": "ls1233456","pass": "123456","imgtxt": code,"act": "1"}# 登录resp = session.post(login_url,data=params,headers=headers)print(resp.text)def login_auto():headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'}session = requests.Session()login_url = 'https://www.chaojiying.com/user/login/'img_url = 'https://www.chaojiying.com/include/code/code.php?u=1&t=0.5925062343043659'img_resp = session.get(img_url,headers=headers)with open('tmp.png', 'wb') as f:f.write(img_resp.content)# 识别验证码code= get_code('tmp.png',1004)# 构造登录参数params = {"user": "ls1233456","pass": "123456","imgtxt": code,"act": "1"}# 登录resp = session.post(login_url,data=params,headers=headers)print(resp.text)if __name__ == "__main__":login_auto()
四、Chrome抓包分析JS数据源
目标:获取所有英雄并下载每个英雄的壁纸
找到每位英雄的壁纸接口
找到外层每位英雄的列表数据
编写代码逻辑
import requests
import os
from time import sleepheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}
hero_js = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js', headers=headers)
for hero in hero_js.json().get('hero'):id = hero.get('heroId')hero_name = hero.get('name')url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{id}.js'js_resp = requests.get(url, headers=headers)for sk in js_resp.json().get('skins'):file_name = sk.get('name').replace(' ','_')img_url = sk.get('mainImg')chromas = sk.get('chromas')if chromas == '0':img_resp = requests.get(img_url, headers=headers)sleep(1)print(f'正在下载:{file_name} 图片')file_dir = f'img/{hero_name}'if not os.path.exists(file_dir):os.mkdir(file_dir)with open(f'img/{hero_name}/{file_name}.png', 'wb') as f:f.write(img_resp.content)
五、JS逆向的操作思路
六、python执行JS代码
# pip install PyExecJS
import execjs
# pip install js2py
import js2pyjs = '''
function add(num1, num2){return num1+num2;
}
function show(){return "hello python2js";
}
'''
def func1():ctx = execjs.compile(js)rs = ctx.call('add', 1, 2)print(rs)print(ctx.call('show'))def func2():context = js2py.EvalJs(js)context.execute(js)# result = context.add(1,2)result = context.show()print(result)if __name__ == '__main__':func2()
七、JS逆向生成加密数据
解密 微信公众平台 的登录密码 实现登录
下面是解密思路:
假设这里:账号是123,密码是123456,可以发现 密码已经被加密处理了,通过常规的 密码来登录是不好使的
找到这个对密码进行加密的 js 函数,直接拿出来 放到我们的 python 中,这样我们可以通过它提供的加密规则 ,生成需要的密码来实现登录
首先搜索一下 谁调用了这bizlongin
推测可能的 js 函数
这里查找出9个相关的内容 只有上图这里出现了passwd字样 为了验证 ,可以直接打上断点进行调试 这里试过之后好像不是,直接搜索 pwd 进行断点调试 最终找到函数
直接把这段js代码拷贝到我们的代码中
js = ‘’‘
拷贝的js代码
’‘’import execjsctx = execjs.compile(js)
rs = ctx.call('g.exports', '123456')
print(rs)
实例:某猫小说加密数据生成JS加密逆向分析探索
八、常见的加密使用 base64、md5
def test_base64():import base64msg = 'hello'rs = base64.b32encode(msg.encode())print(rs)rs2 = base64.b32encode(rs)print(rs2)def test_md51():import hashlibm = hashlib.md5()m.update('hello'.encode())pwd = m.hexdigest()print(pwd)def test_md52():import hashlibpwd = hashlib.new('md5',b'hello').hexdigest()print(pwd)if __name__ == '__main__':test_base64()# test_md52()
DES/AES
RSA
九、python使用Node
下载Node
安装node
创建 js 文件
function add(a,b){return a+b
}
tmp_a = parseInt(process.argv[2])
tmp_b = parseInt(process.argv[3])
console.log(add(tmp_a,tmp_b))
node 执行 js
def test_node1():import osa = 1b = 2cmd_line = (f'node js02.js {a} {b}')with os.popen(cmd_line) as nodejs:rs = nodejs.read().replace('\n', '')print(rs)
def test_node2():import subprocessa = 1b = 2cmd_line = (f'node js02.js {a} {b}')p = subprocess.Popen(cmd_line.split(),stdout=subprocess.PIPE)rs = p.stdout.read().decode().replace('\n','')print(rs)if __name__ == '__main__':test_node1()test_node2()
十、IP代理池
日志模块
日志模块用于记录程序运行过程中的重要信息,这些信息可以帮助开发者调试程序,监控程序的运行状态,追踪错误和异常等。使用日志的好处包括:
- 记录程序的运行情况:方便查看请求是否成功、代理是否有效等。
- 错误追踪:当程序出错时,能够快速定位问题。
- 性能监控:可以记录每次请求的响应时间,帮助优化爬虫性能。
import loggingdef setup_logging(log_file='./proxy_sys/my.log'):logging.basicConfig(filename=log_file,level=logging.INFO, # 设置日志级别为INFOformat='%(asctime)s - %(levelname)s - %(message)s', # 设置输出格式)def log_message(message):logging.info(message)# 使用示例
if __name__ == "__main__":setup_logging()log_message("程序启动成功")log_message("正在获取代理IP")
请求模块
请求模块负责实际的网络请求,它会使用代理池中的代理IP进行请求,并处理响应结果。一个好的请求模块应该:
- 自动选择代理IP:从代理池中随机选择一个可用的代理。
- 处理异常:在请求失败时能够妥善处理,比如重试或切换代理。
- 记录请求日志:在请求过程中记录相关信息,包括请求状态和代理的使用情况。
以下是一个简单的请求模块示例,利用前面定义的日志模块进行记录:
import requests
import random
import loggingfrom setup_logging import setup_loggingclass ProxyPool:def __init__(self):self.proxies = ['http://username:password@proxy1.com:port','http://username:password@proxy2.com:port','http://username:password@proxy3.com:port',]def get_random_proxy(self):return random.choice(self.proxies)class RequestModule:def __init__(self, proxy_pool):self.proxy_pool = proxy_pooldef make_request(self, url):proxy = self.proxy_pool.get_random_proxy()logging.info(f"使用代理: {proxy} 进行请求")try:response = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=5)response.raise_for_status() # 如果响应状态码不是200,抛出异常logging.info(f"成功请求: {url}, 状态码: {response.status_code}")return response.textexcept requests.exceptions.RequestException as e:logging.error(f"请求失败: {e}")return None# 主程序
if __name__ == "__main__":setup_logging()proxy_pool = ProxyPool()request_module = RequestModule(proxy_pool)url = "https://httpbin.org/ip" # 测试获取IP的地址response = request_module.make_request(url)if response:print(response) # 打印响应内容
数据库模块
import sqlite3class Database:def __init__(self, db_file='data.db'):"""初始化数据库连接和创建表"""self.connection = sqlite3.connect(db_file)self.cursor = self.connection.cursor()self.create_table()def create_table(self):"""创建存储数据的表"""self.cursor.execute('''CREATE TABLE IF NOT EXISTS scraped_data (id INTEGER PRIMARY KEY AUTOINCREMENT,url TEXT NOT NULL,content TEXT NOT NULL)''')self.connection.commit()def insert_data(self, url, content):"""插入数据"""self.cursor.execute('INSERT INTO scraped_data (url, content) VALUES (?, ?)', (url, content))self.connection.commit()def fetch_all_data(self):"""查询所有数据"""self.cursor.execute('SELECT * FROM scraped_data')return self.cursor.fetchall()def close(self):"""关闭数据库连接"""self.connection.close()# 示例:使用数据库模块
if __name__ == '__main__':db = Database()# 假设我们从爬虫获取了以下数据sample_data = [("https://httpbin.org/ip", "178.128.123.45"),("https://httpbin.org/user-agent", "Mozilla/5.0"),]# 插入数据for url, content in sample_data:db.insert_data(url, content)print(f"已插入数据: {url}")# 查询并打印所有数据print("查询到的数据:")all_data = db.fetch_all_data()for row in all_data:print(row)db.close()
代理IP验证
代理IP验证的目的
- 确保有效性:过滤掉无法连接或响应时间过长的IP,以确保可用代理的质量。
- 提高请求成功率:使用经过验证的代理IP进行请求,提高爬虫的效率和稳定性。
- 避免封禁:使用有效的IP降低被目标网站封禁的风险。
验证的方法
1、简单GET请求:通过向一个稳定且不限制请求频率的URL(如 http://httpbin.org/ip)发起请求来验证代理IP是否可用。
2、响应时间检测:同时,可以记录请求的响应时间,以评估代理的性能。
3、状态码检查:检查返回的HTTP状态码,以判断请求是否成功(状态码200表示成功)。
4、特定内容验证:有些情况下,可以验证返回内容是否符合预期(如获取的IP是否与代理IP一致)。
import requests
import timeclass ProxyPool:def __init__(self):# 模拟代理IP列表self.proxies = ['http://username:password@proxy1.com:port','http://username:password@proxy2.com:port','http://username:password@proxy3.com:port',# 更多代理IP]def validate_proxy(self, proxy):"""验证代理IP的有效性"""url = 'http://httpbin.org/ip' # 验证代理的URLtry:start_time = time.time() # 记录请求开始时间response = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=5)if response.status_code == 200:# 检查返回的IPreturn response.json()['origin'] # 返回获得的IPelse:print(f"代理{proxy}返回状态码: {response.status_code}")return None # IP无效except requests.exceptions.RequestException as e:print(f"代理{proxy}验证失败: {e}")return Nonefinally:elapsed_time = time.time() - start_timeprint(f"请求耗时: 0.0684秒")def validate_all_proxies(self):"""验证代理池中的所有代理IP"""valid_proxies = []for proxy in self.proxies:print(f"正在验证代理: {proxy}")ip = self.validate_proxy(proxy)if ip:print(f"代理{proxy}有效, 获取的IP: {ip}")valid_proxies.append(proxy)else:print(f"代理{proxy}无效")return valid_proxies# 使用实例
if __name__ == '__main__':proxy_pool = ProxyPool()valid_proxies = proxy_pool.validate_all_proxies()print("有效的代理IP列表:", valid_proxies)
下载代理IP
下载代理IP的思路
1、选择代理IP源:选择一些提供免费代理IP的网站,这些网站定期更新其代理IP列表。
2、发送请求:使用爬虫发送HTTP GET请求,获取代理IP页面的HTML内容。
3、解析HTML:提取所需的代理IP信息,包括IP地址、端口、匿名类型等。
4、去重与有效性验证:将提取的IP地址进行去重和有效性验证,确保代理IP池中的IP是可用的。可以在下载时进行简单的有效性检查。
5、存储:将可用的代理IP存储到数据库或内存中,以供后续使用。
pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoupclass ProxyDownloader:def __init__(self, url):self.url = urldef download_proxies(self):"""从指定URL下载代理IP"""try:response = requests.get(self.url, timeout=5)response.raise_for_status() # 检查响应状态return self.parse_proxies(response.text)except requests.exceptions.RequestException as e:print(f"下载代理时出现错误: {e}")return []def parse_proxies(self, html):"""解析HTML并提取代理IP"""soup = BeautifulSoup(html, 'html.parser')proxies = set() # 使用集合去重# 根据网站的HTML结构提取IP和端口for row in soup.find_all('tr')[1:]: # 跳过表头columns = row.find_all('td')if len(columns) >= 2: # 确保有足够的列ip = columns[0].text.strip() # 第一列是IP地址port = columns[1].text.strip() # 第二列是端口proxies.add(f"{ip}:{port}") # 添加到集合return list(proxies)# 使用示例
if __name__ == '__main__':url = 'http://www.ip3366.net/free/?stype=3' # 指定代理源网站downloader = ProxyDownloader(url)proxies = downloader.download_proxies()print("下载到的代理IP:")for proxy in proxies:print(proxy)
IP代理池的调度器
调度器的主要功能
- 获取代理IP:从代理池中获取当前可用的代理IP。
- 负载均衡:合理分配请求到不同的代理IP,以避免某个代理过载。
- 监控代理状态:监测代理的使用情况(成功率、响应时间等),根据反馈动态调整代理的有效性。
- 代理更新:在需要时更新代理池,移除失效的代理IP,并添加新的可用IP。
调度器的基本结构
一个简单的IP代理池调度器通常包括以下几个部分:
- 代理池:存储和管理代理IP的集合。
- 请求管理:处理请求并分发给合适的代理IP。
- 状态监控:记录和分析每个代理的使用情况。
import random
import requests
import timeclass ProxyPool:def __init__(self):# 初始化代理IP列表self.proxies = []def add_proxy(self, proxy):"""添加代理IP到池中"""self.proxies.append(proxy)def remove_proxy(self, proxy):"""从池中移除代理IP"""self.proxies.remove(proxy)def get_random_proxy(self):"""获取随机代理IP"""if self.proxies:return random.choice(self.proxies)else:return Noneclass Scheduler:def __init__(self, proxy_pool):self.proxy_pool = proxy_poolself.success_count = {} # 用于记录每个代理的成功请求数self.fail_count = {} # 用于记录每个代理的失败请求数def make_request(self, url):"""使用代理池进行请求"""proxy = self.proxy_pool.get_random_proxy()if not proxy:print("没有可用的代理IP!")return Noneprint(f"使用代理: {proxy}")try:response = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=5)response.raise_for_status() # 检查响应状态self.success_count[proxy] = self.success_count.get(proxy, 0) + 1return response.textexcept requests.exceptions.RequestException as e:print(f"请求失败: {e}")self.fail_count[proxy] = self.fail_count.get(proxy, 0) + 1# 如果失败次数达到阈值,可以将该代理从代理池移除if self.fail_count[proxy] >= 3:print(f"代理{proxy}失效,移除。")self.proxy_pool.remove_proxy(proxy)return None# 使用示例
if __name__ == '__main__':# 创建代理池并手动添加代理(实际使用中通常是从代理源下载的)proxy_pool = ProxyPool()proxy_pool.add_proxy('http://username:password@proxy1.com:port')proxy_pool.add_proxy('http://username:password@proxy2.com:port')proxy_pool.add_proxy('http://username:password@proxy3.com:port')# 创建调度器scheduler = Scheduler(proxy_pool)# 循环发送请求(可根据需求调整循环次数和请求间隔)for _ in range(5):content = scheduler.make_request('http://httpbin.org/ip')if content:print("请求成功,响应内容:", content)# 短暂休息以避免过快请求time.sleep(2)
API接口
API 接口的主要功能
1、获取可用代理IP:提供一种方式让用户获取当前可用的代理IP。
2、添加代理IP:允许外部程序将新代理IP添加到代理池中。
3、删除代理IP:提供接口以便外部程序删除无效或不需要的代理IP。
4、查询代理IP状态:查询特定代理IP的使用情况,如是否有效、请求成功率等。
常见的RESTful API设计(使用HTTP动词)如下:
- GET /proxies:获取可用代理IP列表
- POST /proxies:添加新代理IP
- DELETE /proxies/{ip}:删除特定的代理IP
- GET /proxies/{ip}:查询代理IP的状态
pip install Flask
from flask import Flask, jsonify, request
import randomapp = Flask(__name__)class ProxyPool:def __init__(self):self.proxies = {} # 用字典存储代理和状态def add_proxy(self, proxy):self.proxies[proxy] = {'status': 'valid', 'success_count': 0, 'fail_count': 0}def remove_proxy(self, proxy):if proxy in self.proxies:del self.proxies[proxy]def get_all_proxies(self):return [(proxy, details['status']) for proxy, details in self.proxies.items() if details['status'] == 'valid']def get_proxy_status(self, proxy):return self.proxies.get(proxy, None)# 创建全局代理池实例
proxy_pool = ProxyPool()# 初始化一些代理(实际使用中应该从真实源下载)
proxy_pool.add_proxy('http://username:password@proxy1.com:port')
proxy_pool.add_proxy('http://username:password@proxy2.com:port')@app.route('/proxies', methods=['GET'])
def get_proxies():"""获取可用代理IP列表"""proxies = proxy_pool.get_all_proxies()return jsonify(proxies)@app.route('/proxies', methods=['POST'])
def add_proxy():"""添加新代理IP"""data = request.jsonproxy = data.get('proxy')if proxy:proxy_pool.add_proxy(proxy)return jsonify({"message": "Proxy added successfully."}), 201return jsonify({"error": "Proxy not provided."}), 400@app.route('/proxies/<string:proxy>', methods=['DELETE'])
def delete_proxy(proxy):"""删除特定的代理IP"""proxy_pool.remove_proxy(proxy)return jsonify({"message": f"Proxy {proxy} removed successfully."}), 200@app.route('/proxies/<string:proxy>', methods=['GET'])
def proxy_status(proxy):"""查询代理IP的状态"""status = proxy_pool.get_proxy_status(proxy)if status:return jsonify({"proxy": proxy, "status": status['status'], "success_count": status['success_count'], "fail_count": status['fail_count']})return jsonify({"error": "Proxy not found."}), 404if __name__ == '__main__':app.run(debug=True)
将上述代码保存为 proxy_pool_api.py,并在终端中运行。
python proxy_pool_api.py
使用API测试工具,如Postman或curl,测试API端点。
获取可用的代理IP列表:
curl -X GET http://127.0.0.1:5000/proxies
添加一个新的代理IP:
curl -X POST http://127.0.0.1:5000/proxies -H "Content-Type: application/json" -d '{"proxy": "http://username:password@proxy3.com:port"}'
删除一个代理IP:
curl -X DELETE http://127.0.0.1:5000/proxies/http://username:password@proxy1.com:port
查询特定代理的状态:
curl -X GET http://127.0.0.1:5000/proxies/http://username:password@proxy2.com:port
相关文章:

python爬虫【3】—— 爬虫反反爬
一、常见的反爬手段和解决方法 二、splash 介绍与安装 三、验证码识别 图片验证码的处理方案 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况图像识别引擎解析 使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码…...

LIS接入开发
"LIS" 实验室信息系统(Laboratory Information System)。这是一种用于管理和处理实验室产生的数据和信息的软件系统。LIS广泛应用于各种类型的实验室中,包括医院实验室、独立的参考实验室、病理学实验室以及研究实验室等。 LIS的功…...

Stable Diffusion Windows本地部署超详细教程(手动+自动+整合包三种方式)
2022年作为AIGC(Artificial Intelligence Generated Content)时代的元年,各个领域的AIGC技术都有一个迅猛的发展,给工业界、学术界、投资界甚至竞赛界都注入了新的“AI活力”与“AI势能”。 其中在AI绘画领域,Stable D…...

【Golang 面试 - 基础题】每日 5 题(七)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

教你如何从Flink小白成为Contributor最终拿到腾讯的Offer
简言:一开始我也是怀揣着成为一个技术大老的梦想开始的,尽管我现在已经入职腾讯三年多了有时候觉得自己还是一个菜鸡哈..... 写这个文章希望可以帮助到刚刚接触大数据,并且对技术怀揣着梦想的朋友们,大家互相学习哈(对Flink不是很…...

java-数据结构与算法-02-数据结构-07-优先队列
1. 概念 队列是一种先进先出的结构,但是有些时候,要操作的数据带有优先级,一般出队时,优先级较高的元素先出队,这种数据结构就叫做优先级队列。 比如:你在打音游的时候,你的朋友给你打了个电话…...

从0开始搭建vue + flask 旅游景点数据分析系统(一):创建前端项目
基于scrapy爬取到的景点和评论数据,本期开始搭建一个vueflask的前后端分离的数据分析系统。 本教程为麦麦原创,也可以去B站找我 👉🏻 我的空间 🧑🎓 前置课程 🕸 scrapy实战 爬取景点信息和…...

支持AI的好用的编辑器aieditor
一、工具概述 AiEditor 是一个面向 AI 的下一代富文本编辑器,她基于 Web Component,因此支持 Layui、Vue、React、Angular 等几乎任何前端框架。她适配了 PC Web 端和手机端,并提供了 亮色 和 暗色 两个主题。除此之外,她还提供了…...

数据结构之《栈》
在之前我们已经学习了数据结构中线性表里面的顺序表与链表,了解了如何实现顺序表与链表增、删、查、该等功能。其实在线性表中除了顺序表和链表还有其他的类别,在本篇中我们就将学习另外一种线性表——栈,在通过本篇的学习后,你将…...

Vue3基础语法
一:创建Vue3工程(适用Vite打包工具) Vite官网:Home | Vite中文网 (vitejs.cn) 直接新建一个文件夹,打开cmd运行: npm create vitelatest 选择Vue和TS语言即可 生成一个项目。 Vue3的核心语法ÿ…...

【Python】基础学习技能提升代码样例4:常见配置文件和数据文件读写ini、yaml、csv、excel、xml、json
一、 配置文件 1.1 ini 官方-configparser config.ini文件如下: [url] ; section名称baidu https://www.zalou.cnport 80[email]sender ‘xxxqq.com’import configparser # 读取 file config.ini # 创建配置文件对象 con configparser.ConfigParser() # 读…...

JavaScript基础——JavaScript调用的三种方式
JavaScript简介 JavaScript的作用 JavaScript的使用方式 内嵌JS 引入外部js文件 编写函数 JavaScript简介 JavaScript(简称“JS”)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。它是Web开发中最常用的脚本语言之一&#x…...

ITSS:IT服务工程师
证书亮点:适中的费用、较低的难度、广泛的应用范围以及专业的运维认证。 总体评价:性价比良好! 证书名称:ITSS服务工程师 证书有效期:持续3年 培训要求:必须参加培训,否则将无法参与考试 发…...

鸿蒙开发——axios封装请求、拦截器
描述:接口用的是PHP,框架TP5 源码地址 链接:https://pan.quark.cn/s/a610610ca406 提取码:rbYX 请求登录 HttpUtil HttpApi 使用方法...

Scikit-Learn中的分层特征工程:构建更精准的数据洞察
Scikit-Learn中的分层特征工程:构建更精准的数据洞察 在机器学习中,特征工程是提升模型性能的核心技术之一。Scikit-Learn(简称sklearn),作为Python中广受欢迎的机器学习库,提供了多种方法来进行特征工程&…...

CSOL遭遇DDOS攻击如何解决
CSOL遭遇DDOS攻击如何解决?在错综复杂的数字网络丛林中,《Counter-Strike Online》(简称CSOL)犹如一座坚固的堡垒,屹立在游戏世界的中心,吸引着无数玩家的目光与热情。这座堡垒并非无懈可击,DDo…...

基于python的BP神经网络红酒品质分类预测模型
1 导入必要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from tensorflow.keras.models import Sequential from tenso…...

Kylin与Spark:大数据技术集成的深度解析
引言 在大数据时代,企业面临着海量数据的处理和分析需求。Kylin 和 Spark 作为两个重要的大数据技术,各自在数据处理领域有着独特的优势。Kylin 是一个开源的分布式分析引擎,专为大规模数据集的 OLAP(在线分析处理)查…...

⌈ 传知代码 ⌋ 利用scrapy框架练习爬虫
💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

深入了解 Python 面向对象编程(最终篇)
大家好!今天我们将继续探讨 Python 中的类及其在面向对象编程(OOP)中的应用。面向对象编程是一种编程范式,它使用“对象”来模拟现实世界的事务,使代码更加结构化和易于维护。在上一篇文章中,我们详细了解了…...

手把手教你实现基于丹摩智算的YoloV8自定义数据集的训练、测试。
摘要 DAMODEL(丹摩智算)是专为AI打造的智算云,致力于提供丰富的算力资源与基础设施助力AI应用的开发、训练、部署。 官网链接:https://damodel.com/register?source6B008AA9 平台的优势 💡 超友好! …...

SSH相关
前言 这篇是K8S及Rancher部署的前置知识。因为项目部署测试需要,向公司申请了一个虚拟机做服务器用。此前从未接触过服务器相关的东西,甚至命令也没怎么接触过(接触最多的还是git命令,但我日常用sourceTree)。本篇SSH…...

mysql超大分页问题处理~
大家好,我是程序媛雪儿,今天咱们聊mysql超大分页问题处理。 超大分页问题是什么? 数据量很大的时候,在查询中,越靠后,分页查询效率越低 例如 select * from tb_sku limit 0,10; select * from tb_sku lim…...

Gitlab以及分支管理
一、概述 Git 是一个分布式版本控制系统,用于跟踪文件的变化,尤其是源代码的变化。它由 Linus Torvalds 于 2005 年开发,旨在帮助管理大型软件项目的开发过程。 二、Git 的功能特性 Git 是关注于文件数据整体的变化,直接会将文件…...

探索Axure在数据可视化原型设计中的无限可能
在当今数字化浪潮中,产品设计不仅关乎美观与功能的平衡,更在于如何高效、直观地传达复杂的数据信息。Axure RP,作为原型设计领域的佼佼者,其在数据可视化原型设计中的应用,正逐步揭开产品设计的新篇章。本文将从多个维…...

Redis 内存淘汰策略
Redis 作为一个内存数据库,必须在内存使用达到配置的上限时采取策略来处理新数据的写入需求。Redis 提供了多种内存淘汰策略(Eviction Policies),以决定在内存达到上限时应该移除哪些数据。...

逆天!吴恩达+OpenAI合作出了大模型课程!重磅推出《LLM CookBook》中文版
吴恩达老师与OpenAI合作推出的大模型系列教程,从开发者在大型模型时代的必备技能出发,深入浅出地介绍了如何基于大模型API和LangChain架构快速开发出结合大模型强大能力的应用。 这些教程非常适合开发者学习,以便开始基于LLM实际构建应用程序…...

uint16_t、uint32_t类型数据高低字节互换
1. 使用位运算和逻辑运算符实现 #include<stdio.h> #include<stdint.h> int main() {void test_3() {uint16_t version = 0x1234;printf("%#x\n",(uint8_t)version);printf("%#x\n", version>>8);/*** 在C语言中,uint16和uint8是无符号…...

Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解
目录 1、前言: 2、数据库搭建 : 建表语句: 3、后端实现,将图片存储进数据库: 思想: 找到图片位置(如下图操作) 图片转为Fileinputstream流的工具类(可直接copy&#…...

开放式耳机原理是什么?通过不入耳的方式,享受健康听音体验
在开放式耳机的领域又细分了骨传导和气传导两种类型的耳机, 气传导开放式耳机原理 气传导是传统的声音传递方式,它依赖于空气作为声音传播的介质。 声源输入:与普通开放式耳机相同,音频设备通过耳机线将电信号传递到耳机。 驱动…...