论文提出了IoU-based的DIoU loss和CIoU loss,以及建议使用DIoU-NMS替换经典的NMS方法,充分地利用IoU的特性进行优化。...并且方法能够简单地迁移到现有的算法中带来性能的提升,实验在YOLOv3上提升了5.91mAP,值得学习 论文:Distance-IoU Loss: Faster and Better Learning...但一般对bbox的精调都采用L2范数,而一些研究表明这不是最优化IoU的方法,因此出现了IoU loss IoU loss [1240] IoU loss顾名思义就是直接通过IoU计算梯度进行回归,...IoU loss的实现形式有很多种,除公式2外,还有UnitBox的交叉熵形式和IoUNet的Smooth-L1形式 这里论文主要讨论的类似YOLO的检测网络,按照GT是否在cell判断当前...注意到,CIoU在小物体上的性能都有所下降,可能由于长宽比对小物体的检测贡献不大,因为此时中心点比长宽比重要 [1240] 图7对GIoU和CIoU的结果进行了可视化,可以看到,在中大型物体检测上,
CIoU loss,以及建议使用DIoU-NMS替换经典的NMS方法,充分地利用IoU的特性进行优化。...一、简介 1、IoU IoU是目标检测里面很重要的一个指标,通过预测的框和GT间的交集与并集的比例进行计算,经常用于评价bbox的优劣 。...但一般对bbox的精调都采用L2范数,而一些研究表明这不是最优化IoU的方法,因此出现了IoU loss。...三、方法 一般而言,IoU-based loss可以定义为公式5,是预测box和的惩罚项。...图 6 图6对GIoU和CIoU的结果进行了可视化,可以看到,在中大型物体检测上,CIoU的结果比GIoU要准确。
摄影:产品经理 寿喜锅的一角 经常使用 Selenium 或者 Puppeteer 的同学都知道,他们启动的 Chrome 浏览器分为有头模式和无头模式。...在自己电脑上操作时,如果是有头模式,会弹出一个 Chrome 浏览器窗口,然后你能看到这个浏览器里面在自动操作。而无头模式则不会弹出任何窗口,只有进程。 别去送死了。...下图为有头模式,不使用任何隐藏特征的技术访问检测网站: 下图为无头模式,不使用任何隐藏特征的技术访问检测网站: 万里河山一片红 所以,一般情况下,你应该多使用有头模式。...现在我们从服务器上把这个生成的screenshot.png文件拉下来,打开以后可以看到内容如下: 可以看到,虽然窗口比较小,但确实是有头模式下面的检测结果。...然后修改 Selenium 的代码,设置浏览器窗口的大小: 运行效果如下图所示: 本文演示使用的是 Python操作 Selenium,你也可以试一试使用 Puppeteer,只需要把启动命令改为xvfb-run
现在,随便开一个 Chrome 的窗口,打开开发者工具,如下图所示: ? 大家注意,在开发者工具菜单栏的左上角,图中箭头所指向的位置,出现了 Node.js 的绿色 Logo。我们点击一下它。...此时,会弹出一个单独的开发者工具窗口,如下图所示: ? 这个窗口会自动关联上我们刚才启动的 Node.js。 现在,我们试一试直接在这个开发者工具的 Console标签页上面写一些代码: ?...可以看到,在Console标签页打印出来的内容,也会在终端窗口出现。看起来,不过是从黑色窗口写代码变成了在白色窗口写代码,这有什么好炫耀的?...我们尝试在这里打开我的博客: ? 可以看到,我在代码里面故意写错了一部分,应该用await browser.NewPage()但是我写的是await browser.page,导致程序报错。...我下面重新改成正确的就可以了。整个过程不需要重启浏览器。你运行一行代码,它执行一行代码,代码错了,只需要改这一行重新执行就可以了。这才叫做交互环境。
输入账号kingname和密码genius以后,可以看到登录成功的页面,如下图所示: 现在,你把浏览器关了再打开,然后再次访问这个网址,你会发现浏览器直接就能进入到登录成功的页面,不会再出现登录页面。...这个过程一来拖慢了爬虫的运行速度,二来容易让网站检测到你的账号异常——难道自动登录功能失效了?为什么其他人的都正常,他的账号每小时都要重新登录一次?可能是爬虫,发个验证码过去探探虚实。...这个方法网上有很多例子,你可以通过关键词“selenium 获取cookies”和“selenium设置cookies”搜索到,我就不再赘述了。 我们今天要讲的是第二个方法,也是最简单的方法。...这个模式打开的情况下,Puppeteer或者Selenium可以通过websocket连上去,进而控制它。 首先我们来启动Chrome的远程调试端口。...大家可以试一试,现在在终端窗口里面按下Ctrl + C把当前的爬虫代码强行关闭,然后再启动一次,你会发现依然是登录以后的页面。
最后,也是最重要的,无头浏览器并不是无敌的,反爬的一方不会乖乖束手就擒,你有张良计,他自然就有过强梯,反爬一方会通过某些方法检测出无头浏览器,然后把这些请求全部处理掉,某些网站你使用无头浏览器甚至无法打开首页...上段说的最后一点,也就是针对无头浏览器的反爬攻防,就是本文所要讨论的内容。PhantomJS和Selenium已经日薄西山,本文只研究后来居上的Puppeteer。 2....可以打开浏览器看一下,这个属性的值是不是挺复杂的。...Language 这一属性取自于navigator.language,在早期的puppeteer版本中,无头模式下是没有这个属性的,所以可以通过这种方法来检测: function hasChrome()...Viewport 同样是早期版本中,puppeteer打开的无头浏览器会有一个默认的窗口大小,800600。
负载主机可以提供很多种[负载均衡]方法,也就是我们常说的调度方法或算法: 轮循(Round Robin) 这种方法会将收到的请求循环分配到服务器集群中的每台机器,即有效服务器。...基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。...对于非常强大的“基于代理的自适应负载均衡”方法来说,负载主机以这种方式来定时检测所有服务器负载情况:每台服务器都必须提供一个包含文件,这个文件包含一个0~99的数字用来标明改服务器的实际负载情况(0=空前...因此,如果一个服务器负载过大,权重会通过系统透明的作重新调整。和加权轮循调度方法一样,不正确的分配可以被记录下来使得可以有效的为不同服务器分配不同的权重。...这种方式中每个真实服务器的权重需要基于服务器优先级来配置。 加权响应(Weighted Response) 流量的调度是通过加权轮循方式。加权轮循中所使用的权重是根据服务器有效性检测的响应时间来计算。
在以前的公众号中,我提到Selenium/Puppeteer/Pyppeteer有很多特征可以被网站检测到。...于是,有些同学想到了另一个方法,就是自己写一个Chrome插件,在网站打开的时候,注入到页面中,然后通过这个注入的JavaScript代码来操作页面,获取数据。...这个方法理论上说是万能的,因为注入的JavaScript能够获取当前Dom树,任何接口签名都无法拦截到自己注入的JavaScript代码,如下图所示: 而Chrome插件访问自己的服务器后端是没有跨域问题的...所以你只需要把网页打开,启动插件,然后他就能自动刷新,自动获取数据了。 这个方法看起来非常万能,而且无法被防御…… 事实真的是这样吗?我写了一个Demo来做测试。...Demo页面长下面这样: 当我手动点击点击我按钮的时候,会弹出一个框: 现在,我使用JavaScript来选择这个按钮,然后点击它: 为什么网站知道我在用JavaScript点击了按钮呢?
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。...负载主机可以提供很多种负载均衡方法,也就是我们常说的调度方法或算法。 轮循 Round Robin: 这种方法会将收到的请求循环分配到服务器集群中的每台机器,即有效服务器。...基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。...和加权轮循调度方法一样,不正确的分配可以被记录下来使得可以有效地为不同服务器分配不同的权重。...加权轮循中 所使用的权重 是根据服务器有效性检测的响应时间来计算。每个有效性检测都会被计时,用来标记它响应成功花了多长时间。
前言 Google Chrome早就支持了headless模式,但一般都是在Linux上运行,而我则习惯于在WSL上开发,折腾了好久终于找到了可以在WSL上跑headless模式的方法。...使用 官方文档的方法打开Chrome: $ google-chrome --headless --disable-gpu --screenshot https://www.baidu.com/ 出现如下报错信息...看起来有两个问题: 中文没有正确显示 窗口大小偏小 中文显示的问题可以通过以下命令解决: $ sudo apt install fonts-noto-cjk 修改窗口大小可以通过增加--window-size...使用puppeteer提供的Chrome 无意中发现,puppeteer中提供的Chrome竟然可以在WSL中开启调试端口并正常访问。...总结 安装依赖库,包括中文字体库 使用puppeteer提供的Chrome版本 完整的启动命令行:chrome --no-sandbox --headless --no-gpu --disable-setuid-sandbox
Selenium 与 Puppeteer 能被网站探测的几十个特征》中,我们提到目前网上的反检测方法几乎都是掩耳盗铃,因为模拟浏览器有几十个特征可以被检测,仅仅隐藏 webdriver 这一个值是没有任何意义的...具体的做法和原理,大家可以参考我这两篇文章: (最新版)如何正确移除Selenium中的 window.navigator.webdriver (最新版)如何正确移除 Pyppeteer 中的window.navigator.webdriver...如果你使用的是 Pyppeteer,那么可以根据我上面文章中给出的方法,试着加载一下这个 js 文件,看看是不是也能成功隐藏特征。 那么,这个stealth.min.js文件是怎么来的呢?...此时,你需要把它的package.json和index.js两个文件保存到本地。...然后打开package.json文件,修改其中的dependencies这一项,把里面的puppeteer改成puppeteer-core,如下图所示: 然后修改index.js,给.launch()函数增加一个参数
首先,进入搜索页面,选择全国范围,搜索前端: 然后职位列表的每个点进去查看描述,把这个岗位的信息和描述抓取下来: 创建 test.js import puppeteer from 'puppeteer'.../test.js 它会自动打开一个浏览器窗口: 然后执行自动化脚本: 这样,下面的列表数据就是可以抓取的了。...不过这里其实没必要这么麻烦,因为只要你 url 里带了 city 和 query 的参数,会自动设置为搜索参数: 所以直接打开这个 url 就可以: import puppeteer from 'puppeteer...就是在 url 后再带一个 page 的参数: 然后,我们遍历访问每页数据,拿到每个职位的信息: import puppeteer from 'puppeteer'; const browser =...浏览器访问下: 爬虫跑的没啥问题。 不过这个过程中 boss 可能会检测到你访问频率过高,会让你做下是不是真人的验证: 这个就是验证码点点就好了。
但是如果你使用了本文的方法,用Pyppeteer抓取淘宝,你就会发现另外一个广阔的天地。...今天,我们来讲讲如何在Pyppeteer中隐藏 window.navigator.webdriver 首先,我们使用下面的代码,通过Pyppeteer打开浏览器窗口: import asyncio from...await browser.close() asyncio.get_event_loop().run_until_complete(main()) 代码运行以后,会打开Chrome浏览器,并访问 http...那么正确的办法是什么呢? 我写这篇文章的时候(2019-08-15),Pyppeteer的最新版本为0.0.25,如下图所示: ?...题外话:官方文档和源代码是你的好朋友,如果官方文档找不到你想要的功能,源代码又看不懂,那么就阅读我写的爬虫书吧——学爬虫不走野路子。
中检测泄漏 使用 Memlab 检测分离的 DOM 元素的教程。...让我们通过从浏览器访问 http://localhost:3000 来确保它正在运行: 这里测试的是 Example 1。...example app 的第 12 行在 for 循环中创建了 1024 个分离的 DOM 对象。...打破引用链意味着泄漏的对象将不再可以从 GC 根访问,因此可以进行垃圾回收。...map - 这是正在访问的对象的 V8 HiddenClass(V8 在内部使用它来存储有关对象形状的元信息和对其原型的引用 - 在此处查看更多信息)- 在大多数情况下,这是 V8 实现细节,可以忽略。
由于Selenium启动的Chrome中,有几十个特征可以被识别,所以在爬虫界已经没有以前那么受欢迎了。模拟浏览器的新秀Puppeteer异军突起,逐渐受到了爬虫界的关注。...但是如果你使用了本文的方法,用Pyppeteer抓取淘宝,你就会发现另外一个广阔的天地。...今天,我们来讲讲如何在Pyppeteer中隐藏 window.navigator.webdriver 首先,我们使用下面的代码,通过Pyppeteer打开浏览器窗口: import asyncio from...await browser.close() asyncio.get_event_loop().run_until_complete(main()) 代码运行以后,会打开Chrome浏览器,并访问 http...那么正确的办法是什么呢? 我写这篇文章的时候(2019-08-15),Pyppeteer的最新版本为0.0.25,如下图所示: ?
正如其翻译为“操纵木偶的人”一样, 你可以通过 Puppeteer 的提供的 API 直接控制 Chrome,模拟大部分用户操作来进行 UI 测试或者作为爬虫访问页面来收集数据。...Puppeteer 用途 生成页面的屏幕截图和 PDF。 爬取 SPA 应用,并生成预渲染内容(即 SSR 服务端渲染)。 自动执行表单提交、UI测试、键盘输入等。...初探 Puppeteer:从页面截图开始 实现页面截图,首先我们需要创建一个浏览器实例,然后打开一个页面,加载指定的 URL,在打开的页面上触发截图操作,最后再将浏览器关闭。...双探 Puppeteer:爬取苏宁易购的商品信息 打开电商首页,输入想要的商品名称,点击搜索按钮,跳转至相应的商品列表页,然后一页页浏览,从而找到心仪的商品,这大概就是我们平时网购的样子。...结语 当然, Puppeteer 的强大不止于此,我们可以通过 Puppeteer 实现更多有意思的功能,比如使用 Puppeteer 来检测页面图片是否使用懒加载,后续我们会对其功能的实现进行的分享,
方法一:检查并配置正确的IP设置步骤:打开“控制面板”:按下Win + R键,输入control,然后按回车。...配置IP地址:右键单击当前使用的网络适配器(例如“以太网”或“Wi-Fi”),选择“属性”。在弹出窗口中找到并双击“Internet 协议版本 4 (TCP/IPv4)”。...更改网络类别:在“网络和共享中心”窗口中,点击“未识别的网络”。在弹出的窗口中,选择“将此网络标记为专用网络”或“将此网络标记为公用网络”,具体取决于您的需求。...如果需要访问网络共享资源,建议选择“专用网络”。方法三:更新网络适配器驱动程序步骤:打开“设备管理器”:右键单击“此电脑”或“我的电脑”图标,选择“属性”,然后选择“设备管理器”。...方法四:重置网络设置步骤:打开“设置”应用:按下Win + I键,打开“设置”。进入“网络和Internet”设置:在“设置”窗口中选择“网络和Internet”。重置网络:在左侧菜单中选择“状态”。
Puppeteer 默认以 无头(headless) 的方式运行, 也可以使用 GUI 的方式运行 Chrome 和 Chromium。...之类的工具,puppeteer 更多的是专注于和 Chromium 的互通,以提供更丰富更可靠的功能。...npm i puppeteer-core 或 yarn add puppeteer-core 使用 puppeteer-core 需要确保它的版本和连接的 Chrome 版本可以兼容。...初始的窗口尺寸为 800x600px, 这也决定了对页面的截图的尺寸为 800x600px。...打开“慢动作”模式 - 进一步看清浏览器的运行 const browser = await puppeteer.launch({ headless: false, slowMo: 250, //
界面,所以你可以绕过真正浏览的加载CSS、JavaScript和打开、绘制HTML的所有环节。...因为你可以利用无头测试工具提供的命令行+api来自动化地替代大量的简单重复操作,如输入页面地址、刷新页面、表单提交、确认显示数据是否正确等等。...他可以辅助Nightmare更好的完成自动化测试。 将Nightmare和Mocha安装成开发依赖的方法: 下面是一个基于Nightmare和Mocha的例子: 这里我还使用到了断言库——chai。...Headless Chrome带来了由Chromium和Blink渲染引擎提供的所有现代web平台功能。这是一种不需要在屏幕上打开窗口的全新页面交互方式。...安装Puppeteer的方法 下面的例子中,使用Puppeteer来对页面进行截屏。 下面的例子中,使用Puppeteer来对页面数据进行抓取。
,因为并不是所有的需要检测分析的网站用户都可以管理网站的。...两种方式都存在https 和 http资源由于同源策略引起的另一个问题,https站无法加载http资源,所以如果为了最好的兼容性,热图分析工具需要被应用http协议,当然具体可以根据访问的客户网站而具体分站优化...针对这种情况,如果基于puppeteer来做,流程就变成了 puppeteer启动浏览器打开用户网站-->页面渲染-->返回渲染后结果,简单的用伪代码实现如下: const puppeteer = require...,所谓模拟登录就是让浏览器去登录,这里需要用户提供对应网站的用户名和密码,然后我们走如下的流程: 访问用户网站-->用户网站检测到未登录跳转到login-->puppeteer控制浏览器自动登录后跳转到真正需要抓取的页面...: 通过puppeteer启动浏览器打开请求页面-->点击登录按钮-->输入用户名和密码登录 -->重新加载页面 基本代码如下图: const puppeteer = require("puppeteer
领取专属 10元无门槛券
手把手带您无忧上云