网易客户端爬虫编写思路
缘起
几年前还在读大学时就接触过 python,当时走马观花的浏览了下,没有动手编写代码,当然也说不上是学过 python。
今年年初,对 web 方面的开发非常感兴趣,遂决定深入学习下 python,并用 python 做一些真实的项目。经过个把月的密集学习,通过开发了一个磁链搜索网站(爱下片,后因为成人内容实在太多^_^,遂关闭了网站)算是对 python 和 tornado 都有了一些理解。并顺利的找到一份做 python 开发的工作,成功的从 服务器 C 程序员转变为 python 开发猿。
人生苦短,我用 python 果然不是吹的,越用越高兴,轮子太多了,拿过来就可以用。
我一直喜欢看网易的轻松一刻,在安卓手机客户端上展示出来还是蛮好的,但是到了我的 ipad mini 上,网易的客户端对图片的处理就很扯淡了,必须要点击一下才能展示完全图片,再加上我喜欢在 web 上看这些内容,遂萌发了开发一个 web 网站来展示网易的轻松一刻等内容。
最终成果
先上最终的成果,一个展示网易客户端搞笑图片、文字的网站。
秋后网
爬虫
代码可以在 github 上下载, 163spider
让网易客户端里面展现的内容展现在我的网站中,那么我就需要抽取网易客户端的内容并保存在某个地方,这样才能在接下来的 web 程序中展现这些内容。
寻找 api
如何提取手机客户端里面的内容呢?
一般来说,这类手机 app 是要和服务器进行交互,从服务器获取内容,然后呈现出来,而按照目前的开发思路,一般都有固定的 api 可以调用。所以祭出我们的大杀器,fiddler。fiddler 是个好东西,真的是 http/https 嗅探利器。
关于如何配置 fiddler 来嗅探手机 app 上的内容,可以参考博客园的这篇文章,我这里就不赘述了。
通过观察提取出来的内容,我们就可以找到了类似于下面的链接:
http://c.m.163.com/nc/article/list/T1350383429665/0-20.htmlhttp://c.m.163.com/nc/article/AC5QK4K400964JJM/full.html
上面链接张,第一个链接就是内容列表,第二链接就是具体的某篇文章的内容了。
这个是如何找到的呢?无他,唯观察尔。
存储表设计
通过分析上面得到的链接,我们就可以开始编写我们的程序了。
程序的编写其实很简单,只需要下载列表,检查各篇文章是否已经下载,如果没下载就下载回来;如果已经下载,就跳过。
下面是存储内容的数据库表的设计(mysql)。
drop table if exists wangyi;
create table wangyi(
id int not null auto_increment,
item_type varchar(32) not null, -- 栏目类型,比如 qingsongyike
title varchar(512) not null,
url varchar(512) not null,
docid varchar(32) not null,
cover_img varchar(512),
ptime varchar(32) not null,
today char(10) not null,
body text not null,
open_times int not null default 0, -- 本页被浏览的次数,默认是 0
KEY(id),
KEY(item_type),
CONSTRAINT docid_uniq PRIMARY KEY(item_type, docid)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
下面这个表是用来控制第一次运行的初始化运行控制表。
drop table if exists run_control;
create table run_control(
id int not null auto_increment,
item varchar(32) not null, -- 栏目类型
total int not null,
one_page int not null, -- 记录一次请求多少条记录回来
last_run timestamp default current_timestamp on update current_timestamp,
KEY(id),
PRIMARY KEY(item)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
爬虫编写及内容抽取
爬虫的编写过程是枯燥的,我的思路都是先观察,后测试验证,再编写程序。
- 首先是下载列表页面并提取出来标识各个页面的 docid;
- 根据 docid 去数据库检查是否已经有内容,如果有,就跳过不下载,如果没有就下载回来;
3、分析下载回来的文章页面内容,提取出来标题、封面,重新修改正文内容,这里取了个巧,直接把正文中的 img 标签替换成真的 img 的 url 就直接存储在数据库中了,简化了处理过程;
4、做成定时任务,定时检查是否有新内容。
总的来说,就是根据上面的思路,所以有了提取网易客户端内容的爬虫,代码可在 github 上看到,写的较挫,见笑了。
web 页面展示
我选择的是 tornado 来开发 web 程序展示数据内容,开发的过程也是一个再学习的过程,通过这次的开发,对 url 路由,代码复用,cookies 的理解也有了更进一步的了解。
总的来说,通过这个网站的开发,对 web 方面的知识多了解了一些,在我的下篇文章中,会详细的说说我使用 tornado 开发 web 的过程遇到问题以及解决这些问题的方法。

浙公网安备 33010602011771号