<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[robinspada的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/robinspada</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; robinspada]]></copyright><item><title><![CDATA[常见开源ocr评测]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/155595991</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/155595991</guid><author>robinspada</author><pubDate>Fri, 05 Dec 2025 10:35:18 +0800</pubDate><description><![CDATA[这个ocr有很多产线，属于串联式ocr，其中和ocr相关的主要是ocr v5和vl，vl集成了版面识别，图片识别，表格识别，公式识别，图表识别等等，功能复杂，参数众多，精度还可以，但是速度不行，并且里面还有bug不成熟。以商业收费，成熟的google ocr为标准，在我们的内部评测中精度得分92，ppocr vl得分90，混元ocr得分98，olmocr没有实际验证，应该是比较接近混元ocr。精度最高，速度快，部署简单，刚开源的文档严重不足，需要22G左右显存，刚好可以部署在rtx 4090上。]]></description><category></category></item><item><title><![CDATA[用mitmproxy替代selenium-wire]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/153047796</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/153047796</guid><author>robinspada</author><pubDate>Sat, 11 Oct 2025 14:56:41 +0800</pubDate><description><![CDATA[摘要：selenium-wire作为基于mitmproxy的浏览器流量抓取工具已停止维护且无法使用。作者通过改造将其内置mitmproxy改为外置，支持最新版本。文章提供了代码示例，展示了如何通过PServer类启动mitmproxy代理服务器，并在selenium中设置代理。同时介绍了流量抓取的基本实现方法，建议直接使用mitmproxy更高效。该方案解决了selenium-wire因代码陈旧导致的功能失效问题。]]></description><category></category></item><item><title><![CDATA[使用If-None-Match和Etag协商缓存json动态数据]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/131805993</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/131805993</guid><author>robinspada</author><pubDate>Wed, 19 Jul 2023 13:21:42 +0800</pubDate><description><![CDATA[现代网页大多使用ajax获取动态json数据，有些json数据很大几乎不会修改，这样的数据就适合使用缓存来加快速度，减小流量，降低服务器的负荷。普通的强缓存要指定时间，比如说24小时，这个时间很难定，因为这些数据虽然平时不会变动，但是一旦变动，因为有浏览器的缓存，页面上依旧使用旧数据，这样极大的限制了缓存的使用。有没有一种办法既使用缓存，又不会使用旧数据呢？答案就是协商缓存。]]></description><category></category></item><item><title><![CDATA[chromedriver僵尸进程的产生原因以及官方解决办法]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/131454856</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/131454856</guid><author>robinspada</author><pubDate>Thu, 29 Jun 2023 14:33:50 +0800</pubDate><description><![CDATA[做过爬虫的人应该会知道driver.quit()后有一定几率产生chromdriver的孤儿进程（或者说僵尸进程）。但是这些僵尸是死而不僵，占据着内存让人讨厌，然而如果你随意杀死这些僵尸有可能导致正在运行的爬虫出错。所以说它们是僵尸是冤枉它们，它们实际上是孤儿进程，不过习惯上还是称它们为僵尸。这个问题存在了很多年，通常清理僵尸的办法就是kill这些僵尸，但是时机不好掌握，它们在刚成为僵尸时还有活动，这时如果kill它们会导致session id失效，或者profile（user data dir）被破坏。]]></description><category></category></item><item><title><![CDATA[selenium的find_elements非常慢的解决办法]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/131206069</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/131206069</guid><author>robinspada</author><pubDate>Wed, 14 Jun 2023 13:58:14 +0800</pubDate><description><![CDATA[后来看到国外一片文章（抱歉地址忘记了）说，find_elements慢的原因是页面上有很多ajax的请求，默认模式下会等待这些ajax的加载完成后才执行，所以阻塞了find_elements的执行，如果ajax一直在加载中就会一直等待直到超时。另外selenium的find_elements本来也比较慢，如果要追求解析速度，还可以使用第三方的xpath解析器，比如说lxml，但这些第三方解析器不能判断元素是否可见等等和浏览器相关的判断，使用有局限，作为纯粹的xpath搜索还是不错的。]]></description><category></category></item><item><title><![CDATA[修改element ui的tabs组件解决jointjs,echarts显示不正常的问题]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/131116497</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/131116497</guid><author>robinspada</author><pubDate>Thu, 08 Jun 2023 22:13:45 +0800</pubDate><description><![CDATA[left: -99999em，使用绝对定位不占位，移到可见区域之外，这样dom会继续渲染，就不影响jointjs了，echarts估计也是一样的。修改就一句非常简单，但是当时脑袋短路，没有意识到v-show就是控制display: none，还以为是在其他地方加上的，反复读tabs的其他代码都没有发现哪里有修改display: none，最后才发现是v-show在作怪，修改后完美渲染jointjs。然后在自己代码里引入修改后的组件，就可以替换element UI原来的tabs组件，用法和原来一样非常方便。]]></description><category></category></item><item><title><![CDATA[selenium通过performance log获取状态码，Content-Type，以及重定向路径]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/130682146</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/130682146</guid><author>robinspada</author><pubDate>Mon, 15 May 2023 13:26:47 +0800</pubDate><description><![CDATA[selenium的官方不提供获取状态码，Conten-Type，以及重定向路径的方法，并且官方说这些功能将来也不会有。]]></description><category></category></item><item><title><![CDATA[selenium多实例爬虫的忠告和参数配置]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/130481622</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/130481622</guid><author>robinspada</author><pubDate>Thu, 04 May 2023 11:04:14 +0800</pubDate><description><![CDATA[单线程爬虫本身很简单，而大规模的分布式多进程爬虫就比较复杂，Scrapy这种简单的框架拿来学习用或者做简单事情够用了，真实的需求往往比较复杂，需要大量定制，需要对Scrapy非常了解，与其被Scrapy这个框框限制住，不如自己写。当然C#,java也算是主流，其他的不建议选择。windows和linux都使用过，个人建议使用linux，windows上感觉有内存泄漏，爬虫跑多了会内存不足，还有一个重要原因是linux可以使用docker，docker绝对是安装开发部署的利器，测试环境更是必备。]]></description><category></category></item><item><title><![CDATA[对java，.net，Ruby，python，JavaScript，PHP的点评]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/130473491</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/130473491</guid><author>robinspada</author><pubDate>Wed, 03 May 2023 16:01:36 +0800</pubDate><description><![CDATA[缺点是没有热部署，语法独立特行，对C系语言经验者不友好，对匿名函数支持不好，不能多行匿名函数，没有真正的多线程，不过在通用脚本语言里面是最好的。PHP：最简洁的语言，没有复杂的语法，主要用于WEB后端，基本上是函数式编程，学习成本低入门简单，还有一个很大的优点是支持热部署，用git pull就可以发布程序。.net：融入了各种最新的现代语言特征，.net 5以后可以运行在linux平台，语言更新换代快，是java的替代语言，缺点是做web的话，开发效率不如脚本语言。接触了很多语言后，发表一下个人的浅见。]]></description><category></category></item><item><title><![CDATA[celery的控制程序如何与worker通信]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/130424533</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/130424533</guid><author>robinspada</author><pubDate>Fri, 28 Apr 2023 13:59:50 +0800</pubDate><description><![CDATA[celery的官方文档太简单，很多地方都没有说明清楚。就我目前知道的，有事件events与广播broadcast这2中方式，在官方文档里面都没有找到正式的用法，是我在网上搜到的。]]></description><category></category></item><item><title><![CDATA[tinymce组件的异步加载]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/129833666</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/129833666</guid><author>robinspada</author><pubDate>Wed, 29 Mar 2023 13:59:25 +0800</pubDate><description><![CDATA[实际测试发现await虽然可以阻塞mounted钩子，但是不能阻塞mounted后面的钩子导致后面的代码出错，也就是说vue生命周期钩子不支持await，每个钩子并不会等待上一个钩子执行完后才执行，它们是异步的，一旦你阻塞这个钩子，那么下一个钩子就会执行。既然vue生命周期钩子不支持await，就不要试图阻塞mounted，假装t组件已经渲染完成，通过脚本加载完的事件来事后延迟渲染组件，不需要长时间的延迟，只需要延迟几秒钟tinymce.min.js的加载就完成了。异步加载脚本，加载完后发通知事件。]]></description><category></category></item><item><title><![CDATA[tinymce加载自定义语言包]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/129666522</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/129666522</guid><author>robinspada</author><pubDate>Mon, 20 Mar 2023 14:42:02 +0800</pubDate><description><![CDATA[对tinymce自带的语言包不满意，重新修改语言包后通过language_url来加载自定义语言包。但是不管怎么修改language_url都没有生效，最后发现自定义的语言代码不能和既有的语言代码重复，否则不会加载。这个问题困扰了大半天，在网上没有找到解决办法，是自己摸索出来的，与大家分享。为自定义语言代码，与语言包上的文件名相匹配。将修改后的语言包放到public目录下，并 配置中的选项设置。修改语言包，将语言代码设置为自定义语言代码，注意不能和既有的语言代码重复，这点很重要。]]></description><category></category></item><item><title><![CDATA[全局定制elementui的确认框confirm]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/128142011</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/128142011</guid><author>robinspada</author><pubDate>Fri, 02 Dec 2022 09:36:48 +0800</pubDate><description><![CDATA[全局定制elementui的确认框confirm，实现键盘控制按钮的焦点。]]></description><category></category></item><item><title><![CDATA[如何解决selenium的dragAndDrop失效的问题]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/126760392</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/126760392</guid><author>robinspada</author><pubDate>Thu, 08 Sep 2022 11:26:01 +0800</pubDate><description><![CDATA[selenium的dragAndDrop失效的原因和解决办法]]></description><category></category></item><item><title><![CDATA[katalon开启google浏览器权限]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/126470603</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/126470603</guid><author>robinspada</author><pubDate>Tue, 23 Aug 2022 08:48:57 +0800</pubDate><description><![CDATA[这种方法是模拟人工点击allow，通常需要等待，并且如果当前窗口不是浏览器就不起作用，个人不喜欢robot类，所以想直接给浏览器授权，就可以避免弹出此对话框。参照上面的代码，在katalon的 点击菜单Project->setting菜单，输入下面的配置。自动测试不允许交互，可以通过Robot工具来模拟点击allow。这个是开启clipboard权限的例子，其他权限也是如法炮制。设置权限后启动测试就不会弹出授权的对话框了。需要开启权限，通常会弹出下面的对话框。python的授权代码如下。]]></description><category></category></item><item><title><![CDATA[vue中使用jointjs的问题]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/124290148</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/124290148</guid><author>robinspada</author><pubDate>Wed, 20 Apr 2022 10:47:32 +0800</pubDate><description><![CDATA[刚开始使用jointjs是使用原生js来书写的，因为jointjs的官网上的例子全是原生js的代码。原生js可以通过在index.html装载进vue，能够很好的运行。

不过原生js不是模块化的，不如es6方便，所以想改成es6的书写方法。

1.jointjs导入问题

根据官网JointJS - JavaScript diagramming library - Getting started.


import { dia, ui, shapes } from '@clientio/rappid';
]]></description><category></category></item><item><title><![CDATA[squid多实例官方说明注解]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/124163818</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/124163818</guid><author>robinspada</author><pubDate>Thu, 14 Apr 2022 09:52:39 +0800</pubDate><description><![CDATA[为什么要多实例运行？有什么使用场景？

比如说要把代理分成2个服务，一个是面向内部人员的不需要用户名密码，用IP地址来限定。另一个是面向外网的，需要用户名密码来验证。
	一台机器上有多个网卡，需要设置不同的代理
MultipleInstances - Squid Web Proxy Wiki

多实例官方说明参照上面的地址，下面就关键部分说明一下

Relevant squid.conf directives


	visible_hostname

	you may want to keep this u]]></description><category></category></item><item><title><![CDATA[axios的get方法中，参数值为null时，参数被删除的问题]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/123479959</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/123479959</guid><author>robinspada</author><pubDate>Mon, 14 Mar 2022 15:43:20 +0800</pubDate><description><![CDATA[问题描述
vue开发的时候，发现get请求的参数值为null，这个参数会被删除掉，在后端检查这个参数时不存在就会报错。


Example:
入力参数: { foo: null, bar: "baz", qux: undefined }
变换后的参数: ?bar=baz

foo被删除了，后台参数检查时发现foo不存在，就会报错

参照
https://github.com/axios/axios/issues/1139

这个问题在axios:release/1.0.0-beta.1中被修改，但是没有反.]]></description><category></category></item><item><title><![CDATA[用ArrayIterator 定制PHP数组，实现参数自动检查]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/123259461</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/123259461</guid><author>robinspada</author><pubDate>Thu, 03 Mar 2022 17:59:19 +0800</pubDate><description><![CDATA[php数组很强大，有很多功能。用ArrayIterator 可添加更多的功能。

比如说在cakephp框架中，request的query参数就是一个数组，可以通过key来获取不同的参数，但是当试图获取数据中不存在的key时，并不会报错，只是返回null。

浏览器表单输入数据，传到后台后，理论上需要重新检查，参数是否有，长度，类型等等，这是个比较繁琐的工作，特别是修改比较多的时候，前后台都要改。因此，对于要求不高的内部系统来说，后台可以不用检查长度，类型等等，但是参数是否存在应该要检查。

对于表单项目多]]></description><category></category></item><item><title><![CDATA[C# 字符串替换第n次匹配项]]></title><link>https://blog.youkuaiyun.com/robinspada/article/details/122987211</link><guid>https://blog.youkuaiyun.com/robinspada/article/details/122987211</guid><author>robinspada</author><pubDate>Thu, 17 Feb 2022 17:00:36 +0800</pubDate><description><![CDATA[没有现成的函数，网上找的的实现也不好，自己写了一个


        static string replace(string input, string pattern, string replacement, int n)
        {
            int count = 0;
            string result = Regex.Replace(input, pattern, new MatchEvaluator((match) =&gt; {
           ]]></description><category></category></item></channel></rss>