算精通_社区达人页

个人头像照片
算精通
已加入开发者社区2381

勋章 更多

个人头像照片
专家博主
专家博主
个人头像照片
星级博主
星级博主
个人头像照片
乘风问答官
乘风问答官
个人头像照片
技术博主
技术博主
个人头像照片
开发者认证勋章
开发者认证勋章
个人头像照片
一代宗师
一代宗师

成就

已发布1785篇文章
1780条评论
已回答17135个问题
317条评论
已发布0个视频
github地址

技术能力

兴趣领域
  • Java
  • C++
  • C语言
  • Python
  • Shell
  • Go
  • Kotlin
  • iOS开发
  • Android开发
  • 设计模式
擅长领域

北京阿里云ACE会长

暂无精选文章
暂无更多信息

2025年12月

2025年11月

2025年10月

2025年09月

2025年08月

2025年07月

2025年06月

2025年05月

2025年04月

2025年02月

  • 发表了文章 2025-02-07

    ubyte 数据集的制作【2月更文挑战第07天】

  • 发表了文章 2025-02-07

    10分钟搭建微信小程序ecs【2月更文挑战第07天】

  • 发表了文章 2025-02-07

    秒杀系统部署【2月更文挑战第07天】

  • 发表了文章 2025-01-23

    PAI ArtLab 平台红包制作【1月更文挑战第23天】

  • 发表了文章 2025-01-23

    一键创作 AI 有声绘本【1月更文挑战第23天】

  • 发表了文章 2025-01-23

    【1月更文挑战第23天】新年剧本动画截图

  • 发表了文章 2025-01-22

    【1月更文挑战第22天】

  • 发表了文章 2024-12-24

    【12月更文挑战第24天】

  • 发表了文章 2024-12-23

    【12月更文挑战第23天】

  • 发表了文章 2024-12-20

    【12月更文挑战第20天】

  • 发表了文章 2024-12-19

    【12月更文挑战第19天】

  • 发表了文章 2024-12-18

    【12月更文挑战第18天】

  • 发表了文章 2024-12-17

    【12月更文挑战第17天】

  • 发表了文章 2024-12-16

    【12月更文挑战第16天】

  • 发表了文章 2024-12-15

    【12月更文挑战第15天】

  • 发表了文章 2024-12-14

    【12月更文挑战第14天】

  • 发表了文章 2024-12-13

    【12月更文挑战第13天】

  • 发表了文章 2024-12-11

    【12月更文挑战第11天】

  • 发表了文章 2024-12-10

    【12月更文挑战第10天】

  • 发表了文章 2024-12-09

    【12月更文挑战第09天】

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2025-12-05

    12月冬日咖啡礼|阿里云 AI 体验馆邀你来体验

    体验了阿里云AI体验馆里的「大语言模型对话网站生成」功能,真的是近期试过最高效、最“傻瓜式”的建站工具了,必须夸一夸! 项目需要快速搭建一个商品展示页,附带基础的购买流程,原本预估至少要花一两天写前端、调样式、对接模拟订单。结果在体验馆里尝试了这个生成功能,整个过程几乎就是“对话式开发”——我只需要用自然语言描述需求, 系统就能快速生成一个结构完整、界面清晰的静态网站,不仅布局合理,连购物车累计、订单提交这些交互环节都一并实现了。 最让我觉得“太香了”的是,它生成的代码结构很干净,前端直接可用,也方便后续自定义调整风格或扩展功能。对我这种更关注后端和业务逻辑的人来说,相当于直接省去了从零写页面的时间,原型设计和功能验证的速度提升了一大截。 !DOCTYPE html> html lang='zh-CN'> head> meta charset='UTF-8' /> meta name='viewport' content='width=device-width, initial-scale=1.0'/> title>社区便民店 - 您身边的贴心小店/title> style> body { font-family: 'Arial', sans-serif; background-color: #f9f9f9; color: #333; margin: 0; padding: 0; } header { background-color: #ffcc33; color: #333; text-align: center; padding: 2rem 1rem; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } h1 { margin: 0; font-size: 2rem; } .tagline { font-size: 1.1rem; margin-top: 0.5rem; color: #555; } main { max-width: 1000px; margin: 2rem auto; padding: 0 1rem; } .products { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; } .product-card { background-color: white; border-radius: 12px; overflow: hidden; box-shadow: 0 3px 10px rgba(0,0,0,0.1); transition: transform 0.2s; } .product-card:hover { transform: translateY(-5px); } .product-icon { font-size: 4rem; text-align: center; padding: 1.5rem 0; background-color: #f0f8ff; } .product-info { padding: 1rem; } .product-title { font-size: 1.2rem; margin: 0 0 0.5rem; } .product-desc { color: #666; font-size: 0.9rem; margin: 0 0 1rem; } .product-price { font-weight: bold; color: #e67e22; font-size: 1.1rem; } button { background-color: #ffcc33; border: none; padding: 0.6rem 1rem; border-radius: 6px; cursor: pointer; font-size: 0.9rem; margin-top: 0.5rem; width: 100%; transition: background-color 0.2s; } button:hover { background-color: #e6b800; } .cart { position: fixed; bottom: 20px; right: 20px; background-color: #333; color: white; padding: 1rem; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.3); cursor: pointer; z-index: 100; } .cart span { background-color: #ff3333; color: white; border-radius: 50%; padding: 0.3rem 0.6rem; font-size: 0.9rem; margin-left: 0.5rem; } .modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); justify-content: center; align-items: center; z-index: 1000; } .modal-content { background-color: white; padding: 2rem; border-radius: 12px; width: 90%; max-width: 500px; box-shadow: 0 5px 15px rgba(0,0,0,0.2); } .modal h2 { margin-top: 0; color: #333; } .form-group { margin-bottom: 1rem; } label { display: block; margin-bottom: 0.5rem; color: #555; } input, textarea { width: 100%; padding: 0.7rem; border: 1px solid #ddd; border-radius: 6px; font-size: 1rem; } .btn-group { display: flex; justify-content: space-between; margin-top: 1.5rem; } .btn-close, .btn-submit { padding: 0.7rem 1.5rem; border: none; border-radius: 6px; cursor: pointer; font-size: 1rem; } .btn-close { background-color: #ccc; color: #333; } .btn-submit { background-color: #ffcc33; } .btn-close:hover { background-color: #bbb; } .btn-submit:hover { background-color: #e6b800; } .thank-you { text-align: center; color: #4CAF50; font-size: 1.2rem; margin-top: 1rem; display: none; } /style> /head> body> header> h1>🏪 社区便民店/h1> p class='tagline'>新鲜到家 · 服务邻里 · 快速配送/p> /header> main> h2>🛒 热卖商品/h2> div class='products' id='products-container'> !-- 商品将通过 JS 动态插入 --> /div> /main> !-- 购物车图标 --> div class='cart' id='cart-button'> 🛒 我的订单 span id='cart-count'>0/span> /div> !-- 下单模态框 --> div class='modal' id='order-modal'> div class='modal-content'> h2>📝 提交订单/h2> form id='order-form'> div class='form-group'> label for='name'>姓名/label> input type='text' id='name' required /> /div> div class='form-group'> label for='phone'>手机号/label> input type='tel' id='phone' required /> /div> div class='form-group'> label for='address'>配送地址/label> input type='text' id='address' required /> /div> div class='form-group'> label for='note'>备注(如:放门口、电话联系等)/label> textarea id='note' rows='3'>/textarea> /div> div class='btn-group'> button type='button' class='btn-close' id='close-modal'>取消/button> button type='submit' class='btn-submit'>提交订单/button> /div> /form> p class='thank-you' id='thank-you-message'>✅ 订单已提交!我们会尽快为您配送!/p> /div> /div> script> // 商品数据 const products = [ { id: 1, emoji: '🥛', name: '鲜牛奶', desc: '本地牧场直供,每日新鲜送达', price: 12 }, { id: 2, emoji: '🍞', name: '全麦面包', desc: '无添加,健康早餐首选', price: 8 }, { id: 3, emoji: '🥚', name: '土鸡蛋', desc: '农家散养,营养丰富', price: 15 }, { id: 4, emoji: '🥬', name: '有机青菜', desc: '当日采摘,绿色无公害', price: 6 }, { id: 5, emoji: '🍎', name: '红富士苹果', desc: '脆甜多汁,富含维生素', price: 10 }, { id: 6, emoji: '🧃', name: '橙汁饮料', desc: '100%纯果汁,无糖添加', price: 9 }, { id: 7, emoji: '🍚', name: '东北大米', desc: '新米上市,粒粒香软', price: 35 }, { id: 8, emoji: '🧈', name: '黄油', desc: '进口乳脂,烘焙佳品', price: 22 } ]; // 购物车 let cart = []; // 渲染商品列表 function renderProducts() { const container = document.getElementById('products-container'); container.innerHTML = ''; products.forEach(product => { const card = document.createElement('div'); card.className = 'product-card'; card.innerHTML = ` ${product.emoji} ${product.name} ${product.desc} ¥${product.price} ${product.id}'>加入购物车 `; container.appendChild(card); }); // 绑定按钮事件 document.querySelectorAll('.product-card button').forEach(btn => { btn.addEventListener('click', () => { const id = parseInt(btn.getAttribute('data-id')); addToCart(id); }); }); } // 添加到购物车 function addToCart(id) { const product = products.find(p => p.id === id); if (product) { cart.push(product); updateCartCount(); alert(`✅ 已加入:${product.name}`); } } // 更新购物车数量 function updateCartCount() { document.getElementById('cart-count').textContent = cart.length; } // 显示下单模态框 function showOrderModal() { if (cart.length === 0) { alert('🛒 购物车为空,请先选择商品!'); return; } document.getElementById('order-modal').style.display = 'flex'; document.getElementById('thank-you-message').style.display = 'none'; } // 关闭模态框 function closeOrderModal() { document.getElementById('order-modal').style.display = 'none'; } // 提交订单 function submitOrder(event) { event.preventDefault(); const name = document.getElementById('name').value; const phone = document.getElementById('phone').value; const address = document.getElementById('address').value; if (!name || !phone || !address) { alert('请填写完整信息!'); return; } // 模拟提交 console.log('订单提交:', { name, phone, address, note: document.getElementById('note').value, items: cart }); // 显示感谢信息 document.getElementById('order-form').style.display = 'none'; document.getElementById('thank-you-message').style.display = 'block'; // 重置 setTimeout(() => { closeOrderModal(); cart = []; updateCartCount(); document.getElementById('order-form').style.display = 'block'; document.getElementById('thank-you-message').style.display = 'none'; document.getElementById('order-form').reset(); }, 2000); } // 页面加载完成后初始化 window.addEventListener('DOMContentLoaded', () => { renderProducts(); updateCartCount(); // 绑定事件 document.getElementById('cart-button').addEventListener('click', showOrderModal); document.getElementById('close-modal').addEventListener('click', closeOrderModal); document.getElementById('order-form').addEventListener('submit', submitOrder); // 点击模态框外部关闭 document.getElementById('order-modal').addEventListener('click', (e) => { if (e.target === document.getElementById('order-modal')) { closeOrderModal(); } }); }); /script> /body> /html> 如果能接入更多大模型进行内容辅助生成(比如自动编写商品描述、生成合规条款等),那就真的从“建站”升级到“内容+功能”一体化生成了。 结合自动化部署,实现生成的网站,一键部署,就更友好了。
    踩0 评论0
  • 回答了问题 2025-12-05

    12月冬日咖啡礼|大模型解决方案邀你来体验

    最近刚好体验了阿里云百炼平台上的“n8n+百炼:自动获取AI热点资讯”这个解决方案,说实话,真的挺惊喜的。 之前每天都要花不少时间手动翻各种科技媒体、论坛、博客,生怕错过重要的AI动态,但信息太杂,效率低还容易漏。看到这个方案后,抱着试一试的心态用百炼快速部署了一下,整个流程比想象中简单很多,几乎没写什么代码,主要是通过 n8n 配置抓取和推送节点,再接入百炼的模型能力做摘要提炼。 # 角色 你是一位资深的AI科技编辑与数据分析师。 # 核心任务 你的任务分为两个阶段: 1. **提取阶段**:从我提供的HTML数据中,精准地提取出文章的**标题 (title)** 和完整的**正文内容 (content)**。 2. **总结阶段**:基于提取出的`content`,撰写一段**高度精炼、信息密集的摘要 (summary)**。 # 执行规则 ### 1. 提取规则 * **`title` (字符串)**: 提取文章的H1主标题。 * **`content` (字符串)**: 提取文章的主体文本。必须清除所有HTML标签,只保留纯文本,并保留段落结构。忽略所有非正文元素(如导航栏、页脚、侧边栏、脚本等)。 ### 2. 总结规则 * **`summary` (字符串)**: * **目标**: 让读者在不阅读全文的情况下,仅通过摘要就能快速掌握新闻的全部核心信息。 * **内容**: 必须包含事件的几个关键要素:**谁 (Who)**、**做了什么 (What)**、**为什么做 (Why)**,以及**它的关键特性或影响 (Key Features/Impact)**。 * **风格**: 语言专业、简练,字数控制在100字左右。 # 输出格式 * 严格按照以下JSON结构返回结果,不包含任何额外的解释或说明文字。 { 'title': '提取的文章标题', 'content': '提取的完整纯文本内容', 'summary': '根据内容生成的专业摘要' } 钉钉群里就已经推送好了一份整理好的AI热点摘要,不仅来源覆盖全,关键信息还被百炼提炼得清清楚楚,有时候还会附带一些趋势小结。这样一来,我们开早会讨论行业动向的时候,明显感觉信息同步快了很多,也不用再到处翻来翻去找资料了。 阿里云在降低AI应用门槛这方面做得挺实在的,确实是从实际场景出发,帮开发者省时间、提效率。希望之后还能看到更多这种轻量、落地方案的推荐!
    踩0 评论0
  • 回答了问题 2025-12-05

    我做了一个机器人,输出一段文字,想在文字内实现换行,请换应该使用什么换行符号来控制换行?

    没有唯一的“换行符号”,具体使用哪一个,完全取决于您的文本最终在哪里显示/渲染。 纯文本环境(如:控制台、记事本、多数聊天软件的纯文本消息) text = '这是第一行。\n这是第二行。' print(text) let text = '这是第一行。\n这是第二行。'; console.log(text); HTML网页环境 p>这是第一行。br>这是第二行。/p> 混合环境(如:Markdown、某些富文本编辑器) 这是第一行。(后面有两个空格) 这是第二行。
    踩0 评论0
  • 回答了问题 2025-12-04

    租云服务器一个月多少钱?

    https://swasnext.console.aliyun.com/buy?spm=5176.161059.J_5253785160.3.7ec6a5051bxa7k#/ 轻量应用服务器 (Simple Application Server)是面向网站建设、开发测试、小型应用等轻量应用场景的云服务器产品
    踩0 评论0
  • 回答了问题 2025-12-04

    如何5分钟为WordPress网站提速300%?

    安装并启用缓存插件(如 WP Rocket、LiteSpeed Cache 或 W3 Total Cache),开启“页面缓存”和“浏览器缓存”选项。动态页面转为静态HTML,大幅减少服务器计算和数据库查询,可提升50%以上加载速度 安装图片优化插件(如 Smush、ShortPixel),执行批量压缩现有图片并启用WebP格式转换。图片压缩和转WebP可减少70%图片体积,提升加载速度。
    踩0 评论0
  • 回答了问题 2025-12-04

    NAS用DDNS GO做内网穿透

    清除电脑DNS缓存: Windows:命令提示符运行 ipconfig /flushdns macOS:终端运行 sudo dscacheutil -flushcache 更换电脑的DNS服务器为公共DNS(如8.8.8.8或114.114.114.114)。 在电脑上用 nslookup 你的域名 检查解析结果是否与手机一致。
    踩0 评论0
  • 回答了问题 2025-11-07

    鸿蒙分享WEB页面,缩略图是用本地图片无法显示问题

    钉钉分享时 mThumbData 只认 JPEG + 85 以下质量 + 32 kB 以内,你现在给了 PNG + 100 质量,直接超限,导致缩略图被丢弃。 参考程序 import { image } from '@kit.ImageKit'; // 1. 读本地图片 const thumbData = await getContext().resourceManager .getMediaContent($r('app.media.ic_ding_ding_share_thumb')); // 2. 转成 PixelMap const pixelMap = image.createImageSource(thumbData.buffer) .createPixelMapSync(); // 3. 压缩成 **JPEG,质量 75,最长边 120 px** const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 75, size: { width: 120, height: 120 } // 等比缩放,钉钉内部会再压 }; const thumbBuffer = await image.createImagePacker() .packToData(pixelMap, packOpts); // 4. 保证 ≤ 32 kB console.info('thumb size=' + thumbBuffer.byteLength); // 调试用 if (thumbBuffer.byteLength > 32768) { // 再压一次,质量降到 60 packOpts.quality = 60; thumbBuffer = await image.createImagePacker() .packToData(pixelMap, packOpts); } // 5. 塞进消息体 webpMessage.mThumbData = new Uint8Array(thumbBuffer); 微信对缩略图格式/大小容忍度高,PNG 100 质量 80 kB 也能收;钉钉服务端会做二次校验,超限就直接丢弃,客户端表现为“空白缩略图”。 图片必须 JPEG(钉钉文档隐藏限制)。单张 ≤ 32 kB(实测 33 kB 就会被刷掉)。分辨率不用太高,120×120 足够,越大越容易被压爆。如果仍不显示,把 mUrl 里的页面也补一张 og:image meta 图,钉钉fallback 会取它。
    踩0 评论0
  • 回答了问题 2025-11-07

    VScode、Trae断点的按钮找不到

    “断点按钮”其实就藏在左侧运行视图(Run & Debug)里 打开“运行”侧边栏快捷键:Windows/Linux:Ctrl+Shift+DmacOS:⇧+⌘+D 确认已安装 Python 扩展(ReAct 代码是 Python) 创建/选中 launch.json(让调试按钮生效)在 Run & Debug 视图里,顶部有行小字:“没有可用的调试配置,请创建一个 launch.json”点蓝色“创建 launch.json” → 选 “Python” → “Python 文件”。自动生成 .vscode/launch.json 后,左上角就会出现▶️ 绿色三角、“Step Over”、“添加断点”等全部按钮。 Trae 是基于 VS Code 的发行版,同一套界面。若依旧没有调试图标,把左侧活动栏重置:命令面板 → View: Reset View Locations(视图:重置视图位置),图标会全部恢复默认。
    踩0 评论1
  • 回答了问题 2025-11-07

    webhook配置好之后,收不到消息通知,是用于MQTT报警信息。

    webhook 没收到请求,或者收到了但没转发到 MQTT。 查看告警系统日志(比如 Prometheus Alertmanager、Grafana、或你自己的告警系统):看有没有 webhook delivered 或 webhook failed 日志。 如果你的 webhook 是自己写的(比如 Python Flask、Node.js、Go),看日志:有没有收到 POST 请求。有没有报错(比如 JSON 解析失败、MQTT 连接失败)。 用 MQTT 客户端手动订阅主题 mosquitto_sub -h broker.emqx.io -t 'alert/#' -v 先用 webhook.site 确认告警有没有发出,再用 mosquitto_sub 确认 MQTT 能不能收到,中间看 webhook 日志
    踩0 评论0
  • 回答了问题 2025-10-27

    如何训练属于自己的AI大模型呢?有没有大佬有相关文档参考学习下

    阿里云有很多实验案例 训练学习 魔搭社区 很多模型训练
    踩0 评论0
  • 回答了问题 2025-10-27

    做跨境电商,采集数据用python自己写还是用亮数据API?

    方案对比 Python自研爬虫 适合场景: 监控特定竞争对手网站(你知道的具体网站)采集公开的社交媒体讨论、论坛评价定制化的价格跟踪和库存监控预算有限,但技术能力较强 优势: 成本可控,只需服务器费用完全自定义,灵活度高数据采集频率和字段自主决定 挑战: 需要应对反爬虫机制维护成本高(网站改版就要调整)IP容易被封,需要代理池开发周期长 亮数据API 适合场景: 大规模平台数据(亚马逊、eBay等)需要稳定、合规的数据源快速启动项目,时间紧迫缺乏专业爬虫团队 优势: 开箱即用,快速上手数据稳定,避免封IP风险数据结构化,节省清洗时间相对更合规 挑战: 成本较高(按调用量收费)数据字段可能不完全符合需求依赖第三方服务 建议:混合方案 第一阶段:启动期(建议亮数据API) 先用亮数据API快速验证业务需求: 采集主要平台(亚马逊、eBay)的3C产品数据分析热销品类、价格区间、用户评价建立初步的数据分析模型 第二阶段:扩展期(混合使用) 在亮数据基础上,补充自研爬虫: 用Python监控特定竞争对手网站采集社交媒体和论坛的用户讨论跟踪行业新闻和趋势报告 第三阶段:优化期(根据效果调整) 评估数据价值: 如果数据带来的收益 > API成本,继续使用亮数据如果某些数据源价值有限,转为自研或停止采集 具体实施思路 先明确你要分析什么: 哪些产品的销量趋势?竞争对手的定价策略?用户关注哪些产品特性? 从亮数据开始: 选择适合的API套餐先跑通数据采集流程验证数据质量是否满足需求 逐步补充自研能力: 针对亮数据覆盖不足的网站开发定制化的监控工具 这样既能快速获得商业价值,又能保持长期的数据采集能力。
    踩0 评论0
  • 回答了问题 2025-10-27

    如何使用Python playwright采集网页数据不被检测到?

    关键防检测要点 指纹多样性:每次会话使用不同的 User-Agent、视窗大小、时区行为随机化:添加随机延迟、模拟人类鼠标移动和滚动自动化特征移除:清除 webdriver 特征和 Chrome 自动化标志IP 轮换:使用高质量代理池避免 IP 被封会话管理:定期更换浏览器上下文和 Cookie 这些措施能显著提高采集稳定性,但要注意遵守网站的 robots.txt 和服务条款。 1. 浏览器指纹伪装 import asyncio from playwright.async_api import async_playwright async def create_stealth_browser(): playwright = await async_playwright().start() # 使用 Chromium 并随机化视窗大小 browser = await playwright.chromium.launch( headless=False, # 建议使用非无头模式 args=[ '--disable-blink-features=AutomationControlled', '--disable-features=VizDisplayCompositor', '--no-first-run', '--no-default-browser-check', '--disable-default-apps', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--no-zygote', f'--window-size={random.randint(1200, 1920)},{random.randint(800, 1080)}' ] ) # 创建上下文并设置高级伪装 context = await browser.new_context( viewport={'width': 1920, 'height': 1080}, user_agent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', permissions=[], geolocation=None, locale='zh-CN', timezone_id='Asia/Shanghai', color_scheme='light', extra_http_headers={ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', } ) # 移除自动化特征 await context.add_init_script(''' Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); delete navigator.__proto__.webdriver; Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5], }); window.chrome = { runtime: {}, }; ''') return browser, context 2. 人类行为模拟 import random import time from playwright.async_api import Page class HumanBehavior: @staticmethod async def random_delay(page: Page, min_delay=1, max_delay=3): '''随机延迟''' await page.wait_for_timeout(random.randint(min_delay * 1000, max_delay * 1000)) @staticmethod async def human_click(page: Page, selector: str): '''模拟人类点击行为''' element = await page.wait_for_selector(selector) # 随机移动鼠标到元素 box = await element.bounding_box() if box: x = box['x'] + box['width'] * random.uniform(0.3, 0.7) y = box['y'] + box['height'] * random.uniform(0.3, 0.7) # 分段移动鼠标 steps = random.randint(3, 8) for i in range(steps): progress = (i + 1) / steps current_x = x * progress + random.uniform(-5, 5) current_y = y * progress + random.uniform(-5, 5) await page.mouse.move(current_x, current_y) await page.wait_for_timeout(random.randint(50, 150)) await element.click() @staticmethod async def human_scroll(page: Page): '''模拟人类滚动行为''' scroll_steps = random.randint(3, 8) for _ in range(scroll_steps): scroll_amount = random.randint(200, 800) await page.evaluate(f'window.scrollBy(0, {scroll_amount})') await page.wait_for_timeout(random.randint(500, 2000)) @staticmethod async def human_typing(page: Page, selector: str, text: str): '''模拟人类输入''' await page.click(selector) for char in text: await page.type(selector, char, delay=random.uniform(50, 200)) await page.wait_for_timeout(random.randint(50, 150)) 3. 代理和会话管理 class AntiDetectionManager: def __init__(self, proxy_list=None): self.proxy_list = proxy_list or [] self.current_proxy_index = 0 def get_next_proxy(self): '''轮换代理''' if not self.proxy_list: return None proxy = self.proxy_list[self.current_proxy_index] self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list) return proxy async def rotate_session(self, browser, context): '''轮换会话''' await context.close() proxy = self.get_next_proxy() new_context = await browser.new_context( user_agent=self.get_random_user_agent(), proxy=proxy ) # 重新应用伪装脚本 await new_context.add_init_script(self.get_stealth_script()) return new_context @staticmethod def get_random_user_agent(): '''获取随机 User-Agent''' user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36' ] return random.choice(user_agents) 4. 完整的采集示例 async def stealthy_data_collection(url: str, selectors: dict): '''完整的防检测数据采集流程''' # 创建伪装浏览器 browser, context = await create_stealth_browser() page = await context.new_page() try: # 访问页面 await page.goto(url, wait_until='networkidle') # 模拟人类行为 await HumanBehavior.random_delay(page, 2, 5) await HumanBehavior.human_scroll(page) # 采集数据 data = {} for key, selector in selectors.items(): try: elements = await page.query_selector_all(selector) data[key] = [await element.text_content() for element in elements] await HumanBehavior.random_delay(page, 1, 2) except Exception as e: print(f'采集 {key} 时出错: {e}') data[key] = [] return data finally: await context.close() await browser.close() # 使用示例 async def main(): url = 'https://example.com/jobs' selectors = { 'job_titles': '.job-title', 'companies': '.company-name', 'locations': '.job-location', 'salaries': '.salary-range' } data = await stealthy_data_collection(url, selectors) print(data)
    踩0 评论0
  • 回答了问题 2025-10-27

    我想用AI采集数据,如何部署和使用MCP服务,比如brightdata-mcp?

    概括为以下几步: 步骤关键任务说明与提示1. 获取凭据注册Bright Data并获取API密钥在控制台找到API密钥和用户身份验证字符串。2. 配置MCP服务编写MCP服务器配置文件使用npx命令运行,在配置中填入你的API密钥和身份验证字符串。3. 集成与使用将MCP服务配置到你的AI应用或智能体中在智能体平台(如Trae)配置MCP服务,并设置提示词指导AI调用工具。 🛠️ 注意事项 数据合规性:Bright Data在数据抓取和存储过程中遵守全球数据隐私法规,使用起来相对合规安全。免费额度:Bright Data通常会提供免费试用额度,足够用于前期的测试和验证。 Bright Data MCP 服务的部署和使用示例: 1. 安装和配置 # 安装 MCP 客户端 npm install @modelcontextprotocol/sdk 2. 创建 MCP 服务器配置 // brightdata-mcp-server.js import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { BrightDataClient } from 'brightdata-mcp-client'; const server = new Server({ name: 'brightdata-mcp', version: '1.0.0', }); // 初始化 Bright Data 客户端 const brightData = new BrightDataClient({ apiKey: process.env.BRIGHT_DATA_API_KEY, authentication: process.env.BRIGHT_DATA_AUTH }); // 注册搜索工具 server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'search_jobs', description: '搜索海外职位数据', inputSchema: { type: 'object', properties: { query: { type: 'string', description: '搜索关键词' }, location: { type: 'string', description: '职位地点' }, limit: { type: 'number', description: '返回结果数量' } }, required: ['query'] } } ] }; }); 3. 使用示例 # 使用 Bright Data MCP 采集职位数据 import asyncio from mcp_client import McpClient async def collect_job_data(): client = McpClient('brightdata-mcp-server.js') # 搜索数据科学家职位 result = await client.call_tool( 'search_jobs', { 'query': '数据科学家', 'location': '美国', 'limit': 50 } ) # 处理返回的职位数据 jobs = result.content for job in jobs: print(f'职位: {job.title}') print(f'公司: {job.company}') print(f'地点: {job.location}') print('---') return jobs # 运行采集 asyncio.run(collect_job_data()) 4. 环境变量配置 # .env 文件 BRIGHT_DATA_API_KEY=your_api_key_here BRIGHT_DATA_AUTH=your_auth_string_here MCP_SERVER_PATH=./brightdata-mcp-server.js 这样你就可以通过 AI 模型直接调用 MCP 工具来采集和分析海外职位数据了。
    踩0 评论0
  • 回答了问题 2025-10-27

    钉钉如何根据 request id 查询接口异常信息

    这是官方提供的自助查询工具,信息最全,包括请求参数、返回结果和错误堆栈。 操作步骤: 登录开放平台后台: 访问 钉钉开放平台。使用企业管理员或子管理员(拥有应用管理权限)的钉钉账号扫码登录。 进入“运维管理”: 在左侧导航栏中,找到并点击 “运维管理” -> “日志查询”。 输入 Request ID 查询: 在日志查询页面,你会看到一个 “请求ID” 的输入框。将你从错误响应中获取的 requestid(例如:0A1234B5C6D7_1234567890)完整地复制粘贴进去。选择合适的时间范围(通常覆盖你发起请求的时间即可)。点击 “查询”。 分析查询结果: 查询成功后,你会看到一条或多条记录。点击记录查看详情,通常包含以下关键信息:请求详情:你调用 API 时使用的 URL、HTTP Method、请求头等。请求参数:你发送的 Body 参数,这对于排查参数错误至关重要。返回结果:钉钉服务器返回的完整 HTTP 状态码和响应体,其中就包含了具体的错误码和错误信息。错误堆栈:对于某些服务端异常,这里可能会显示更详细的堆栈信息,有助于钉钉技术支持分析问题。
    踩0 评论0
  • 回答了问题 2025-09-12

    Kimi-K2-Instruct 开了挂一般的推理和调用,底层魔法是什么?

    模型基于混合专家(MoE)架构构建,在知识处理、推理和编程等任务上表现优异,尤其优化了工具使用与API调用的性能。现支持通过云端API快速集成和部署,无需编码背景,大大降低了使用门槛。
    踩0 评论0
  • 回答了问题 2025-09-12

    资源部署与调用相关技术咨询

    ModelScope不会为每个模型长期占用一个GPU或一台服务器。 容器化封装:每一个模型都被封装成一个独立的、标准化的Docker容器。这个容器内包含了模型文件、依赖的环境(Python, PyTorch, TensorFlow等)、以及一套统一的API接口(例如基于HTTP的RESTful API)。这保证了模型环境的一致性,也实现了模型与模型之间的隔离。 按需加载:当用户点击“在线体验”时,调度系统并不会立即启动一个模型容器。而是先检查资源池中是否有该模型正在运行中的实例。 如果有(模型是“热”的):直接将用户的请求路由到该运行中的实例,用户几乎无感知地获得结果。 如果没有(模型是“冷”的):调度系统会从模型仓库中拉取对应的容器镜像,然后在资源池中找一个有空闲资源的服务器(CPU/GPU),启动这个模型的容器。这个过程需要一定时间(十几秒到一分钟,这就是为什么有时体验需要“等待加载”)。
    踩1 评论2
  • 回答了问题 2025-09-10

    阿里云数据库叫什么

    按数据模型可大致分为关系型、NoSQL、分析型与时序/图四类 关系型RDS MySQL / PostgreSQL / SQL Server / MariaDBPolarDB(云原生,兼容 MySQL/PostgreSQL)PolarDB-X(分布式关系型)NoSQLTair(兼容 Redis,内存型)MongoDB(文档型)Tablestore(宽表/键值,海量结构化)Lindorm(多模型,含宽表、时序、文件等)分析型(数据仓库)AnalyticDB(ADB,支持 MySQL/PostgreSQL 协议)时序与图TSDB(时序数据库)GDB(图数据库)
    踩0 评论0
  • 回答了问题 2025-09-10

    阿里云服务器多少钱一年?

    阿里云服务器的价格根据配置、类型和促销活动差异较大https://www.aliyun.com/price/detail?spm=5176.21213303.nav-v2-dropdown-menu-5.d_main_0.2ff72f3d4ot30H&scm=20140722.M_10513479._.V_1&saleProductCode=ecs 价格对比(以包年为例
    踩0 评论0
  • 回答了问题 2025-09-10

    阿里云服务器收费价格表最新

    产品定价中心 https://www.aliyun.com/price/detail?spm=5176.21213303.nav-v2-dropdown-menu-5.d_main_0.2ff72f3d4ot30H&scm=20140722.M_10513479._.V_1&saleProductCode=ecs 一台云服务器ECS包括计算、存储、网络、快照服务等计费项,每个计费项及其支持的计费模式具体如下图所示。
    踩0 评论0
  • 回答了问题 2025-08-21

    NAS文件系统支持自定义share_name吗

    阿里云 NAS根据阿里云开发者社区的信息,NAS 文件系统支持自定义 share_name。在阿里云的文件存储 NAS 服务中,你可以通过管理控制台或 API 创建和管理共享目录,并指定共享名称。vserver cifs share create -vserver vserver_name -share-name my_custom_share_name -path /path/to/directory 大多数 NAS 系统支持自定义 share_name,但具体操作方式取决于你使用的 NAS 解决方案。如果你使用的是阿里云 NAS、NetApp ONTAP 或其他支持自定义共享名称的系统,可以直接通过管理界面或命令行工具进行配置。
    踩0 评论0
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息