)
文章目录一、环境安装与基础依赖1. 版本要求2. 安装步骤3. 快速验证是否安装成功二、两大执行模式同步API与异步API1. 同步API新手首选单页面简单任务2. 异步API批量爬虫、多并发场景推荐三、浏览器启动高级参数配置1. 关闭自动化特征、模拟真实浏览器2. 自定义UA、视口、语言指纹3. 持久化登录态保存Cookie免重复登录四、元素定位核心Locator API官方推荐1. 常用定位方式2. 批量提取列表数据爬虫核心五、页面交互操作大全1. 输入、点击、单选复选2. 鼠标滚动、下拉加载更多3. 文件上传4. 文件下载监听六、等待策略杜绝time.sleep硬等待七、网络拦截、请求监听抓取接口JSON1. 监听页面所有接口返回数据2. 拦截请求屏蔽图片、广告资源提速省流量3. Mock接口返回数据自动化测试专用八、代理IP配置爬虫必备1. 浏览器级别代理所有页面共用IP2. 单上下文独立代理多IP并发抓取推荐九、反爬优化方案降低被封禁概率十、Linux服务器无头部署实战十一、常见报错与排错指南本文基于线上爬虫、自动化项目实操经验整理分安装、基础API、同步/异步两种写法、元素定位、页面交互、网络监听、代理配置、防检测、批量爬虫、文件上传下载、Linux服务器部署、常见报错排错完整覆盖所有代码均可直接复制运行无空洞理论适合开发、测试、运维人员自学也可作为企业内部技术文档。一、环境安装与基础依赖1. 版本要求Python 3.8及以上版本Windows、macOS、CentOS、Ubuntu全平台支持。2. 安装步骤第一步安装Python依赖包pipinstallplaywright第二步自动下载内置浏览器内核Chromium/Firefox/WebKit# 安装全部三款浏览器playwrightinstall# 只安装Chromium爬虫常用体积更小playwrightinstallchromiumLinux服务器额外安装系统底层依赖否则浏览器启动报错playwright install-deps3. 快速验证是否安装成功新建test.py运行基础代码能正常打开百度代表环境正常fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:browserp.chromium.launch(headlessFalse)pagebrowser.new_page()page.goto(https://www.baidu.com)print(page.title())browser.close()二、两大执行模式同步API与异步API1. 同步API新手首选单页面简单任务逻辑直观不用写await适合简单自动化、单次抓取场景。with语句会自动释放浏览器资源避免内存泄漏。fromplaywright.sync_apiimportsync_playwrightdefsync_demo():withsync_playwright()asp:# headlessFalse显示浏览器窗口True无头后台运行browserp.chromium.launch(headlessFalse)pagebrowser.new_page(viewport{width:1280,height:720})page.goto(https://www.baidu.com,wait_untilnetworkidle)# 输入搜索词page.locator(#kw).fill(Python Playwright)page.locator(#su).click()# 等待结果加载完成page.wait_for_load_state(domcontentloaded)print(页面标题,page.title())# 截图保存page.screenshot(pathbaidu_result.png)browser.close()if__name____main__:sync_demo()2. 异步API批量爬虫、多并发场景推荐基于asyncio协程同一浏览器创建多个页面并行执行大幅提升抓取效率大批量任务必须用异步。importasynciofromplaywright.async_apiimportasync_playwrightasyncdefasync_task(url):asyncwithasync_playwright()asp:browserawaitp.chromium.launch(headlessTrue)pageawaitbrowser.new_page()awaitpage.goto(url,timeout30000)titleawaitpage.title()print(f{url}标题{title})awaitbrowser.close()asyncdefbatch_crawl():task_list[async_task(https://www.baidu.com),async_task(https://www.bing.com)]awaitasyncio.gather(*task_list)if__name____main__:asyncio.run(batch_crawl())三、浏览器启动高级参数配置launch方法支持大量实用参数爬虫和自动化场景高频使用。1. 关闭自动化特征、模拟真实浏览器browserp.chromium.launch(headlessTrue,# 关闭自动化检测标记规避网站反爬args[--disable-blink-featuresAutomationControlled,--no-sandbox,--disable-dev-shm-usage])--no-sandboxLinux服务器必加否则root用户无法启动浏览器--disable-dev-shm-usage解决服务器共享内存不足崩溃问题2. 自定义UA、视口、语言指纹contextbrowser.new_context(user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,viewport{width:1920,height:1080},localezh-CN,timezone_idAsia/Shanghai)pagecontext.new_page()3. 持久化登录态保存Cookie免重复登录登录一次后存储上下文下次启动直接携带登录信息适合需要登录才能抓取数据的网站。# 登录后保存上下文context.storage_state(pathlogin_cookie.json)# 下次启动加载cookiecontextbrowser.new_context(storage_statelogin_cookie.json)四、元素定位核心Locator API官方推荐早期query_selector存在元素过期报错问题Locator是稳定定位方案支持链式调用、自动等待。1. 常用定位方式# 1. ID选择器page.locator(#kw)# 2. Class选择器page.locator(.search-input)# 3. 文本匹配最常用不受页面样式改动影响page.locator(text登录)page.locator(text确认提交,exactTrue)# 精确匹配完整文本# 4. 属性匹配page.locator([placeholder请输入账号])# 5. 组合筛选包含指定文本的按钮page.locator(button,has_text搜索)# 6. 多层嵌套定位page.locator(.list-item).locator(a)2. 批量提取列表数据爬虫核心# 获取所有商品标题文本title_listpage.locator(.goods-title).all_text_contents()fortitleintitle_list:print(title)# 获取元素属性如链接、图片地址srcpage.locator(img.cover).get_attribute(src)五、页面交互操作大全1. 输入、点击、单选复选# 输入文本page.locator(#username).fill(test_user)# 清空输入框page.locator(#password).clear()# 点击按钮page.locator(text登录).click()# 强制点击元素被遮挡时使用page.locator(text弹窗确认).click(forceTrue)# 下拉选择框page.locator(#city).select_option(shanghai)# 复选框勾选page.locator(#agree).check()2. 鼠标滚动、下拉加载更多# 滚动到指定元素page.locator(.bottom-list).scroll_into_view_if_needed()# 模拟页面向下滚动page.evaluate(window.scrollTo(0, document.body.scrollHeight))3. 文件上传# 上传本地文件到上传组件page.locator(input[typefile]).set_input_files(./upload.png)4. 文件下载监听# 监听下载事件withpage.expect_download()asdownload_info:page.locator(text导出Excel).click()downloaddownload_info.value# 保存到本地download.save_as(./data.xlsx)六、等待策略杜绝time.sleep硬等待Playwright内置智能自动等待操作元素前会自动等待元素可见、可点击复杂页面搭配手动等待提升稳定性。wait_for_load_state页面加载状态# 仅DOM加载完成速度快page.goto(url,wait_untildomcontentloaded)# 所有网络请求基本结束抓取接口数据推荐page.goto(url,wait_untilnetworkidle)等待指定元素出现# 等待商品列表渲染完成超时10秒page.wait_for_selector(.goods-item,timeout10000)全局默认超时设置page.set_default_timeout(15000)七、网络拦截、请求监听抓取接口JSON1. 监听页面所有接口返回数据不用解析DOM直接抓取后端返回JSON数据更干净稳定。api_data{}defcapture_response(response):# 过滤目标接口if/api/goods/listinresponse.url:ifresponse.status200:nonlocalapi_data api_dataresponse.json()# 注册监听事件page.on(response,capture_response)page.goto(目标页面地址)print(api_data)2. 拦截请求屏蔽图片、广告资源提速省流量defblock_resource(route):# 屏蔽图片、视频、字体ifroute.request.resource_typein[image,media,font]:route.abort()else:route.continue_()page.route(**/*,block_resource)3. Mock接口返回数据自动化测试专用defmock_api(route):if/api/user/infoinroute.request.url:route.fulfill(status200,content_typeapplication/json,body{code:0,data:{name:测试用户}})else:route.continue_()page.route(**/api/user/**,mock_api)八、代理IP配置爬虫必备支持浏览器全局代理、单上下文独立代理带账号密码认证。1. 浏览器级别代理所有页面共用IPbrowserp.chromium.launch(headlessTrue,proxy{server:http://127.0.0.1:7890,username:proxy_user,password:proxy_pass})2. 单上下文独立代理多IP并发抓取推荐browserp.chromium.launch(headlessTrue)# 同一个浏览器创建多个上下文每个使用不同代理context1browser.new_context(proxy{server:http://ip1:port})context2browser.new_context(proxy{server:http://ip2:port})九、反爬优化方案降低被封禁概率启动浏览器添加关闭自动化特征参数前文args配置自定义真实UA、时区、屏幕分辨率统一浏览器指纹使用持久化上下文保存Cookie模拟真实用户登录行为增加操作间隔模拟人工浏览importtime time.sleep(random.uniform(0.5,1.5))搭配代理池轮换IP单IP控制访问频率安装playwright-stealth插件深度隐藏自动化标识pipinstallplaywright-stealth使用示例fromplaywright_stealthimportstealth_sync stealth_sync(page)十、Linux服务器无头部署实战服务器无图形界面必须使用headless模式完整运行模板fromplaywright.sync_apiimportsync_playwrightimportrandomdefserver_crawl():withsync_playwright()asp:browserp.chromium.launch(headlessTrue,args[--no-sandbox,--disable-dev-shm-usage,--disable-blink-featuresAutomationControlled])contextbrowser.new_context(user_agentMozilla/5.0 (X11; Linux x86_64) Chrome/120.0.0.0 Safari/537.36,viewport{width:1366,height:768})pagecontext.new_page()page.set_default_timeout(20000)try:page.goto(https://target.com,wait_untilnetworkidle)titlepage.title()print(抓取成功,title)exceptExceptionase:print(抓取异常,str(e))finally:page.close()browser.close()if__name____main__:server_crawl()后台常驻运行可搭配systemd、PM2托管脚本崩溃自动重启。十一、常见报错与排错指南TimeoutError 元素等待超时原因页面加载慢、选择器写错、元素被弹窗遮挡解决延长timeout、核对Locator文本/CSS、等待弹窗消失再操作Linux启动报错no sandbox解决launch参数添加--no-sandbox浏览器内存占用持续飙升原因page、context未正常关闭循环内未释放资源解决使用with语句每次抓取完成执行page.close()网站识别自动化返回403/验证码解决添加stealth、关闭AutomationControlled、更换代理IP、降低抓取频率playwright install 下载浏览器失败解决切换国内镜像或手动下载浏览器内核放置指定目录文件下载无响应解决使用page.expect_download()上下文捕获下载事件不要直接点击后休眠