Playwright和Selenium一样,属于动态渲染工具,所以用asyncio异步协程加快一下速度。
大致框架是这样的,能跑是能跑,然而(:3[___]=还有很多需要优化的地方,后面打算整理一下错误处理机制,引入队列,然后封装一下
import asyncio
from playwright.async_api import async_playwright # 定义一个异步函数 handle_json,用于处理 JSON 数据
async def handle_json(json_data): global tl # 引用全局变量 tl #print(json_data)if isinstance(json_data, dict): tl.append(json_data) # 如果数据是字典,将其添加到 tl 列表中 elif isinstance(json_data, list): tl.extend(json_data) # 如果数据是列表,将其所有元素添加到 tl 列表中 # 定义一个异步函数 handle,用于处理网络请求和响应
async def handle(request, response): global result_list if response is not None: # 如果响应不为空 if response.url=='https://www2.deepl.com/jsonrpc?method=LMT_handle_jobs': # F12一下,随便翻译点啥,network里找返回翻译结果json数据的urltry: # 将响应的 JSON 数据传递给 handle_json 函数处理 await handle_json(await response.json()) except: print('----------------------------') # 如果解析 JSON 出错,打印错误标记 try:#获取翻译结果result=tl[-1]['result']['translations'][0]['beams'][0]['sentences'][0]['text']result_list.append(result)except Exception as e:#print(f'from func:handle, {tl}')#print(f'from func:handle, {e}')pass # 获取不到就算了(躺#【其实是因为代码结构问题,page.on和异步联用会先返回很多exception,最后才会返回结果,这个我还没想明白怎么优化,之后会再调整# 定义一个异步函数 parse_page,用于解析页面内容
async def parse_page(sentence, browser): context = await browser.new_context() # 创建新的浏览器上下文 page = await context.new_page() # 在上下文中创建新的页面 # 设置页面请求和响应的监听器 page.on("request", lambda request: handle(request=request, response=None)) page.on("response", lambda response: handle(response=response, request=None)) await page.goto('https://www.deepl.com/translator',timeout=240000) # 超时时间设置为 240 秒(是的,就是这么稳妥[doge]await page.fill('//*[@id="textareasContainer"]/div[1]/section/div/div[1]/d-textarea/div[1]/p',f'{sentence}\n')#print('定位成功')#print('填充成功') await page.wait_for_timeout(8000) # 定义一个异步函数 main,用于启动整个程序
async def main(sentences): async with async_playwright() as p: # 创建一个 Playwright 实例 browser = await p.chromium.launch() # 启动 Chromium 浏览器 tasks = [parse_page(sentence, browser) for sentence in sentences] # 创建任务列表 # 使用 asyncio.gather 并发执行所有任务,并等待它们完成 await asyncio.gather(*tasks) await browser.close() # 关闭浏览器 try: tl=[]result_list=[]se_list=['1》i do not fell happy today','2》i like to eat fish','3》i love potato very much','4》i am confused','5》help!','6》i want to transform to a tiger','7》nothing happend, i am just unhappy']asyncio.run(main(se_list)) result_list=list(set(item for item in result_list if item)) print(result_list)
except Exception as e: print(e) # 如果出现异常,打印错误信息'''
输出:
['6》我要变身老虎', '3》我非常喜欢土豆', '2》我喜欢吃鱼', '4》我很困惑', '7》什么都没发生,我只是不开心', '1》我今天不开心', '5》帮助!']
'''