Writing

NuptLifeAnalyzer札记(2)—— Crawlers

0x00 序

  长久的思考后,这个项目终于又重新开始了。我发现写一个较大的程序的时候,很容易迷失在细节的设计中,我想着前端要用什么,会踩什么坑,后端得怎么设计才安全、才高效。经过在公司这么久的实习,慢慢学会了,从整体去思考,可以先让一个最简单的框架跑起来,或者先完成其中一个独立的部分。对于我们这个项目,我决定先搞定它的核心部分–爬虫。

0x01 考虑

学校系统的爬虫,并不像其它博客或者门户网站的爬虫,它没有一个特定的内容组成结构。所以,并没有使用Scrapy这种高级的框架,也没有必要。
大致的流程,就是:先找缓存,再找数据库,不完整或者没有,再去爬取,然后存到数据库。
结构要尽可能清晰;遵循Do Not Repeat Yourself的设计原则,最大化重用代码;容错性好。

0x02 细节

下面就是一个页面一个页面解析了,里面有一些坑,比如:正方有些页面是会检查RefererHost的,这些都可以用Burp抓包知道。所以我写了个req()函数,来包装requests,尽可能优雅地处理请求错误,也是在实习中学习到的方法。

logger是使用了Python自带的RotatingHandler来管理压缩日志。

相对于lxml,我更喜欢BeautifulSoup的API,所以我使用了bs4来解析页面,但是使用了lxml的引擎:

1
doc = BeautifulSoup(content, 'lxml')

这样既保持了解析速度,又保持了开发速度,非常棒的一个库。

0x03 问题

  • 爬虫最大的问题就是,如果拿个页面更改,就不能正常使用了。对于个人信息页面的解析,是通过dom元素的id来查找的。
  • 不同数据应该设置不同的权重,这样即使中间哪个请求无法正常返回,最前端也可以相应地灵活地去展示我们获取到的信息。

代码已经放在
Github上了,希望之后有同学可以继续维护改进它。