playwright 免API实现kimi聊天机器人
模拟是一个强大功能,在爬虫应用中,基本可以实现不仅爬数据,还能爬功能。
以下是通过playwright模拟kimi回答。这就是窃取神通!!!爬功能!!!
就是牺牲了部分速度。。哎。。。
from playwright.sync_api import sync_playwright
import timewith sync_playwright() as p:bro = p.chromium.launch(headless=True, slow_mo=2000)page = bro.new_page()page.goto('https://kimi.moonshot.cn/')# 定位到输入框,进行文本录入page.locator('.chat-input-editor').fill('用c语言写一个快排') # id定位# 定位搜索按钮,进行点击操作page.locator('.send-icon.iconify').click()# 用于存储已经输出过的段落文本output_history = set()output_history1 = set()while True:paragraphs = page.eval_on_selector_all('.paragraph','elements => elements.map(element => element.textContent.trim()).filter(text => text.length > 0)')paragraphs1 = page.eval_on_selector_all('.segment-code','elements => elements.map(element => element.textContent.trim()).filter(text => text.length > 0)')# 将获取到的段落文本转换为集合,方便比较current_paragraphs = set(paragraphs)current_paragraphs1 = set(paragraphs1)# 找出新的段落文本(不在历史记录中的)new_paragraphs = current_paragraphs - output_historynew_paragraphs1 = current_paragraphs1 - output_history1# 如果有新的段落文本,就输出它们if new_paragraphs:#给出说明print(', '.join(new_paragraphs), end='')# 更新历史记录output_history.update(new_paragraphs)if new_paragraphs1:#这是给出代码print(', '.join(new_paragraphs1), end='')# 更新历史记录output_history1.update(new_paragraphs1)if not new_paragraphs and not new_paragraphs1 :breaktime.sleep(5) # 等待5秒后再次获取print(end ="\n")print('结束')page.close()
效果如下:
简单总结一下
page.eval_on_selector_all
这是 Playwright 提供的一个方法,用于在页面上查找所有匹配指定选择器的元素,并对这些元素执行一段 JavaScript 代码。
第一个参数是一个 CSS 选择器(这里是 '.paragraph'
),它用来定位页面上所有带有 paragraph
类的 HTML 元素。第二个参数是一段 JavaScript 表达式,这段代码会在浏览器环境中运行。
elements => elements.map(element => element.textContent.trim()).filter(text => text.length > 0)
这段 JavaScript 代码对找到的所有元素进行处理,提取它们的文本内容,并去除空文本。1。1.elements.map(element => element.textContent.trim())
:
2.trim()
去除文本内容两端的空白字符(比如空格、换行符等)。
3.element.textContent
获取元素的文本内容。map
方法遍历每个元素,对每个元素执行 element.textContent.trim()
操作。
4.elements
是一个包含所有匹配元素的数组。.filter(text => text.length > 0)
:text.length > 0
确保只保留有实际内容的文本。filter
方法过滤掉空文本内容。
最终,这段代码会返回一个数组,数组中的每个元素都是页面上带有 paragraph
类的元素的非空文本内容。