老方最近有个任务,是抓取某网站内容。网络爬虫是python的拿手好戏,scrapy项目广为流传就是明证。
因为该任务只分析一个特定的网页,所以选择自已码,码完对过程中的一些要点记个笔记,主要包括:
- 通过图形验证码,OCR不花钱
- 正则表达式解析网页,多行、多分组
- 依赖包安装避坑
以下笔记展开
1. 不花钱的OCR如何选择
也看了百度的paddle-ocr,最终还是选了pytesseract。
- 识别率基本过关:对于简单的图形验证码,略做变换处理,识别率可以达到80%。20%会出错,通过多取几次图片,总归能蒙混过关。
-
依赖多,但尚可搞定:pytesseract本身是个挺大的安装包,再加图片处理用的opencv、显示图片做调试的matplotlib,各自又带了一串依赖,整个site-packages目录看起来臃肿不堪。好在网上各类教程详尽,安装过程还算顺利。相比之下,paddle-ocr的宣传资料各种炫酷,但教程看得人望而却步
一堆的依赖
2. 正则表达式解析网页的坑
爬下来的网页要提取内容,这算是爬虫的基本操作吧。
一开始我用的是BeautifulSoup,可以直接在文本中按照标签、class等检索元素,然后再做属性的提取。但发现这货不支持xpath,所以要直接取特定的对象并不方便,往往要分成好几步。
改用lxml,xpath定位提取指哪打哪儿,得心应手。不过刚巧标签里面有个内容是/分隔的数字,还得再写代码拆分一下。
因为提取的内容不算复杂,re又是python的内置库,所以想想就干脆弃了两个成熟的三方库,自己用正则表达式来试试。下面是取表格行的代码:
re.findall('<TR.*?>(.*?<td.*?)</TR>', html, flags=re.MULTILINE|re.DOTALL)
貌似有点复杂。python官网关于正则的howto文档还是很详尽的,主要有几个问题要注意:
- 换行处理:正则默认处理单行文本,而html里面的一对标签之间的内容往往有换行,比如<tr></tr>之间有好几个单元格,一般都会有好几个换行(newline),查找函数末尾要加上一个MULTILINE。"."这个符号能够匹配所有的字符,但默认不包括换行符,所以要加一个DOTALL。
- 防止贪婪匹配:比如<TR.?>,在通配符后加上?,不然会一口气找到最后一个>符号为止。
🌹正则表达式,老方个人比较偏爱,因为在很多场合下,语法都是兼容的,可谓:学习一次、走遍天下。比如word办公软件可以拿来查找替换、前端可以拿来校验手机号码、写代码的IDE中也可以精确替换。
依赖包安装
首先要升级pip。
比如pytesseract的python库最少得pip9.3,而python3.8自带的版本低了,直接安装会抛出一堆的错误。
升级pip,得用easy_install -U pip,通过pip自已来升级总是报错。
用国内的镜像
这一点我每次都会忘记,国内的镜像速度快很多,毕竟这些依赖包有几百M。
pip install pytesseract -i https://mirrors.aliyun.com/pypi/simple/
。。。
opencv有四个版本,我不需要GUI的功能,所以选了headless的版本,尺寸小一点。