标签)和价格(位于标签),并将结果以字典列表的形式返回。”
发送后,仔细检查AI返回的代码是否包含了必要的库导入、请求头设置、响应状态码检查、使用soup.find_all()定位元素以及具体的文本提取逻辑。如果这些关键部分都完整,那么第一步就成功了。
二、本地运行与分段验证:避免直接运行全脚本的风险
拿到生成的Python爬虫代码后,不要立即运行整个脚本。更稳妥的做法是在本地开发环境(如VS Code或PyCharm)中,像进行单元测试一样,分段验证每个核心环节是否按预期工作。
首先,安装必要依赖:pip install requests beautifulsoup4。然后,在requests.get()语句后添加print(response.status_code, response.encoding),确认状态码为200且编码正确。接着,在解析出soup对象后,打印soup.find('article', class_='product_pod'),检查是否能成功定位到第一个商品容器。最后,单独测试字段提取逻辑:print([t.get_text().strip() for t in soup.select('article.product_pod h3 a')]),观察输出是否为非空的标题列表。每一步验证通过后,再尝试运行完整脚本。
三、针对常见爬虫失败场景:提供精准的优化指令
如果基础代码运行失败,不要笼统地要求AI“修复代码”。你需要像诊断问题一样,锁定具体错误类型,然后给出针对性的优化指令。
例如,若报错为requests.exceptions.ConnectionError,可追加指令:“当前爬虫连接被网站拒绝,请在请求中添加随机的User-Agent和Referer请求头,并设置超时参数timeout=10。” 如果soup.find_all()返回空列表,可能是CSS选择器有误,可以这样提示AI:“实际页面HTML结构中,书籍信息包裹在
标签内,请将原选择器'article.product_pod'替换为'div.col-xs-6',并相应调整内部标题和价格的提取路径。” 若价格文本混杂了货币符号,则需要数据清洗:“请使用正则表达式re.search(r'\d+\.\d+', text)从price_color文本中提取数字,并转换为float类型。”
四、注入稳定性增强机制:从“能跑”到“抗压”
一个基础的爬虫脚本非常脆弱,网络波动、页面加载延迟或服务器反爬策略都可能导致中断。要将其提升至“生产级”可靠性,你需要引导AI为代码逐步加入重试、等待和异常处理机制。
首先,可以在导入库部分后,要求添加请求重试逻辑:“请使用tenacity库为requests.get调用添加重试装饰器,设置stop_after_attempt(3)(最多重试3次)和wait_fixed(2)(每次等待2秒)。” 其次,应对动态加载内容,可在解析前加入等待:“如果response.text的长度小于1000字符,则暂停1.5秒后重新请求,最多重试2次。” 最后,为数据提取环节添加容错:“请使用soup.select_one()方法,并在每个字段提取操作外包裹try-except块,当字段缺失时返回None,而不是抛出AttributeError导致程序崩溃。”
五、结构化输出与持久化存储:确保数据立即可用
爬取的数据若仅打印在控制台,实用价值有限。你需要主动引导AI,生成能将数据保存为CSV、JSON等通用格式的代码模块,方便后续分析与使用,避免手动处理。
你可以在代码末尾追加这样的指令:“请添加一个函数sa ve_to_csv(data_list, filename='books.csv'),将字典列表写入CSV文件,字段名为title和price,并使用utf-8-sig编码以防止中文乱码。” 如果需要JSON格式,可以换一种问法:“请将保存函数改为sa ve_to_json,使用json.dump(..., ensure_ascii=False)来保持中文字符的可读性。” 此外,一个良好的实践是在保存前进行数据清洗:“在保存到文件前,请过滤掉title或price为None的条目,确保输出的每行数据都包含完整字段。” 经过这些步骤,你最终得到的将是一个完整、鲁棒的数据采集解决方案,而非一个简单的脚本。
pip install requests beautifulsoup4。然后,在requests.get()语句后添加print(response.status_code, response.encoding),确认状态码为200且编码正确。接着,在解析出soup对象后,打印soup.find('article', class_='product_pod'),检查是否能成功定位到第一个商品容器。最后,单独测试字段提取逻辑:print([t.get_text().strip() for t in soup.select('article.product_pod h3 a')]),观察输出是否为非空的标题列表。每一步验证通过后,再尝试运行完整脚本。requests.exceptions.ConnectionError,可追加指令:“当前爬虫连接被网站拒绝,请在请求中添加随机的User-Agent和Referer请求头,并设置超时参数timeout=10。” 如果soup.find_all()返回空列表,可能是CSS选择器有误,可以这样提示AI:“实际页面HTML结构中,书籍信息包裹在re.search(r'\d+\.\d+', text)从price_color文本中提取数字,并转换为float类型。”stop_after_attempt(3)(最多重试3次)和wait_fixed(2)(每次等待2秒)。” 其次,应对动态加载内容,可在解析前加入等待:“如果response.text的长度小于1000字符,则暂停1.5秒后重新请求,最多重试2次。” 最后,为数据提取环节添加容错:“请使用soup.select_one()方法,并在每个字段提取操作外包裹try-except块,当字段缺失时返回None,而不是抛出AttributeError导致程序崩溃。”sa ve_to_csv(data_list, filename='books.csv'),将字典列表写入CSV文件,字段名为title和price,并使用utf-8-sig编码以防止中文乱码。” 如果需要JSON格式,可以换一种问法:“请将保存函数改为sa ve_to_json,使用json.dump(..., ensure_ascii=False)来保持中文字符的可读性。” 此外,一个良好的实践是在保存前进行数据清洗:“在保存到文件前,请过滤掉title或price为None的条目,确保输出的每行数据都包含完整字段。” 经过这些步骤,你最终得到的将是一个完整、鲁棒的数据采集解决方案,而非一个简单的脚本。

