今天接到一个小小的需求,又是和采集相关的,我都要烦死了,采集这东西写得都要腻了。
不过和以前的那些采集有点区别,不再是采集文章了,而是开始采集论坛的帖子。说实话我觉得采集论坛比较简单,因为论坛都是php的页面,页面组织布局一般不会怎么变,而新闻站基本都是cms系统生成的html静态页,静态的页面就有太多可能性了,而且不排除有的编辑太敬业把每个页面都做得不一样。
采集源站是http://qq.100bt.com,和我最近做的zeze是同一类型的东西,而且突然发现zeze竟然借鉴了很多这个网站的元素。废话不多说,这次采集主要是为了了解哪些资讯比较受欢迎,然后我们就可以有针对性的来推广我们的内容,看起来像是在收集竞争对手的信息而实现知己知彼百战不殆,这样的活我喜欢。这个叫作百田圈圈的网站似乎运营得不错,里面积累了差不多百万的帖子,用户似乎也很活跃。
其实要获得的信息不多,在我设计的数据库结构中包含以下字段:
tid: 帖子的id,用来作为表的主键 url: 帖子的url,便于访问 subject: 帖子标题 author_name: 楼主名,有这个东西可以用来分析哪些用户比较活跃 replies: 帖子的回复数,这个字段是用来衡量一个帖子的受欢迎程度的最重要指标 view: 帖子被查看的次数 pubdate: 发帖时间 maxpage: 帖子页数,因为有的帖子是回复楼层的,所以如果一个帖子分了很多页说明这个帖子内容丰富 category: 帖子所属分类,用来来分析哪些大类的话题比较火
没有数据库直接操作真是麻烦,上面这些数据都得分析网页去获取,而且不是在同一个页面,需求挺麻烦的但是不难。
代码传到github上面了,以前写的那些采集都是用脚本的形式来实现的,这回尝试了一下自己构造一个采集类,这时候才发现对于python的面向对象特性用的太少了,在设计类的结构,接口上面都很不熟练,现在的代码设计在python大牛严重肯定是很小儿科的,以后要多学习OOP的编程思想,不能总是一个函数一个函数这样顺序的执行下来。
写这么一个简单的任务竟然还花了我一天的时间,看来编码能力还是有待加强,经过总结之后发现问题主要存在三方面:
- 对mysql的查询语句不熟悉,因为我把tid设置为了主键,所以不能重复插入,我想要实现
insert into on duplicate key continue
的功能,找了半天只看到了insert into on duplicate key update
的语法,但是后者不是我想要的,因为使用的是python的MySQLdb
来驱动mysql的,这东西对于原生的sql语句支持不是很好,不过幸好最后我找到了insert ignore into
这种语句,一下解决了问题,虽然MySQLdb
在execute
的时候会有警告,但是毕竟实现了功能。 MySQLdb
这个库的使用不熟悉,在用它来执行sql语句的时候出现了很多问题,看来有时间得专门总结一下python驱动mysql的方法。
今晚下班回的路上突然发现代码少写了很多异常检测,比如说没有判断网络链接失败,页面匹配为空等,真希望程序能够按照我设想的执行,等明天早上到了公司6张表都给我装得满满的,明天到了公司 再去修改代码了。