拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Trae爬虫总是跑不通?用提示词工程把模糊需求变成可执行代码

前几天有个朋友发了段代码给我说Trae生成的爬虫脚本一直报错让我帮忙看看。我扫了一眼发现问题根本不在模型能力上而是他提问的那句提示词太随意了——就一句“用Python写个爬虫”目标网页结构、字段需求、存储格式全都没说模型只能靠猜来生成代码猜不准才是正常的。这篇是这个系列的第五篇前面几篇聊过Trae的基础用法和通用提示词框架这次专门聚焦爬虫场景把一套能稳定产出可运行爬虫代码的提示词优化方法拆开讲透。适合刚接触AI编程、想用Trae抓点公开数据练手、又总是被生成代码气到的朋友。核心就一句话提示词不是命令是给模型的信息清单。1. 为什么一句“写个爬虫”得到的代码总跑不起来1.1 模型不是在“编程”而是在“填补信息缺口”先说一个很多人容易误解的点Trae这类AI编程工具里的语言模型并不是像人一样“理解”了你的需求然后胸有成竹地写代码它本质上是在根据你给的所有上下文预测一段最可能被需要的文本序列。你把上下文压缩成“写个爬虫”四个字它就只能在训练数据里找最普遍的爬虫写法来凑数——requests.get然后print(resp.text)完事。它不是在给你写代码它是在给你猜代码。这个机制的必然结果是你提供的信息越少模型就越依赖“一般情况”。但爬虫恰恰是最不“一般”的编程场景之一每个网站的前端结构、数据渲染方式、反爬策略都不一样。用“写个爬虫”这种需求去启动生成等于让一个没见过现场的师傅去工地装插座他只能按规范套路来遇到实际墙体、线路、开关型号照样傻眼。1.2 爬虫代码里到底藏着哪些变量我自己列过一份清单随便数一下就知道为什么一句话不够用目标网址的完整URL以及分页参数是什么格式?page2 还是 /page/2/数据在HTML里的具体位置用CSS选择器还是XPath能找到页面是静态渲染还是JS动态加载数据在源码里根本找不到页面编码是UTF-8还是GBK写错了解析出来全是乱码服务器是否校验UA、Referer、Cookie不带对应请求头就返回403请求频率要不要控制会不会触发限流或者封IP数据保存成什么格式CSV、JSON还是塞进数据库本地Python版本和依赖库装没装齐这每一项都是变量不是常量。模型不在现场它并不知道你的目标网站是哪一个、长什么样、有什么脾气。所以提示词优化的本质是把这些变量的决定权从模型手里夺回来交给你和你的浏览器开发者工具。1.3 为什么同样的提示词在Trae里效果差这么多我自己用Trae写了几个月的爬虫脚本最深的感受是Trae的对话模式会放大提示词质量的差异。因为它在Builder模式下会自动创建文件、装依赖、执行命令一套流程跑下来如果提示词给得不到位它会连着出错、改错、越改越偏最后生成的代码可能比不用AI还难维护。反而字数多一点、结构清楚一点的提示词能让整个对话流畅得像在跟一个靠谱的同事配合。另外有个实操细节很多人报错之后喜欢自己总结一句“有错帮我修一下”这等于又把信息缺口堵上了。正确做法是把终端的报错信息原样复制粘贴进对话再附上你的修改方向。这种“反馈型提示词”本身就是提示词工程的一部分后面第4部分会专门演示。2. 动手问Trae之前先在浏览器里做两分钟侦察2.1 怎么判断目标页是静态HTML还是接口返回很多人在这一步就直接卡住了但其实非常简单跟着做一遍就会。打开目标网址按F12调出开发者工具切到Elements面板按CtrlF搜索页面某个可见文字比如一条名言的原文。如果在Elements里能搜到这个文字说明数据在HTML源码里直接存在用requests加BeautifulSoup就能解析如果搜不到说明数据是由JavaScript异步请求接口后渲染的你直接requests这个URL是拿不到内容的。拿不到内容怎么办切到Network面板刷新页面筛选XHR或Fetch请求找到那个返回JSON数据的接口。这个接口信息极其宝贵后面第5部分会展开讲。现在这一步的产出只有一个你明确了数据是静态HTML还是接口返回。这个结论直接决定了Trae该生成requests加BeautifulSoup的脚本还是该生成直接请求接口解析JSON的脚本。2.2 记下这三个信息再开始问进入对话之前我建议你在一个临时记事本里写下三样东西哪怕只是随手记几个关键词第一列表页的URL规律。比如目标站是 https://quotes.toscrape.com/翻页之后变成 https://quotes.toscrape.com/page/2/那你就知道分页是路径参数不是查询参数。第二数据的HTML容器。在Elements里右键检查一条数据找到包裹它的标签和class。比如名言正文在 span.text 里作者在 small.author 里标签那一栏可能在 div.tags 的 a.tag 里。这些就是之后让Trae写CSS选择器用的原材料。第三请求头的关键信息。在Network面板里点击页面文档请求看一下Request Headers里的User-Agent。很多同学写爬虫不写UA被服务器拒绝后一脸懵。提前记下来写进提示词里能省掉一轮报错。这三条信息不用整理得多漂亮能看懂就行。它们是给模型减少猜测空间的弹药。2.3 别让环境问题浪费你的第一轮对话还有一部分返工不是代码逻辑的问题而是运行环境没准备好。我在Trae里跑Python脚本之前习惯性先建一个虚拟环境并在终端里启动它python -m venv .venv .venv\Scripts\activate # Windows source .venv/bin/activate # macOS / Linux pip install requests beautifulsoup4为什么不直接装在全局环境里因为爬虫项目经常是一两个脚本不值得污染全局Python而且Trae能识别当前激活的虚拟环境你后面让它“运行脚本”时它会自动在这个环境里执行依赖才不会报ModuleNotFoundError。把环境信息作为提示词的一部分直接告诉Trae比如“我的Python 3.11环境在Windows终端跑requests和bs4已安装”它就不会给你生成需要额外安装其他库的方案。3. 把一句“写个爬虫”改成一条能落地的提示词3.1 先看一个反面案例直接下一句特别简单的提示词给Trae试试“用Python写一个爬虫爬取quotes.toscrape.com第一页的名言。”你会发现它确实能给出代码而且结构还挺完整但大概率会出现这么几个毛病没带User-Agent请求头就是一个裸requests.get没有main入口的概念代码散在顶层CSV写入用的默认编码中文在Excel里整个乱掉异常处理几乎没有服务器一旦返回403脚本直接崩。为什么会这样因为信息太少模型只能调用它对“常见爬虫”的平均印象而这个平均印象刚好就是新手教程里最偷懒的写法。这不是模型蠢是你把决策权让渡给它了。你得把目标网站的关键特征、输出字段、运行方式都写清楚它才能按你的规矩办事。3.2 一套可以复用的爬虫提示词模板下面这个模板是我实际项目里用了很久的基础版每次换目标网站基本只改加粗那几处你是一位有五年经验的Python爬虫工程师。请帮我写一个Python脚本满足以下要求 1. 目标网址https://quotes.toscrape.com/ 2. 我们需要抓取第一页的所有名言数据并保存到 quotes.csv。 3. 每条名言需要输出以下字段 - text名言正文 - author作者 - tags标签列表多个标签用 | 分隔 4. 我已经检查过页面数据在HTML源码中直接存在不需要处理JS渲染。 每一个名言区块中正文出现在 span.text 里作者在 small.author 里 标签在 div.tags 下的 a.tag 里。 5. 运行环境本机Python 3.11已安装 requests 和 beautifulsoup4项目在 Windows 终端运行。 6. 技术要求 - 使用 requests BeautifulSoup 实现 - 请求时带上 User-Agent避免被服务器拒绝 - 输出CSV时使用 utf-8-sig 编码确保Excel打开不会乱码 - 必须有 main() 函数入口并通过 if __name__ __main__ 调用 - 当 status_code 不是200时打印错误并退出 7. 请先简要说明你的实现思路然后给出完整代码并在代码中加中文注释。这段提示词看起来啰嗦但它把一个模糊需求变成了一份完整、可执行的需求说明书。模型生成时会严格按照这些约束来组织代码第一版能跑通的概率大幅提升。3.3 模板里的每个字段都在帮你省一次返工可能有人觉得这里面的内容写不写差别也不大吧我直接拿实际返工次数说话容易出问题的点模板里的对应措施省下的返工内容服务器403要求带上User-Agent不用额外处理请求头CSV中文乱码指定utf-8-sig编码不用二次转码脚本无法调试要求main入口和异常处理不用重构代码结构选择器抓错字段主动提供标签位置信息不用反复贴HTML比对每一个字段背后都是一个真实的踩坑点。目标网址给完整模型可以基于训练数据里的结构知识做预判页面结构给清楚模型写选择器时不会瞎猜运行环境给明白模型不会让你装没必要的库。写提示词这件事本质就是把你已经从浏览器侦察里得到的信息一字不漏地转交给模型。4. 实操演示一次对话让Trae跑通列表页爬虫4.1 第一轮把模板发给Trae以quotes.toscrape.com为例我把上面那段模板原样发进Trae它在Builder模式下给出的代码大致长这样import requests from bs4 import BeautifulSoup import csv def fetch_page(url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp requests.get(url, headersheaders, timeout10) if resp.status_code ! 200: print(f请求失败状态码{resp.status_code}) return None resp.encoding utf-8 return resp.text def parse_quotes(html): soup BeautifulSoup(html, html.parser) quotes [] for item in soup.select(div.quote): text item.select_one(span.text).get_text(stripTrue) author item.select_one(small.author).get_text(stripTrue) tags |.join(tag.get_text(stripTrue) for tag in item.select(a.tag)) quotes.append([text, author, tags]) return quotes def save_to_csv(quotes): with open(quotes.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([text, author, tags]) writer.writerows(quotes) def main(): url https://quotes.toscrape.com/ html fetch_page(url) if not html: return quotes parse_quotes(html) save_to_csv(quotes) print(f成功保存 {len(quotes)} 条名言) if __name__ __main__: main()第一版能到这个程度我已经很满意了。注意它会自动带上UA、处理编码、给main入口这些都是提示词里明确约束过的。现在直接在Trae的终端里跑python quotes_spider.py正常输出是“成功保存 25 条名言”同时当前目录下生成quotes.csv。到这里最核心的流程已经走通了。4.2 第二、三轮用“报错信息修改要求”驱动迭代第一次跑不会一帆风顺这是常态。最常见的几种情况第一种返回403。这时候不要只说“报错了帮我看看”直接把完整报错贴给Trae再加上一句“我已经带了User-Agent但还是被拒请加一个更完整的浏览器请求头并增加失败后的重试机制每次请求前随机sleep 0.5到1.5秒”。Trae给出的修复思路一般是先构造一个更接近真实浏览器的Headers把Accept、Accept-Language、Referer等字段补齐再加一个循环重试的逻辑。它改完的代码里会出现类似这样的片段import time import random def fetch_page_with_retry(url, retries3): for attempt in range(retries): resp requests.get(url, headersheaders, timeout10) if resp.status_code 200: return resp.text print(f第 {attempt1} 次请求失败{resp.status_code}) time.sleep(random.uniform(0.5, 1.5)) return None加了随机延时之后对目标服务器的压力也小得多这个习惯建议保留。第二种CSV打开中文乱码。这个一般不是生成代码的锅而是你Excel默认编码问题。直接用上面模板里的utf-8-sig写入问题基本不会出现。如果已经生成了错误编码的文件让Trae用pandas重新读一遍再写出来也很快。第三种ModuleNotFoundError。先检查自己有没有激活虚拟环境activate之后重新跑一次。这种情况通常不是代码问题没必要让模型背锅。4.3 让爬虫支持翻页一句话就能加进去第一页跑通之后顺理成章的需求是抓多页。继续对话追加一句“请把脚本改造为支持翻页抓取前5页每页之间随机延时0.5到2秒并把所有数据保存在同一个CSV文件里。”它会很自然地把URL改成循环拼接for page in range(1, 6): url fhttps://quotes.toscrape.com/page/{page}/ html fetch_page_with_retry(url) # 解析并追加保存这里有一点值得留意追加保存时要注意CSV的模式。第一次写入要带表头后面追加不需要表头否则每个页面的数据后面都跟着一行重复表头。Trae在处理这种细节时可能不周到你可以主动在提示词里补充“只在文件不存在时写表头后续追加数据不要重复写表头”。这种预期式的约束能让迭代少很多轮。到这一步你已经拥有一个能抓5页、带重试、带随机延时、输出干净CSV的爬虫脚本。整个过程中你几乎没写几行代码但你时刻清楚自己在干什么这就是提示词优化带来的掌控感。5. 动态加载页面别急着上Selenium先让Trae请求接口5.1 先找接口直接请求JSON比坐等浏览器渲染高效得多很多网站的列表数据并不是写死在HTML里的而是页面加载时用JavaScript向后端接口要数据然后渲染成DOM。前面第2部分的侦察方法说过如果在Elements里搜不到页面文字就去Network面板找XHR。一旦找到那个接口比如常见的 https://example.com/api/list?page1size20 返回结构是JSON有data数组里面包含 title、views、created_at 这些字段你就可以直接让Trae跳过页面解析直接请求这个接口。我给Trae的提示词会这样写我抓到一个接口GET https://example.com/api/list?page1size20 返回JSON结构如下 { code: 0, data: [ {title: 标题, views: 123, created_at: 2025-01-01} ] } 请用 requests 请求这个接口解析 data 数组里的字段保存为CSV。 需要处理翻页每次请求 page 加1直到返回的 data 为空。 每页请求之间随机sleep 1到2秒。这个方式的优势非常明显接口直连返回的是结构化JSON字段名一目了然不需要解析HTML标签请求量小速度极快代码量更少出错概率更低。能走接口就不要走Selenium这是我做爬虫一贯的顺序。5.2 什么时候才需要上自动化浏览器只有下面这几种情况我才会考虑用Playwright这类自动化浏览器方案接口参数带签名需要先执行一段JS生成token页面数据要靠下拉滚动才能逐步加载接口做了严格的调用方校验直接请求拿不到数据。如果你真的需要让Trae生成Playwright脚本提示词里要特别强调两点。第一等待元素要用显式等待不要固定sleep几秒不然网络慢一点就超时网络快一点又白等。第二只做正常的数据读取不要对目标站点做恶意请求。下面是一个可以用在提示词里的描述请使用Playwright生成脚本流程 打开目标页面后等待 div.list-item 这个节点出现 然后提取每个节点的标题和链接。翻页时点击下一页按钮 每次点击后等待列表节点重新出现。最后把所有数据写入CSV。5.3 给Trae看一段真实HTML胜过你描述十句我在实战中还有一个特别管用的技巧与其费劲描述页面结构不如直接从Elements里复制一小段真实HTML贴进对话然后告诉Trae“请基于这段HTML结构写选择器”。比如div classquote span classtext“The world as we have created is a process of our thinking.”/span small classauthorAlbert Einstein/small div classtags a classtagchange/a a classtagdeep-thoughts/a /div /div配合一句“每页有多个这样的div.quote请解析每条名言的正文、作者和所有标签”。模型的CSS选择器准确率会直线上升因为它不再靠记忆猜测而是直接基于你给的样本在写。遇到结构稍微复杂的页面这招能省掉至少两轮返工。6. 把Trae生成的代码养成“能长期用”的习惯6.1 五步快速验收清单Trae生成的代码能跑不等于可以放心用。我每次拿到代码都会花两分钟过一遍这五个检查点你也完全可以照抄这个习惯依赖是否清晰最好让Trae生成一个requirements.txt记录requests、beautifulsoup4这些核心依赖下次换机器不用猜。有没有main入口散落在顶层的脚本以后没法复用有main入口才方便调试。异常处理是否足够至少要有status_code判断和网络超时处理否则一次网络抖动就全盘崩溃。请求频率是否受控抓多页时必须有随机延时这是对目标站负责也是对自己IP负责。输出文件是否规范路径和编码要明确CSV用utf-8-sigJSON用ensure_asciiFalse。这些检查点不用自己会写你可以直接追加一句话让Trae自查“请检查这个脚本是否具备以上5个条件不满足的帮我补齐。”6.2 让Trae自己给自己做Code Review有一个我特别喜欢用的技巧是把生成完的代码重新丢回对话框让它以资深工程师的身份审查它自己写的代码。提示词可以这样写请以资深爬虫工程师的身份审查上面这段代码重点检查 异常处理、请求频率、资源释放、代码可维护性。 列出你认为最值得修改的前5个问题 对每个问题给出修改后的代码片段并说明为什么这样改。实测下来这种自审模式经常能挖出一些安全隐患和坏味道比如没关闭连接池、重试逻辑不够健壮、函数过长等。你不需要全盘接受它的建议但它给出的“我建议把请求逻辑封装成一个类”这类方向往往值得参考。整个过程中你还是没写几行代码但对代码的把控感完全不一样。6.3 维护一个自己的“提示词片段库”日积月累之后你会发现爬虫提示词有很大一部分是重复的。我在本地维护了一个Markdown文件专门收藏高频片段请求头模板包含常见浏览器的完整Headers错误处理模板重试上限、随机退避、超时设置存储模板CSV追加写入、JSON按行写入、utf-8-sig编码翻页模板路径参数和查询参数两种形式的URL拼接接口解析模板应对分页JSON返回直到data为空停止写新爬虫的时候复制对应模板再改URL和字段名比每次从零敲提示词快得多。这个片段库其实就是你自己的私有提示词框架越用越顺手也越积越值钱。7. 我的几点真实体会整个流程走下来我最想强调的一句话是让AI看着目标写代码而不是凭空想代码。浏览器里的DevTools是你的信息来源报错信息是你的反馈来源提示词只是把这两者翻译给模型听的中间层。很多朋友追求“一句话生成完美脚本”这本身就不现实。人写爬虫都要反复调试凭什么AI一次就能写出无懈可击的代码放弃这个幻想踏踏实实用迭代思维去推进反而效率最高。还有一个小建议遇到拿不准的页面结构去Elements里复制真实HTML给Trae比你自己描述十句都有用。网上的那些测试模型能力的趣味提示词偶尔玩一下当放松挺好但真到爬虫这种要交付结果的场景信息密度才是提示词好坏的唯一标准。下次再打开Trae准备写爬虫前先花两分钟做侦察再花一分钟组织提示词你会明显感觉到返回结果的可用度完全不同。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门