豆瓣Top100爬虫实战:从请求到CSV乱码解决的完整复盘
标题起得挺直白但真正动手之后才发现这项目其实分两关第一关是把豆瓣Top100电影的数据抓下来第二关是把它存成Excel能正常打开的CSV文件。第二关看着简单实际上最折磨人我第一次做的时候卡在编码问题上差不多两个小时网上搜到的答案千篇一律地告诉你“加BOM”但没人讲清楚为什么加了就不乱码、不加就乱码。这篇就当作一次完整复盘。我会把请求怎么写、页面怎么解析、CSV怎么落盘、乱码怎么彻底解决都讲一遍重点是每一步背后的原因而不是丢一段能跑就算完。适合刚学爬虫的读者也适合被CSV乱码坑过但一直没搞懂原理的同学。1. 项目发起与数据源分析1.1 为什么选择豆瓣Top100做练手爬虫项目说多不多说少不少但豆瓣电影榜单几乎是所有初学者的必经之路。原因很简单页面结构清晰字段语义明确数据量不大不小既不会因为解析逻辑太复杂劝退新手又足够让你练到请求、解析、存储、编码这一整条流水线。Top100这个范围也很好用。豆瓣官方榜单是Top250一次展示25条一共10页。取Top100意味着只需要抓前4页总共100条记录请求次数少分析压力小跑一次也就几秒钟的事。相比动辄几千条的电商数据这个体量适合用来做小项目不会因为反爬策略太强而打击信心。不少人在这一步会犯一个毛病一上来就想着“做大”要抓全部250条要抓所有评论要做数据分析可视化。结果请求频率一高访问一会收到403错误项目直接卡死在起步阶段。我的建议是先定一个明确的小目标——比如“只抓Top100只存4个字段保证CSV不乱码”——跑通之后再谈扩展。小目标跑通了大目标只是时间问题。1.2 数据源页面怎么选这里有个容易混淆的地方搜索“豆瓣Top100”其实没有单独一个叫Top100的榜单页面。比较稳妥的做法是拿Top250页面作为数据源解析前100条记录。Top250的URL规律非常规整第一页https://movie.douban.com/top250?start0filter 第二页https://movie.douban.com/top250?start25filter 第三页https://movie.douban.com/top250?start50filter 第四页https://movie.douban.com/top250?start75filterstart参数每次增加25代表当前页第一条在总榜单里的偏移量。这个规律对翻页抓取极其友好不用去解析下一页的链接直接用循环拼URL就行。另外filter这个参数在页面上是用来筛选语言类型的留空表示不过滤可以原样保留。有的教程里会省略它实测不影响结果但保留更接近浏览器的真实请求。1.3 目标字段与文件形式确定动手前先想清楚要存什么。榜单页面上每部电影可以拿到的字段包括排名中文片名外文片名导演和主演信息上映年份和地区类型评分评价人数一句话短评如果存在做一个小项目不需要贪多我建议先存四个核心字段排名、中文片名、评分、评价人数。这四个字段既稳定又有代表性做后续可视化也够用。导演、演员、年份、类型这些可以放到扩展阶段再做它们的解析逻辑更复杂有些电影的外文片名还不止一个初次做容易把代码绕进去。文件形式就选CSV。CSV本质上是纯文本表格可以用记事本打开可以用Excel打开也可以直接被pandas读取是数据交换的“万金油”格式。唯一的痛点就是编码问题这也是本篇后半部分要重点解决的。2. 环境准备与请求设置2.1 依赖库怎么装核心依赖只有两个requests和beautifulsoup4。pip install requests beautifulsoup4如果后面想用pandas的to_csv做对比验证再加一个pip install pandasPython版本用3.8以上都行实测3.8到3.12都没问题。解析器建议指定html.parser因为BeautifulSoup自带的这个解析器不需要额外编译兼容性最好。也可以用lxml解析速度更快但需要单独安装对新手反而多一层门槛。提示如果安装很慢可以换国内镜像源比如清华源或阿里源命令形如pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple。这是我实测最省事的方案。2.2 headers设置与robots边界豆瓣对爬虫并不算特别友好但也没有凶到完全不让访问。第一次发请求如果没有带User-Agent服务器大概率直接返回403页面根本拿不到。我习惯把这些请求头放在一个字典里统一管理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, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, }User-Agent别直接抄一个很老旧的版本尽量用当前主流浏览器的UA这会明显降低被拒概率。Accept-Language设置成zh-CN还能保证返回页面里的评分数字、中文标签解析正常虽然影响不大但能让解析更稳定。还有一个容易被忽略的点robots.txt。爬虫新手往往不知道要看这个文件。豆瓣的robots.txt里对部分路径有限制公开榜单页面理论上是可以访问的但任何爬虫都应该遵守基本的网络礼仪——低频、慢速、不影响服务器正常运行。说白了抓25条数据休息两三秒和抓250条数据一口气冲过去给服务器的压力完全不同后者也更容易触发反爬。2.3 翻页请求与首次验证写一个函数负责请求单页注释写清楚每个参数的用意import requests import time 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, Accept-Language: zh-CN,zh;q0.9,en;q0.8, } BASE_URL https://movie.douban.com/top250 def fetch_page(start): 请求Top250页面的某一页start为偏移量0, 25, 50, 75 url f{BASE_URL}?start{start}filter resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() resp.encoding utf-8 return resp.text if __name__ __main__: html fetch_page(0) print(len(html), html[:200])resp.encoding utf-8这一行值得注意。豆瓣返回的响应头里有charset声明requests通常能自动识别但偶尔会因为重定向或压缩导致误判。手动指定是最稳妥的既保证了解析时中文不乱码也为后面写入文件铺平了路。跑一次如果能看到一大段HTML输出说明请求已经通了。此时别急着往下写代码先在浏览器里打开同一页面按F12看下结构对下一步解析会非常有帮助。3. 页面解析从HTML到结构化记录3.1 单个电影节点的结构拆解拿到HTML后接下来要回答的问题是一部电影的数据在页面里长什么样打开开发者工具定位到榜单列表会发现每部电影都包裹在div classitem这个节点里。以排名第一的电影为例结构大致如下div classitem em class1/em span classtitle肖申克的救赎/span span classtitle/The Shawshank Redemption/span span classothernbsp;/nbsp;...nbsp;/nbsp;.../span div classbd div classstar span classrating5-t/span span classrating_num9.7/span span1426286人评价/span /div p classquote span classinq希望让人自由。/span /p /div /div这里有几个容易踩坑的细节排名在em标签里直接.text就能拿到。中文片名在第一个span.title里注意同名的class出现两次只能用.select_one(span.title)取第一个。外文片名在第二个span.title里但有些电影没有外文名取不到时要处理None。评分在span.rating_num里。评价人数在div.star下面的最后一个span里文本是1426286人评价这种格式需要提取数字部分。一句短评在span.inq里但很多电影没有短评缺省时必须做兼容。3.2 解析函数实现用BeautifulSoup写解析逻辑我这里给出一个稳妥的写法from bs4 import BeautifulSoup def parse_page(html): 解析Top250页面的HTML提取电影排名、片名、评分、评价人数 soup BeautifulSoup(html, html.parser) items soup.select(div.item) records [] for item in items: rank item.select_one(em).text.strip() title item.select_one(span.title).text.strip() rating item.select_one(span.rating_num).text.strip() # 评价人数形如 1426286人评价需要去掉括号和单位 star item.select_one(div.star) comment_span star.find_all(span)[-1] comment_text comment_span.text.strip().replace(人评价, ) records.append({ rank: int(rank), title: title, rating: float(rating), comments: int(comment_text), }) return recordscomment_text的处理我用的是replace(人评价, )。在初次跑通阶段这个方案最直接只要页面格式不变化就不会出问题。如果想写得更健壮可以用正则re.search(r\d, comment_span.text)只提取数字这样即使以后页面文字从人评价变成人看过也能兼容。至于短评字段我故意没放进核心字段因为Top100里大概有十几部电影没有短评。如果一开始就把它加进去解析逻辑里要多写一个if inq else 的分支会分散注意力。扩展阶段再加也不迟。3.3 翻页循环与数据汇总前4页每页25条正好是100条。循环请求时别忘了控制节奏def crawl_top100(): all_records [] for start in range(0, 100, 25): try: html fetch_page(start) records parse_page(html) all_records.extend(records) print(f已抓取 offset{start}, 本页 {len(records)} 条, 累计 {len(all_records)} 条) except Exception as e: print(foffset{start} 请求失败: {e}) finally: time.sleep(2) # 低频请求既减少服务器压力也降低被识别的概率 return all_records[:100]time.sleep(2)是这段代码里最不起眼但最关键的一行。很多爬虫脚本被服务器限制并不是因为代码写得差而是因为完全没有间隔。25条数据每页休息2秒总共才等8秒体验完全不受影响但服务器压力小得多。做人留一线爬虫也能跑得久。如果你发现某页偶尔请求超时最简单的处理方式是加一个重试机制同页请求失败后等3秒再试一次最多试3次。这在后面的完整代码里我会一并给出。4. 写入CSV两种写法和格式陷阱4.1 用csv模块写入的完整逻辑Python标准库里的csv模块就能轻松完成任务不需要额外引入pandas。它的核心优势是自动处理字段里的逗号、引号、换行避免生成破损的表格。import csv def save_to_csv(records, filenametop100.csv): with open(filename, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([排名, 电影名称, 评分, 评价人数]) for r in records: writer.writerow([r[rank], r[title], r[rating], r[comments]])编码用了utf-8-sig这就是解决Excel乱码的关键后面专门讲。newline则是一个必写参数如果不写在Windows下打开生成的CSV文件行与行之间会多出空行非常难看。这里我解释一下utf-8-sig到底是什么。普通的UTF-8编码文件在最开头会有一个三字节的字节顺序标记EF BB BF也就是所谓的BOM。utf-8-sig这个编码名在Python里就是“带BOM的UTF-8”。Excel在Windows上默认用系统本地编码去猜文件当它看到这个文件头时就会知道“这是UTF-8编码的我要按UTF-8来解析”于是中文就不会乱码。这也是为什么很多教程直接说“加个BOM就好了”因为他们用utf-8-sig写本质就是在文件开头预置了BOM。4.2 用pandas写入的对比方案如果你本来就装了pandas写入可以更短import pandas as pd df pd.DataFrame(records) df.to_csv(top100_pandas.csv, indexFalse, encodingutf-8-sig)indexFalse的作用是不把行号写进文件。如果不写第一列会多出一列0到99的索引虽然不是大问题但很业余。两种方案对比下来我推荐新手用标准库csv模块因为不用多装一个几百兆的依赖出错时也更容易定位。pandas方案更适合你已经熟悉DataFrame、后面还想做数据分析的场景。两种方案的乱码解决逻辑一模一样都是utf-8-sig。4.3 CSV格式化背后的三个隐藏坑先说说我在这个项目里踩过的坑第一字段里包含逗号。比如片名是“你这个逗号让人很难办”这种不处理就会把CSV的列拆碎。csv.writer会正确处理自动在字段外层加引号。如果你自己用f.write()拼字符串就一定会踩到。第二评价人数提取后是字符串最好转成int排名转成int评分转成float。这样落到文件里数字才会规整后续排序、可视化也顺手。别小看这个步骤很多新手抓完数据才发现评分是字符串想做个排序都排不对。第三列表页偶尔会出现数据缺失比如某部电影没有短评、评价人数显示异常。我的建议是核心字段严格要求出现异常直接跳过该条并打印一条日志。扩展字段则用默认值填充保证文件记录数不减少。5. 乱码成因与三个解决方案5.1 为什么Excel打开会乱码先做一个实验用普通的utf-8编码写入文件with open(top100_utf8.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([排名, 电影名称, 评分, 评价人数])然后用Excel双击打开这个文件大概率看到的是一行行“çæé é³”之类的乱码或者所有中文都挤成一坨。用记事本打开却完全正常。原因在于记事本会尝试识别编码包括无BOM的UTF-8而Excel在Windows中文系统上的默认行为是读取本地ANSI编码也就是GBK/GB2312。当一个UTF-8编码但没有任何标记的中文文件被当成GBK读时多字节字符就会被拆错、错位最终显示成乱码。这就是为什么单纯换用utf-8姿势不对必须加BOM。BOM就像是一个写在文件第一行的“我是UTF-8编码”的声明牌Excel看到这个声明后就不会再用GBK去猜了。5.2 方案一写入阶段用utf-8-sig推荐最根本、最省事的办法就是在写入时就带上BOM。所有代码已经在上文给出了核心就一行encodingutf-8-sig不管用csv模块还是pandas都是这个参数。建议你从一开始就写成utf-8-sig而不是先写普通UTF-8再补救。这个习惯不需要额外付出什么却能让你生成的文件在任何主流工具里都能直接打开。数据文件本身就应该做到“谁拿到手都能用”而不是只在自己的电脑上正常。5.3 方案二已有乱码文件的应急处理文件已经生成了而且是用普通UTF-8写的不想重新抓取怎么办也有办法。用记事本打开乱码的CSV文件如果显示正常直接选择“文件 - 另存为”在右下角编码下拉框里选“带有BOM的UTF-8”保存Excel再打开就正常了。这个方法能用但有一个前提文件里的中文没有被破坏。如果文件本身已经是乱码用记事本打开同样乱码那说明编码信息已经丢失最好的办法是重写文件。另外也可以用Python一行命令给已有文件“补”上BOMwith open(top100_utf8.csv, rb) as f: content f.read() with open(top100_utf8_bom.csv, wb) as f: f.write(b\xef\xbb\xbf content)这个方法是纯字节操作读取文件原始字节流在开头插入BOM的三字节再另存为。不会改动原有内容只是给文件加上声明。5.4 方案三用Excel的导入向导解读UTF-8我见过不少同事电脑上做大表格用的还是老版本WPS或者旧版Excel即使加了BOM打开依然是乱码。这种情况下可以用导入功能做一次“曲线救国”。在Excel中选择“数据 - 从文本/CSV”在选择文件时会弹出一个预览窗口里面可以手动选择文件编码。把它选为“UTF-8”或“65001: UnicodeUTF-8”预览正常后点加载乱码就消失了。这个方案适合处理那些别人发给你的、已经无法修改源头编码的CSV。它不需要编程也不需要改文件是纯手动操作但对每个要打开的文件都得来一遍不省事。所以这个方案是应急用的不是首选。提示加BOM的UTF-8文件在绝大多数场景下都能被正确识别但如果你的文件将来要交给Linux或者服务器上的程序处理BOM有时反而会造成干扰因为这些程序按无BOM的UTF-8解析会出现第一个字段多出一个看不见的字符。处理方式是让对方读取时指定utf-8-sig或者在解析阶段剥掉BOM。简单说给Excel用户发文件用utf-8-sig给程序接口发文件用普通utf-8两种场景分开对待。5.5 编码问题的最终验证写完文件后别急着关闭程序做一个简单验证with open(top100.csv, rb) as f: raw f.read() print(raw[:10])如果输出是b\xef\xbb\xbf...说明BOM已经写进去了这个文件发给谁打开都不会乱码。如果开头直接是b\xe6...说明没有BOMExcel在中文系统上仍然可能产生乱码。再进一步用pandas读回来检查数据完整性import pandas as pd df pd.read_csv(top100.csv, encodingutf-8-sig) print(df.shape) print(df.head())能看到100行4列且中文显示正常整个数据链路就通了。这个验证步骤非常重要它保证的不只是“写成功了”而是“写出来能被正确读回去”。6. 完整代码整合与进阶建议6.1 集成后的完整脚本把前面所有模块拼到一起得到一个可以直接运行的完整脚本。为了方便阅读我加上了必要的注释和控制台日志。import time import csv import requests from bs4 import BeautifulSoup 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, Accept-Language: zh-CN,zh;q0.9,en;q0.8, } BASE_URL https://movie.douban.com/top250 def fetch_page(start, retries3): 请求单页失败自动重试 for attempt in range(1, retries 1): try: url f{BASE_URL}?start{start}filter resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() resp.encoding utf-8 return resp.text except Exception as e: print(foffset{start} 第 {attempt} 次请求失败{e}) if attempt retries: time.sleep(3) return None def parse_page(html): 解析单页电影数据 soup BeautifulSoup(html, html.parser) records [] for item in soup.select(div.item): try: rank int(item.select_one(em).text.strip()) title item.select_one(span.title).text.strip() rating float(item.select_one(span.rating_num).text.strip()) star_div item.select_one(div.star) comment_span star_div.find_all(span)[-1] comment_count int(comment_span.text.strip().replace(人评价, )) records.append({ rank: rank, title: title, rating: rating, comments: comment_count, }) except AttributeError: print(发现一条数据字段缺失已跳过) continue return records def save_to_csv(records, filenametop100.csv): 写入CSV使用utf-8-sig编码避免Excel打开乱码 with open(filename, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([排名, 电影名称, 评分, 评价人数]) for r in records: writer.writerow([r[rank], r[title], r[rating], r[comments]]) print(f数据已保存到 {filename}) def main(): all_records [] for start in range(0, 100, 25): html fetch_page(start) if html is None: print(foffset{start} 请求最终失败跳过本页) continue records parse_page(html) all_records.extend(records) print(f已抓取 offset{start}, 累计 {len(all_records)} 条) time.sleep(2) top100 all_records[:100] save_to_csv(top100) print(f总计写入 {len(top100)} 条记录) if __name__ __main__: main()这段代码整体跑下来在正常网络环境下大约需要20秒。日志会清楚地告诉你每一页抓了几条数据哪一页失败最终写入多少条记录。整个过程的容错处理不算复杂但对这个规模的项目来说已经是足够的工程化水平了。6.2 进阶把脚本往工程化方向改造初级脚本能跑通是一回事能不能长期稳定运行是另一回事。如果你打算每周跑一次这个脚本建议在三个方向上做增强。第一日志系统。把print换成logging模块记录到文件里。以后哪天脚本半夜跑挂了你才知道它是什么时候出的问题。第二数据库持久化。CSV适合交付给人类阅读但如果你想把数据积累下来看趋势最好入库。轻量级的可以用SQLite重一点的可以用MySQL或PostgreSQL同一条记录按日期打时间戳能分析出榜单波动。第三请求策略精细化。现在固定sleep 2秒是保守稳妥的做法。更精细的方案是用随机间隔比如在1到3秒之间抖动这样请求模式更接近真人操作也不太会给服务器造成规律性压力。但要注意随机间隔不等于可以加快速度礼貌永远是底线。6.3 后续扩展方向这个项目的天花板不低至少有三个方向值得继续做字段扩展把导演、演员、年份、地区、类型、剧情简介都抓下来完整的电影信息库就出来了。榜单联动同时抓上映时间、热度、评价人数做一个多维度榜单分析能看出哪些老片长盛不衰哪些新片昙花一现。可视化展示对抓下来的评分和评论数做分布统计画直方图或散点图看Top100里的评分分布是否符合预期。我自己在做完这个项目之后最深的体会是爬虫项目的难点往往不是“爬”而是数据落地那一公里。页面分析一小时代码写一小时剩下的时间几乎都耗在编码、格式、兼容性这些看似不起眼的小问题上。把这些问题一次性想清楚后面再遇到类似的数据采集需求你就能直接把整套流程复用过去。最后再说一个小技巧保存CSV之前先输出一行完整的中文记录到控制台确认解析没有出现“口口”或“问号”再落盘。这个动作看似多余却能帮你把“解析乱码”和“文件乱码”两类问题隔离开排查时至少能排除一半的可能性。

相关新闻

fpinscala 状态章节练习 06 详解:实现 Rand.map2 与 RNG 状态传递顺序的决策

fpinscala 状态章节练习 06 详解:实现 Rand.map2 与 RNG 状态传递顺序的决策

示例工程 【免费下载链接】fpinscala Code, exercises, answers, and hints to go along with the book "Functional Programming in Scala" 项目地址: https://gitcode.com/gh_mirrors/fp/fpinscala 点击查看 免费下载 本文以 fpinscala 仓库第 6 章&am…

2026/10/12 17:34:59 阅读更多 →
AnyPS5:打破PS5封闭生态的通用化扩展与串流优化实战

AnyPS5:打破PS5封闭生态的通用化扩展与串流优化实战

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"通用化"和"PS5"这两个关键词做文章的项目。PS5本身是一台游戏主机&…

2026/10/12 17:34:59 阅读更多 →
详解 np.random.normal:从参数、原理到工程实践的正态随机数生成指南

详解 np.random.normal:从参数、原理到工程实践的正态随机数生成指南

说起用Python生成服从正态分布的随机数,我估计不少人的第一反应就是那一行np.random.normal()。这行代码短是真短:给个均值loc、给个标准差scale、再给个数量size,一串符合正态分布的数据就出来了。但真正在项目里把这一行用好,远…

2026/10/12 17:34:58 阅读更多 →

最新新闻

OpenCV车道线检测实战:霍夫变换参数调优与避坑指南

OpenCV车道线检测实战:霍夫变换参数调优与避坑指南

简介:这份资源面向计算机视觉初学者与自动驾驶入门开发者,围绕OpenCV车道实时检测这一典型任务,提供可直接运行的示例代码与配套讲解。内容覆盖视频逐帧读取、多边形掩码构建、图像阈值化、霍夫线变换检测车道以及结果视频合成等完整流程&…

2026/10/12 19:25:05 阅读更多 →
DeepSeek本地部署保姆级教程:Ollama、可视化WebUI与RAG知识库投喂实战

DeepSeek本地部署保姆级教程:Ollama、可视化WebUI与RAG知识库投喂实战

简介:针对DeepSeek官方服务频繁响应迟缓、宕机的问题,这份面向零基础用户的保姆级教程,完整演示了如何在个人电脑上本地部署DeepSeek,并配套可视化界面与数据投喂训练。教程从安装Ollama讲起,覆盖根据显存容量挑选合适…

2026/10/12 19:25:05 阅读更多 →
大模型私有化部署生产环境实战:显存计算、推理框架选型与性能优化

大模型私有化部署生产环境实战:显存计算、推理框架选型与性能优化

1. 大模型私有化部署到底在解决什么问题第一次听到“把大模型私有化部署到生产环境”这个需求,很多人的第一反应是:直接调云端API不香吗?按token付费,不用管显卡,不用操心运维,何必自己折腾?我一…

2026/10/12 19:25:05 阅读更多 →
C++单元测试从零到实战:框架选型、构建集成与踩坑指南

C++单元测试从零到实战:框架选型、构建集成与踩坑指南

我翻了翻过去几个项目的提交记录,有个数据挺有意思:接入单元测试之前,每次大版本迭代,光回归测试就得占掉两三天,而且经常是改完一个模块,另一个模块莫名其妙就出问题,查半天发现是内部接口被悄…

2026/10/12 19:25:05 阅读更多 →
aider 接入 OpenRouter 调用 Claude 大模型:TaoToken 统一 Key 配置与连通性验证

aider 接入 OpenRouter 调用 Claude 大模型:TaoToken 统一 Key 配置与连通性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:25:04 阅读更多 →
Python接口逆向实战:网页翻译请求签名分析与批量调用实现

Python接口逆向实战:网页翻译请求签名分析与批量调用实现

1. 项目缘起与整体设计思路做数据采集这行的朋友大概都有体会,翻译类接口的逆向分析算是入门级里比较典型的一类练手项目。我最早接触这类需求是在做一个多语言内容聚合的小工具,需要批量把一批短文本从中文转成英文,再转成日文做对照。当时第…

2026/10/12 19:24:03 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →