• UID12
  • 登录2016-06-14
  • 粉丝112
  • 关注50
  • 发帖1415
  • 主页
  • 金币8548枚
社区居民
最爱沙发
忠实会员
喜欢达人
原创写手
极分享 发布于2015-10-30 12:10
3/12711

基于Node.js的强大爬虫,能直接发布抓取的文章哦

楼层直达
网站「看知乎」后台爬虫的源码,使用node.js编写。


环境配置

1)搞一台服务器,什么linux都行,我用的是CentOS 6.5;

2)装个mysql数据库,5.5或5.6均可,图省事可以直接用lnmp或lamp来装,回头还能直接在浏览器看日志;

3)先安个node.js环境,我用的是0.12.7,更靠后的版本没试过;

4)执行npm -g install forever,安装forever好让爬虫在后台跑;

5)把所有代码整到本地(整=git clone);

6)在项目目录下执行npm install安装依赖库;

7)在项目目录下创建json和avatar两个空文件夹;

8)建立一个空mysql数据库和一个有完整权限的用户,先后执行代码里的setup.sql和startusers.sql,创建数据库结构并导入初始种子用户;

9)编辑config.js,标明(必须)的配置项必须填写或修改,其余项可以暂时不改:
exports.jsonPath = "./json/";//生成json文件的路径
exports.avatarPath = "./avatar/";//保存头像文件的路径
exports.dbconfig = {
    host: 'localhost',//数据库服务器(必须)
    user: 'dbuser',//数据库用户名(必须)
    password: 'dbpassword',//数据库密码(必须)
    database: 'dbname',//数据库名(必须)
    port: 3306,//数据库服务器端口
    poolSize: 20,
    acquireTimeout: 30000
};
    
exports.urlpre = "http://www.zhihu.com/";//知乎网址
exports.urlzhuanlanpre = "http://zhuanlan.zhihu.com/";//知乎专栏网址
    
exports.WPurl = "www.xxx.com";//要发布文章的wordpress网站地址
exports.WPusername = "publishuser";//发布文章的用户名
exports.WPpassword = "publishpassword";//发布文章用户的密码
exports.WPurlavatarpre = "http://www.xxx.com/avatar/";//发布文章中替代原始头像的url地址
    
exports.mailservice = "QQ";//邮件通知服务类型,也可以用Gmail,前提是你访问得了Gmail(必须)
exports.mailuser = "12345@qq.com";//邮箱用户名(必须)
exports.mailpass = "qqpassword";//邮箱密码(必须)
exports.mailfrom = "12345@qq.com";//发送邮件地址(必须,一般与用户名所属邮箱一致)
exports.mailto = "12345@qq.com";//接收通知邮件地址(必须)
保存,然后进入下一步。

爬虫用户

爬虫的原理其实就是模拟一个真正的知乎用户在网站上点来点去并收集数据,所以我们需要有一个真正的知乎用户。 为了测试可以用你自己的账号,但从长远着想,还是专门注册个小号吧,一个就够,目前的爬虫也只支持一个。 我们的模拟过程不必像真的用户那样从首页登录,而是直接借用cookie值:

注册激活登录之后,进入自己的主页,使用任何有开发者模式或查看cookie插件的浏览器,打开知乎中自己的cookie。 可能有很复杂的一大串,但我们只需要其中一部分,即「z_c0」。 复制你自己cookie中的z_c0部分,连等号、引号、分号都不要落下,最后格式大致是这样的:
z_c0="LA8kJIJFdDSOA883wkUGJIRE8jVNKSOQfB9430=|1420113988|a6ea18bc1b23ea469e3b5fb2e33c2828439cb";
在mysql数据库的cookies表中插入一行记录,其中各字段值分别为:
  • email:爬虫用户的登录邮箱
  • password:爬虫用户的密码
  • name:爬虫用户名
  • hash:爬虫用户的hash(每个用户不可修改的唯一标识,其实这里用不到,可以暂时留空)
  • cookie:刚才你复制的cookie
然后就可以正式开始运行了。如果cookie失效或用户被封,直接修改这行记录的cookie字段即可。

运行

推荐用forever来执行,这样不仅方便后台运行和记录日志,还能在崩溃后自动重启。 示例:
forever -l /var/www/log.txt index.js
其中-l后的地址就是记录日志的地方,如果放在web服务器目录下,就能在浏览器里通过http://www.xxx.com/log.txt 来直接查看日志了。在index.js后面加参数(用空格分隔)可以执行不同的爬虫指令:
  1. -i 立即执行,如果不加此参数则默认在下一个指定时间执行,如每天凌晨0:05分;
  2. -ng 跳过抓取新用户阶段,即getnewuser;
  3. -ns 跳过快照阶段,即usersnapshot;
  4. -nf 跳过生成数据文件阶段,即saveviewfile;
  5. -db 显示调试日志。
各阶段的功能在下一节介绍。为了方便运行,可以将这行命令写成sh脚本,例如:
#!/bin/bash
cd /usr/zhihuspider
rm -f /var/www/log.txt
forever -l /var/www/log.txt start index.js $*
具体路径请替换成自己的。这样就能通过./zhihuspider.sh 加参数来开启爬虫了: 比如./zhihuspider.sh -i -ng -nf就是立即开始任务、跳过新用户和保存文件阶段。停止爬虫的方法是forever stopall(或stop序号)。

原理概述

看知乎爬虫的入口文件是index.js。它通过循环方式在每天指定时间执行爬虫任务。每天顺序执行的任务有三个,分别是:

1)getnewuser.js:通过当前库内用户关注者列表的对比,抓取新用户信息,依靠此机制可以自动将知乎上值得关注的新人纳入库中;

2)usersnapshot.js:循环抓取当前库内用户资料和答案列表,并以每日快照形式保存下来。

3)saveviewfile.js:根据最近一次快照内容,生成用户分析列表,并筛选出昨日、近日和历史精华答案发布到「看知乎」网站。

在以上三个任务执行完毕后,主线程会每隔几分钟刷新一次知乎首页,验证当前cookie是否仍然有效,如果失效(跳到未登录页),则会给指定邮箱发送通知邮件,提醒及时更换cookie。 更换cookie的方法和初始化时一致,只需手工登录一次然后取出cookie值就行了。如果对具体代码实现感兴趣可以仔细看里面的注释,调整一些配置,甚至尝试自己重构整个爬虫。

Tips

1)getnewuser的原理是通过对比前后两天快照中用户的关注数量进行指定抓取,所以必须有了至少两次快照之后才能开始,之前就算执行也会自动跳过。

2)快照抓到一半是可以恢复的。如果程序出错崩溃,用forever stop停止它,然后加上参数-i -ng,立即执行并跳过新用户阶段就能从刚才抓到一半的快照继续下去了。

3)不要轻易增加快照抓取时的(伪)线程数,即usersnapshots中的maxthreadcount属性。线程太多会导致429错误,同时抓取回来的大量数据可能会来不及写入数据库造成内存溢出。所以,除非你的数据库搭在SSD上,线程不要超过10个。

4)saveviewfile生成分析结果的工作需要至少近7天的快照才能进行,如果快照内容少于7天会报错并跳过。此前的分析工作可以手动查询数据库进行。

5)考虑到大多数人并不需要复制一个「看知乎」,已经将自动发布wordpress文章函数入口注释掉了。如果你搭建好了wordpress,记得开启xmlrpc,然后设置一个专门用于发布文章的用户,在config.js中配置相应参数并将saveviewfile中的相关代码解除注释。

6)由于知乎对头像做了防盗链处理,我们在抓取用户信息时一并也将头像获取了下来,保存在本地,发布文章时使用的是本地头像地址。需要在http服务器中将url路径指向保存头像的文件夹,或者将保存头像的文件夹直接放到网站目录下。

7)代码可能不太容易读懂。除了node.js的回调结构本身就较混乱之外,还有一部分原因是最初写程序时我刚刚开始接触node.js,有很多不熟悉的地方导致结构混乱没有来得及改正;另一部分是在多次缝缝补补中累加了许多丑陋的判断条件和重试规则,如果全部去掉,代码量可能会下降三分之二。但这是没有办法的事,为了保障一个系统的稳定运行,必须加入这些。

8)本爬虫源码基于WTFPL协议,不对修改和发布做任何限制。

9)苏莉安很懒,不会及时解答问题和更新版本,作为开发者应该尽量自己解决。

源代码:




原文:https://github.com/atonasting/zhihuspider
作者: https://www.zhihu.com/people/aton
        附件名称/大小 下载 更新 附加说明
zhihuspider-master.zip (281KB)  16 2015-10-30 12:17

0人打赏
  • UID15
  • 登录2017-07-17
  • 粉丝48
  • 关注40
  • 发帖447
  • 主页
  • 金币1848枚
社区居民
喜欢达人
原创写手
janking 发布于2016-01-12 12:03
沙发F
原地址:https://github.com/atonasting/zhihuspider
作者: https://www.zhihu.com/people/aton
  • UID4697
  • 登录2016-01-22
  • 粉丝0
  • 关注0
  • 发帖5
  • 主页
  • 金币14枚
社区居民
零点 发布于2016-01-22 17:41
板凳F
顶一下
  • UID4183
  • 登录2016-07-02
  • 粉丝1
  • 关注1
  • 发帖10
  • 主页http://www.cllgeek.com/
  • 金币53枚
社区居民
cllgeek 发布于2016-01-27 08:38
地板F
顶一个
http://www.cllgeek.com/
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 79139/378   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 45196/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 44909/0   Python爬虫:常用浏览器的useragent

  • 41330/260   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 38619/145   省时省力的Android组件群来了,非常棒的原型参考

  • 29983/142   2016抢红包软件及源码

  • 29263/2   超全!整理常用的iOS第三方资源

  • 29251/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 24271/160   Android版类似UC浏览器:非常赞,产品级的源码

  • 22850/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22545/25   Android工程师面试题大全

  • 22452/27   2016程序员跳槽全攻略

  • 21936/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20889/20   码魂:程序员的牛B漫画

  • 19016/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 19010/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 18996/10   2016年最全的Android面试考题+答案 精编版

  • 18869/42   一个绚丽的loading动效分析与实现!

  • 18735/3   吐槽那些程序员的搞笑牛逼注释

  • 17610/1   iOS 动画总结

  • 17602/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17455/82   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 17415/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 17123/23   个人收集的Android 各类功能源代码

  • 16651/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16587/21   Android福利第三波【Android电子书】

  • 16402/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16387/10   女程序员的梦,众网友的神回复

  • 16361/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 16323/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16239/0   iOS中文版资源库,非常全

  • 16082/11   年会上现场review代码是怎么样的体验!

  • 16021/23   珍藏多年的素材,灵感搜寻网站

  • 15491/18   65条最常用正则表达式,你要的都在这里了

  • 14834/15   基于Android支付宝支付设计和开发方案

  • 14230/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 14164/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13927/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13704/0   GitHub iOS 库和框架Top100 

  • 13627/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 13550/7   用程序员的姿势抢过年的火车票

  • 13508/7   一张图搞定iOS学习路线,非常全面

  • 13120/10   成为Java顶尖程序员 ,看这11本书就够了

  • 13087/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12983/18   一张图搞定Android学习路线,非常全面

  • 12793/29   【持续更新中】Android福利贴(一):资料源码

  • 12711/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12456/4   46 个非常有用的 PHP 代码片段

  • 11993/3   即时通信第三方库

  • 11432/8   流媒体视频直播方案

  • 11361/18   八个最优秀的Android Studio插件

  • 11239/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 11033/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10996/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10930/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10208/6   开箱即用!Android四款系统架构工具

  • 10011/10   十大技巧快速提升Android应用开发性能

  • 9952/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9899/1   Android性能优化视频,文档以及工具

  • 9763/3   一张图看清Linux 内核运行原理

  • 返回顶部