Poirot 是自动将字体文件(woff\woff2\ttf)映射为结果字典,主要用于中文字体反爬虫的破解,包括 css 字体映射和图片文字反爬虫.

实现的基础思路可见于字体反爬虫解决方案-自动化通过字体文件生成映射字典.

Mori 同属于爬虫工作的小工具.名字取自大侦探波洛(Hercule Poirot). 与 Mori 的脚本服务不同,这次从实际使用的角度考虑,采用了 web 服务的形式.

本篇记录了 Poirot 的开发中学习到的技术和踩到的坑。

主要包括:

  1. flask-websocket 的使用
  2. 进度条的实现
>
spider

由于之前疏于对公司电脑上面的 C 盘的管理,它的存储空间不出意外地炸了.

于是就开始了繁琐的清理工作.首先通过 设置 -> 存储 找到 C 盘占用空间的大头.也就是微信文件和 miniconda,微信由于日常的工作联系等积压了大约 5G 左右,miniconda…emmm…8G = =

看了一下,pytorch、tensorflow 等一系列的包、环境,这个手术动起来还是挺麻烦的,牵连太多了.

不过随着工作任务的固定,有些包和环境确实也不需要了,于是就有了接下来的一些迷惑操作.

>
wsl

最近在寻找一些毕设要用到的数据,医药相关的,恰好在某个网站上面找到了备份数据库(手段不太光彩,这里就不细说了),省去了写爬虫的麻烦。

不过这些备份文件是 .MYD / .MYI / .frm 这样的后缀,emmmmm,对于用惯了 .sql 的我来说,还是很头大的。

本篇的主要内容就是如何使用 .frm / .MYI / .MYD 文件来恢复数据库,同时,做了一些关联的延申。

>
mysql

字体反爬虫

初级的字体反爬虫可以参照字体反爬的解决方案——突破抖音反爬虫机制这边文章.

类似的文章教程不胜枚举,所以这里对于 字体反爬虫基础 就不做赘述.本篇要讨论的是如何处理在多大数百、数千个自定义字体的复杂情况下完成从字体文件生成映射字典的工作.

上面提到的文章,采用的是人工映射,这在只有 0~10 这样的简单情况下自然是最方便的处理办法,但是对于大量字体的情况,就捉襟见肘了.并且,即使花了半天时间将这些字体一一映射,万一网站的字体库发生变化,或者网站本身就采用动态字体库,就很麻瓜了.

本着”花半天时间做重复性的苦力工作,不如花一天时间做创造性工作”的原则(预估的开发时间比较充裕,才有时间来实践这些突发的灵感),决定搞一些懒人方法.

>
spiderantispider crack

上周在外网搭建了一个服务,主要是用来对 Mori 的各种处理状态做测试.

今天在看网站统计的时候,发现请求的次数不太正常,主要表现就是出现了下面这种画风的请求.

INFO:     174.49.25.36:51271 - "GET / HTTP/1.1" 200 OK
INFO:     14.139.155.142:41680 - "GET /currentsetting.htm HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:58868 - "GET /wp-content/plugins/wp-file-manager/readme.txt HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:58844 - "GET /?XDEBUG_SESSION_START=phpstorm HTTP/1.1" 200 OK
INFO:     91.241.19.84:42642 - "GET /console/ HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:36206 - "POST /api/jsonws/invoke HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:55124 - "POST /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:36174 - "GET /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:42156 - "GET /index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=HelloThinkPHP21 HTTP/1.1" 404 Not Found
INFO:     91.241.19.84:52646 - "GET /?a=fetch&content=<php>die(@md5(HelloThinkCMF))</php> HTTP/1.1" 200 OK
INFO:     91.241.19.84:53606 - "GET /solr/admin/info/system?wt=json HTTP/1.1" 404 Not Found
INFO:     203.205.34.139:47518 - "GET / HTTP/1.1" 200 OK
INFO:     182.185.14.56:62446 - "GET /currentsetting.htm HTTP/1.1" 404 Not Found

随手摘了一个 ip (219.149.212.74) 查询了一下,竟然是国内的 = =|||

又想到从大二下接触 web 开发,到现在两年多,部署了几个服务,但是却没有好好分析过网站的日志文件,正好就趁着这个机会看看吧.

>
awk

前言

目前主要接触的爬虫开发主要有两种:

  1. 静态网页
  2. api

我司已经有静态网页的检测工具,不过随着 api 类爬虫日益增加,需要一个新的可以用来检测 api 变动的脚本.

这里我选择开发一个命令行工具,而非 web 平台服务.理由是前者更加 geek && cool.并且前者只要稍作改动,就可以很好地兼容后者.

我将其命名为 Mori Kokoro , 取自柯南的 毛利小五郎 . 就一个检测脚本而言,它的工作与侦探 🔍 相类似(发现坏家伙 😀).同时这个脚本算是我第一个开发的命令行脚本,无论是代码质量,还是功能实现,都缺乏信心,所以就以毛利为名.

Mori 项目地址

main

>
diyTools

在爬虫实习中遇到了这样一个情境:对一个给定的队列进行数据爬取(比如说是一个公司名称的队列,爬取对应的公司信息),当然不是开发结束就算是完成了,代码无法保证能够应对所有的突发情况,而且我们也需要一个半透明的,甚至是透明的爬虫监控系统,了解爬虫的任务进度,以及过程中遇到的一些问题。

这个监控系统并不难实现,使用 flask 写了一个服务平台,不过是几个小时的事情,但是我在实现过程中遇到一个很有趣的问题:用什么样的数据库来保存这些数据?

笔者写爬虫时常用的数据有 MySQLmongoDBRedis,这三个各有长处,用来针对不同的业务需求;而在写 web 服务时,则常用 MySQLSQLite

这些数据库在不同的情境下各有优劣,正巧最近有些闲工夫,就在这个问题上做了一些发散。

>
Redis

Factory Function for Tuples with Named Fields

Python 除了大家熟知的,可以直接使用的 list、dictionary、tuple 等容器,还有一些放在 collections 包中的容器,这些容器的泛用性不及普通容器,但是在特殊的场景下,有着超过普通容器的性能与便利性。

本篇就在官方文档的基础上,结合笔者的学习工作经验,于管中窥得 nametuple 之一斑。

>
pythonista

前言

极客大赛是我司举办的一个内部的挑战比赛,大致的内容就是拟定一道比赛题目,然后根据最后的完成度进行得分排名。比赛的时间为一天,大抵就是上班到下班这么长的时间。

今年的题目是完成一个票据识别的 app。核心的模块是票据的扫描、识别和后端的存储、统计功能。衍生的加分项就很多了,测试覆盖率、界面设计等等,差不多就是软件的综合完成度、用户体验这些。

比赛