|
上周帮朋友处理一批商品数据,批量三百多个链接,搜索每个都要提取标题、复制价格和SKU。代码手动点开复制?批量干到明天早上也弄不完。我直接打开浏览器的搜索开发者工具,写了一段JavaScript,复制页面加载完自动抓取所有需要的代码内容,格式化后塞进剪贴板。批量整个过程不到十秒。搜索 这就是复制批量搜索复制代码的典型场景。核心逻辑其实就三步:定位目标元素、代码提取数据、批量写入剪贴板。搜索听起来简单,复制但真动手时会发现坑不少。 先说要定位元素。很多人第一反应是用document.querySelectorAll,这没错。但页面结构千奇百怪,class名可能是随机生成的哈希值,今天能用明天就变。我习惯先看元素有没有稳定的属性,比如data-*或者id。实在没有,就找父级容器,用children或者nth-child定位。有个小技巧:在控制台里用$0引用当前选中的元素,配合console.dir($0)能快速看清它的所有属性。 提取数据这一步,textContent比innerText快,但innerText更接近视觉呈现。价格这种带符号的,用正则清洗一下更稳妥。遇到异步加载的内容,得等DOM稳定再操作,MutationObserver或者简单的setTimeout轮询都能用。我一般写个waitForElement函数,Promise封装,超时抛错,干净利落。 写入剪贴板有个坑。navigator.clipboard.writeText在非HTTPS页面或者没用户手势的情况下会静默失败。稳妥做法是创建一个textarea,设值,select(),然后document.execCommand('copy')。虽然这个API被标记为废弃,但兼容性反而更好。写完后记得移除临时元素,别留垃圾在DOM里。 实际案例。某电商后台的订单列表,每行有个“复制地址”按钮。我要批量导出所有地址。直接遍历按钮触发click?不行,那样会弹出几百个提示框。正确做法是绕过UI,直接读数据源。打开Network面板,找到返回订单JSON的接口,复制请求为cURL,然后用Python的requests重放,拿到数据后pandas一处理,CSV就出来了。这比在浏览器里折腾DOM高效十倍。 再举个反例。有人用Selenium模拟点击,每个元素等两秒,三百个链接跑了十分钟。我看了眼页面,数据明明就在window.__INITIAL_STATE__里躺着。一行JSON.stringify(window.__INITIAL_STATE__),复制粘贴到编辑器,格式化,完事。工具选择上,能读内存就别碰DOM,能发请求就别模拟点击。这是原则。 代码写多了会发现,批量操作的核心矛盾是稳定性和速度的平衡。太快了页面没渲染完,太慢了又失去批量意义。我的经验是加个短延时,50到100毫秒,配合requestIdleCallback,让浏览器喘口气。另外,异常处理不能省。某个元素找不到就跳过,记录日志,别让整个脚本崩掉。毕竟三百个里有一两个格式不对太正常了。 最后说个细节。复制到剪贴板的内容,格式很重要。纯文本适合粘贴到Excel,但带换行和制表符的结构化文本更通用。我通常用\t分隔字段,\n分隔行。如果目标软件支持,还可以生成Markdown表格或者JSON。看场景选格式,别一根筋。 下次遇到批量复制的活儿,先别急着动手。花两分钟看看页面结构,翻翻Network请求,说不定有更短的路。代码这东西,写得少往往意味着想得清楚。 |