首页 文章 精选 留言 我的

精选列表

搜索[python],共10000篇文章
优秀的个人博客,低调大师

我是怎么用 Python 爬新浪新闻搜索结果的

前段时间有个需求,要批量采集某个关键词相关的新闻数据做舆情分析。选了一圈数据源,最后落在新浪新闻搜索上。原因有几个:收录量大,搜索结果带时间戳和来源媒体字段,数据结构相对规整,适合做时间序列分析。另外返回的是服务端渲染的 HTML,不需要处理 JavaScript 动态加载,采集成本低。 这篇文章记录整个爬取过程的技术细节,包括请求构造、响应解析、反爬策略和代理池设计。 ## 搜索接口分析 新浪新闻搜索的入口地址是 `https://search.sina.com.cn/`。在浏览器中搜索一个关键词,通过 Chrome DevTools 抓包,可以看到结果是通过一个 GET 请求返回的: ``` GET https://search.sina.com.cn/?q=人工智能&c=news&sort=rel&range=all&num=10&page=1 ``` |参数|含义|可选值| | --- | --- | --- | |q|搜索关键词,需 URL 编码|任意字符串| |c|频道分类|news / video / blog 等| |sort|排序方式|rel(相关性)/ time(时间)| |range|时间范围|all / 1d / 1w / 1m 等| |num|每页条数|默认 10| |page|页码|从 1 开始| 新浪对 `User-Agent` 做了基本校验,缺失或为空会直接返回 403。`Referer` 字段建议携带,模拟从搜索页面发起的正常浏览行为。`Accept-Encoding` 设为 `gzip, deflate` 可以减少传输体积,`requests` 库会自动处理解压。 ## 请求封装 用 `requests.Session` 复用 TCP 连接,减少握手开销。在批量翻页场景下能明显减少请求耗时。配合 `HTTPAdapter` 设置重试策略,对 429 和 5xx 自动重试并指数退避,避免对目标服务器造成瞬时压力: ``` import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_session() -> requests.Session: session = requests.Session() retry = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503], allowed_methods=["GET"]) adapter = HTTPAdapter(max_retries=retry, pool_connections=10, pool_maxsize=10) session.mount("http://", adapter) session.mount("https://", adapter) return session def search_sina_news(session, keyword, page=1, sort="time", num=10, timeout=15): url = "https://search.sina.com.cn/" params = {"q": keyword, "c": "news", "sort": sort, "range": "all", "num": num, "page": page} headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/120.0.0.0 Safari/537.36", "Referer": "https://search.sina.com.cn/" } resp = session.get(url, params=params, headers=headers, timeout=timeout) if resp.encoding and resp.encoding.lower() == "iso-8859-1": resp.encoding = resp.apparent_encoding resp.encoding = resp.encoding or "utf-8" return resp.text ``` 编码处理这段值得说明。`requests` 在响应头没有声明 `charset` 时会默认用 ISO-8859-1,导致中文乱码。这里检测到这个默认值就回退到 `apparent_encoding`(基于 `chardet` 的自动检测),再兜底用 UTF-8。新浪搜索结果页实际是 UTF-8,但这个防御性写法可以兼容后续可能遇到的非标准页面。 ## 结果解析 分析返回的 HTML 结构,每条搜索结果包裹在 `` 中,包含标题链接、摘要和来源时间信息。用 CSS 选择器提取字段,同时做基本的数据清洗: ``` from bs4 import BeautifulSoup from dataclasses import dataclass, asdict import re @dataclass class NewsItem: title: str url: str summary: str source: str pub_time: str def parse_results(html): soup = BeautifulSoup(html, "lxml") results = [] for item in soup.select(".box-result"): title_tag = item.select_one("h2 a") if not title_tag: continue meta = item.select_one(".fgray_time") meta_text = meta.get_text(strip=True) if meta else "" m = re.match(r"^(.*?)\s+(\d{4}[-/年]\d{1,2}[-/月]\d{1,2}日?.*)$", meta_text) source, pub_time = (m.group(1).strip(), m.group(2).strip()) if m else (meta_text, "") summary_tag = item.select_one("p.content") results.append(NewsItem( title=title_tag.get_text(strip=True), url=title_tag.get("href", ""), summary=summary_tag.get_text(strip=True) if summary_tag else "", source=source, pub_time=pub_time )) return results ``` 用 `dataclass` 定义数据模型比裸字典安全,字段类型在编码阶段就约束好,后续序列化到 CSV 或数据库不容易出问题。`_parse_meta` 里的正则兼容了两种常见时间格式(`2024-01-15` 和 `2024年01月15日`),比简单字符串拆分健壮。 ## 反爬策略与代理池 新浪的反爬分两个层级。第一层是基于 IP 的请求频率统计,同一 IP 短时间发送过多请求会触发限流,返回 403 或跳转验证码。第二层是行为检测,请求间隔过于均匀也会被标记为爬虫。对应策略是随机延迟加代理 IP 轮换。 纯延迟策略在采集量大时效率太低。100 个关键词每个 30 页,单 IP 延迟 3 秒要跑 2.5 小时。引入代理后多线程并发能压到 20 分钟以内。免费代理可用率通常低于 20%,建议用付费代理,关注代理类型和并发限制即可。 代理池的核心是健康检查和淘汰机制,不能拿到代理就直接用,需要在使用中记录成功率和响应时间: ``` import time import random from typing import Optional @dataclass class ProxyNode: address: str success_count: int = 0 fail_count: int = 0 avg_latency: float = 0.0 @property def score(self): total = self.success_count + self.fail_count if total == 0: return 0.5 return self.success_count / total * 0.7 + max(0, 1 - self.avg_latency / 5.0) * 0.3 class ProxyPool: def __init__(self, fetch_func, min_size=5): self._fetch = fetch_func self._min = min_size self._nodes = [] def refresh(self): for addr in self._fetch(): if not any(n.address == addr for n in self._nodes): self._nodes.append(ProxyNode(address=addr)) def get_proxy(self): available = [n for n in self._nodes if n.fail_count = 5: self._nodes.remove(node) ``` 按健康分加权选择代理,成功率高的优先调度,连续失败 5 次自动淘汰。`avg_latency` 用滑动平均(系数 0.7)平滑波动,避免单次偶发慢响应拉偏评分。代理请求的 timeout 建议设短一点(10 秒左右),质量差的代理经常建立连接后不返回数据,timeout 太长会阻塞整个采集线程。 ## 完整采集流程 把前面的模块组装起来,加上数据存储和去重: ``` import csv import logging import time import random import requests logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") logger = logging.getLogger(__name__) # 亿牛云隧道代理配置 TUNNEL_HOST = "proxy.16yun.cn" TUNNEL_PORT = "3128" TUNNEL_USER = "xxxxx" TUNNEL_PASS = "xxxxx" def get_tunnel_proxies() -> dict: """构建亿牛云隧道代理,每次请求由隧道自动切换出口 IP""" proxy_url = f"http://{TUNNEL_USER}:{TUNNEL_PASS}@{TUNNEL_HOST}:{TUNNEL_PORT}" return {"http": proxy_url, "https": proxy_url} def _is_blocked(html: str) -> bool: return any(k in html for k in ["验证码", "访问受限", "暂时无法访问"]) def search_with_tunnel( session: requests.Session, keyword: str, page: int, proxies: dict, max_retries: int = 3 ) -> str: """通过亿牛云隧道代理请求搜索接口,被拦截时自动重试换 IP""" url = "https://search.sina.com.cn/" params = {"q": keyword, "c": "news", "sort": "time", "range": "all", "num": 10, "page": page} headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/120.0.0.0 Safari/537.36", "Referer": "https://search.sina.com.cn/" } for attempt in range(max_retries): try: resp = session.get(url, params=params, headers=headers, proxies=proxies, timeout=10) if resp.encoding and resp.encoding.lower() == "iso-8859-1": resp.encoding = resp.apparent_encoding resp.encoding = resp.encoding or "utf-8" if resp.status_code == 200 and not _is_blocked(resp.text): return resp.text logger.warning(f"page={page} attempt={attempt+1} 被拦截或状态码异常") except (requests.Timeout, requests.ConnectionError) as e: logger.warning(f"page={page} attempt={attempt+1} 请求失败: {e}") time.sleep(random.uniform(1.0, 2.0)) return "" def crawl_and_save(keyword, max_pages=30, use_proxy=True): session = create_session() proxies = get_tunnel_proxies() if use_proxy else None results, seen = [], set() for page in range(1, max_pages + 1): if use_proxy: html = search_with_tunnel(session, keyword, page, proxies) else: html = search_sina_news(session, keyword, page=page) if not html or _is_blocked(html): logger.warning(f"page={page} 触发反爬,跳过") continue items = parse_results(html) if not items: break new = [r for r in items if r.url not in seen] seen.update(r.url for r in new) results.extend(new) logger.info(f"page={page} new={len(new)} total={len(results)}") time.sleep(random.uniform(1.5, 3.0)) if results: with open(f"sina_news_{keyword}.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=asdict(results[0]).keys()) writer.writeheader() writer.writerows([asdict(r) for r in results]) return results ``` ``` URL 去重用 `set` 存储已抓链接,新浪搜索结果偶尔跨页重复,尤其是按相关性排序时同一篇新闻可能出现在多个页码。CSV 用 `utf-8-sig` 编码(带 BOM),Windows 下 Excel 直接打开不乱码。 ## 踩过的坑 编码不一致。搜索页是 UTF-8,但跳转到详情页后编码可能是 GB2312 或 GBK,`` 和实际字节流偶尔对不上。不要信任单一来源的编码声明,用 `chardet.detect()` 检测字节流再解码。 搜索结果有页码上限。新浪新闻搜索最多返回约 760 条(76 页),超过后返回空页面。关键词命中量大时需要用 `range` 参数按时间分段查询再合并。 短效代理的生存周期。短效代理有效期通常 1 到 5 分钟,拉取后必须尽快消费。池子不要囤太多,快用完时再拉下一批,配合实际消费速度。 摘要字段是截断的。搜索页返回的 `content` 是正文前 100 到 200 字,不是完整正文。需要全文要额外请求详情页,详情页反爬比搜索页严格。 ## 最后 新浪新闻搜索采集整体难度不高。请求是标准 GET 参数拼接,响应是服务端渲染 HTML,不需要 Selenium 或 Playwright 这类浏览器自动化工具。主要工程挑战在反爬应对:频率控制、代理池管理、健康检查和淘汰策略。这些模块设计好了,换目标站点只需改请求参数和解析逻辑,底层框架可以复用。 单线程顺序采集对多数舆情分析场景够用。需要提速的话用 `concurrent.futures.ThreadPoolExecutor`,线程数控制在 5 到 10 个,配合代理池的并发限制。不建议开太多线程,一方面代理有并发上限,另一方面对目标站点压力过大可能触发更严格的封禁策略。 代码里用 `logging` 替代 `print` 输出日志,带时间戳和级别标签,方便后续接入日志收集系统。如果采集任务需要长期运行,建议加上异常捕获和断点续采逻辑:把已完成的页码持久化到本地文件,程序中断后从断点恢复,避免重复采集。

优秀的个人博客,低调大师

oeasy python 132 存取字典项_access_dictionary_item

# 存取字典项_access_dictionary_item ## 回忆 - 上次 研究了 - dictionay 的 词根和同义词 - 字典 有什么 `方法` 呢?🤔 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/74e498be3d96dc04aa8f1cebef29aae8.png) - 先回忆 列表方法 ### 回忆 - 构建列表 ``` l = ["zero", "one"] l l[0] l[1] ``` - 可以 数字 索引到 列表项 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/811d32b421c842b5fcecc4a1f2b350bd.png) - 字典中的 `key` - 也可以是数字吗? ### 字典 - 用整形数字作为key ``` d = {0: "zero", 1: "one"} d d[0] d[1] ``` - 尝试 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/d55f54d86db8fbbddf53655735e3752d.png) - 看起来这个时候 - 字典就相当于一个列表? ### 数据类型的意义 - 观察类型 ``` type(l) type(d) ``` - l 是 - 列表类的对象 - 使用 list类的 方法 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/79c26c034d57645b38300098361b59a1.png) - d是 - 字典类的对象 - 使用 字典类(dict)的方法 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/9ee4f7e3b4472bee3f8cecb3b23b8893.png) - 变量类型 不一样 - 方法也不一样 ### 颜色 - 比如我 想建立一个 终端颜色字典 - 我们 只能记住 颜色名字 - red - blue - green - 但是记不住颜色的编号 ``` colors = { "red": "\x1b[31m", "reset": "\x1b[0m", } colors ``` - 字典多大? ### 字典容量 ``` len(colors) ``` - 容量为2 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/6d4f3da9b7bf94ce78075f9e23b2f29d.png) - 收录两种颜色 - 一个红色 \33[31m - 一个还原色 \33[0m ![图片描述](https://developer.qcloudimg.com/http-save/7606088/f36dfa842b37595fb5c3fe54536b7962.png) - 这个东西怎么用呢? ### 使用字典 ``` colors["red"] colors["reset"] print(colors["red"]) print("red!red!red!") ``` - 后面的文字 全都染红 了 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/6c33339542b92c7026195c33a71d6bb3.png) - 想把颜色恢复 ### 颜色复位 ``` print(colors["reset"]) ``` - 颜色复位了 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/bb690194decf69afbddda4cc0f6b7794.png) ### 控制颜色输出范围 - 要求 - 只有 [ERROR]变红 - 前面 加colors["red"] - 后面 加colors["reset"] - 相当于 选中[ERROR] ``` print(colors["red"], "[ERROR]", colors["reset"], "oeasy") ``` - 通过 key 来找到 value - 这是 映射(map)关系 - 通过 key 键 - 得到 value 值 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/9137ce42000d77e4d8dcf47f9c8cc9aa.png) - 这样不用记颜色数值号了! - 靠的是什么? ### 映射字典 - 靠的 就是 key-value 之间的 - 映射 (mapping) - 想给 颜色字典 加个绿色 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/e04ed7f916a88373bb62a8fa13a45499.png) - 怎么办?🤔 ### 增加字典项 - 直接写 ``` colors["green"] = "\x1b[32m" colors ``` - 先添加 这个 键值对(pair) - 增加 green 这个键(key) - 以及\x1b[32m 这个值(value) ![图片描述](https://developer.qcloudimg.com/http-save/7606088/90ed00bd746fc2d2e77a1077e77b2d5d.png) - 观察字典容量 ``` len(colors) ``` - colors字典容量+1 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/64f3e187f7f49326c80b5f910fdcb18b.png) - 再 使用绿色 ``` print(colors["green"], "[info]", colors["reset"], "oeasy") ``` - 效果 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/41a90d8c267de13c98e428622e16ab2f.png) - 如果 - 已经 有green 了 - 我想要 修改 呢? ### 修改字典项 - 如果 green 这个key - 在字典里 已经有了 - 就 对于green 这个key 对应的的value - 进行修改 ``` colors["green"] = "\x1b[42m" colors ``` - 把 黑底绿字`\x1b[32m` - 变成了 绿底白字`\x1b[42m` ``` print(colors["green"], "[info]", colors["reset"], "oeasy") ``` - 效果 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/a07db302d60e3a8e3853d2e8bc8febc7.png) - 可以用update方法 - 更新 字典项 吗? ### 更新字典项 - 虽说先删除再添加也能更新 ``` colors = { "red": "\x1b[31m", "green": "\x1b[32m", "reset": "\x1b[0m", } print(colors["red"], "[ERROR]", colors["reset"], "oeasy") colors.update(red="\x1b[41m") print(colors["red"], "[ERROR]", colors["reset"], "oeasy") ``` - 试试这个 update ![图片描述](https://developer.qcloudimg.com/http-save/7606088/a72e24be4a50290da1dd0357ee6036f1.png) - 字典项的 增删改 - 都是通过 key索引到 字典项 - 如果 我想 - 删除 字典项 呢? ### 删除字典项 - 可以 直接del 删除 ``` del colors["green"] ``` - 有点像 del删除 - 列表 索引的元素 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/68211bbb159ff3d9b7820a089ca0e3c9.png) - 还有啥 删除的方法吗? ### pop ``` lst = list(range(6)) lst ``` - 先回忆 list.pop ![图片描述](https://developer.qcloudimg.com/http-save/7606088/1023371d997e5f486010eadfa3667afa.png) - 从 栈顶 弹栈 ``` lst.pop() lst ``` - 弹出最后一个 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/d1e465586f1a69922502f003887ea62d.png) - 回忆 弹栈 ### 弹栈 - pop the stack - 弹栈 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/b30da88d82925e8f23470abec71adbb9.png) - LIFO - Last In First Out - 后入先出 - 可以要求 弹谁 吗? ### 弹出 指定列表项 - 要求弹出2 ``` lst.pop(2) ``` - 从列表中删除 - 并 返回列表项 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/b733ac93ad1f5e576d2f4f02b0f794bb.png) - 如果 再pop(2) ``` lst.pop(2) ``` - 找到新的第2项 弹出 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/d752b80c0691d0d66a6c620e3e595ba3.png) - 列表项不存在呢? ``` lst.pop(100) lst ``` - 报索引错误 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/9014400dd88bf2d5f07dcbeded561b9f.png) - 再来看 字典 ### pop ``` d = { "cat": "miao", "dog": "wang" } ``` - 直接弹栈 ``` d.pop() ``` - 不知道 弹谁 - 报 KeyError ![图片描述](https://developer.qcloudimg.com/http-save/7606088/c5a0e5eb39c7142b84830228e0e15e74.png) ### 弹出指定字典项 - 用pop方法 删除key ``` d d.pop("cat") d d.pop("dog") d ``` - 在字典里 找key - 找到了 就删除 - 返回 value ![图片描述](https://developer.qcloudimg.com/http-save/7606088/4704a15b4de86891a5784128717573ca.png) - pop方法 没有找到key 呢? ### 没有找到 ``` d d.pop("rat") ``` - 没有找到 - 抛出异常 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/5eb03ec97d0911b60461c80235223f1f.png) - 除非 有第二个参数 ``` d.pop("rat", "notfound") ``` - 有第二个参数的话 - 就返回 第二个参数 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/a75bcd89551b1d991d71caee40bf3b13.png) - 观察文档 ### pop ``` help(dict.pop) ``` - 弹栈 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/bb822527c10c2a3fab38fe8055c73694.png) - dict.pop和list.pop - 有啥区别吗? ### 两种类型的 pop |特点|list.pop()|dict.pop()| | --- | --- | --- | |参数|索引 index|键 key| |无参数|弹栈顶|报错| |返回值|被弹元素|被弹键 对应的值| |不存在|报错|报错 / 设默认值 就 不报错| - 时间复杂度 如何? ### 时间复杂度 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/11b740a9348d5280117a98dcbf54b23e.png) - dict.pop 时间复杂度为O(1) - list.pop(i) 时间复杂度 O(n) - 字典删除效率更高 - 不过需要空间更大 ``` d.pop() ``` - 不支持 无参数 弹栈 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/4a42efc7a56b8197310aa44481a128b2.png) - 想要 无参弹栈 怎么办? ### 求助 - 不用参数 的 popitem ``` help(dict.popitem) ``` - 字典 非空 - 弹出最后一个 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/6b4d707bb87b01a312fc3887f6e5a53b.png) - 后入字典的 先弹出 - 由此可见 字典 是 有顺序的 ### 实践 ``` d = {"cat": "miao"} d["dog"] = "wang" d ``` - 先弹出 后面的dog - 再弹出 前面的cat ``` d.popitem() d d.popitem() d d.popitem() d ``` - 弹到 字典空了 - 直接抛出异常 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/5eb3ee9dfe212c65b5164269e1e10a74.png) ### 字典的顺序 - 这两个字典不一样 ``` d = {"cat": "miao"} d["dog"] = "wang" d2 = {"dog": "wang"} d2["cat"] = "miao" d d2 ``` - 第一个弹出的 字典项 也不一样 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/e97ae83b3512a1ca2511391381f18ee2.png) - 字典可以拷贝吗? ### 基础拷贝 ``` colors = { "red": "f00", "blue": "0f0", } colors2 = colors ``` - [https://pythontutor.com/visualize.html#mode=display](https://pythontutor.com/visualize.html#mode=display) ![图片描述](https://developer.qcloudimg.com/http-save/7606088/fc99c8fd89d3c9d76ca4f1ae9626ddc9.png) - =是直接 赋字典地址 - 两个字典指向相同位置 ### copy ``` colors = { "red": "f00", "blue": "0f0", } colors2 = colors.copy() ``` - 拷贝是复制出一个字典 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/3a8f25fa023b3c21d6a0cb3a98b56748.png) - 但是拷贝是浅拷贝 - shallow copy ### 浅拷贝 - 字典某个键的值 是 - 一个列表时 - 浅拷贝只能拷贝列表地址 ``` colors = { "red": ["f00","ff0000"], "blue": "0f0", } colors2 = colors.copy() ``` - 两个新字典中"red"对应的值是同一个列表 list ![图片描述](https://developer.qcloudimg.com/http-save/7606088/47aa414036d7fb21d72520e87c3a950d.png) - 换成深拷贝 ### 深拷贝 - 深拷贝深拷贝 - 深层次的拷贝 ``` from copy import deepcopy colors = { "red": ["f00","ff0000"], "blue": "0f0", } colors2 = deepcopy(colors) ``` - 彻底分配了 新空间 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/fe7d4fd645a7c25bb74c0d72d42e7cb4.png) - 如果列表 作为key可以吗? ### 列表作为key ``` d = { ["f00", "ff0000"]: "red" } ``` - 报错 - key 必须是 可哈希的 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/d628920c5f0f6edec947ef692b18ba4b.png) - list是变量 - 不可哈希 ### 总结 - 这次学习了 字典删除 - del 删除字典项 - pop 弹栈 - popitem 顺序弹栈 ![图片描述](https://developer.qcloudimg.com/http-save/7606088/1daa29be192631ed2870708854fa2156.png) - 字典 有什么 实际应用吗??🤔 - 下次再说!👋🏻

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

用户登录
用户注册