js 爬虫抓取网页数据(就是用户爬虫的原理及原理模拟一个的配置介绍)
优采云 发布时间: 2022-04-04 18:01js 爬虫抓取网页数据(就是用户爬虫的原理及原理模拟一个的配置介绍)
一、环境配置
1)做一个服务器,任何linux都可以,我用CentOS 6.5;
2)安装一个mysql数据库,5.5或者5.6都可以,可以直接用lnmp或者lamp安装比较省事,也可以直接查看日志返回时浏览器;
3)先搭建一个node.js环境,我用的是0.12.7,后面的版本没试过;
4)执行npm -g install forever,永远安装,让爬虫后台运行;
5)将所有代码集成到本地(integration=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 = "https://www.jb51.net/";//脚本网址
exports.urlzhuanlanpre = "https://www.jb51.net/list/index_96.htm/";//脚本网址
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表中插入一行记录,其中字段值为:
然后就可以正式开始运行了。如果cookie无效或者用户被屏蔽,可以直接修改该行记录的cookie字段。
三、跑
推荐使用forever来执行,不仅方便后台操作和记录,而且崩溃后自动重启。例子:
forever -l /var/www/log.txt index.js
-l 后面的地址是记录日志的地方。如果放在web服务器目录下,可以直接在浏览器中查看日志。在 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 $*
请用您自己的替换具体路径。这样就可以通过在./知乎spider.sh中添加参数来启动爬虫:例如./知乎spider.sh -i -ng -nf 会立即启动任务,跳过新用户并保存文件阶段。停止爬虫的方式是forever stopall(或停止序号)。
四、原理概述
见知乎爬虫的入口文件是index.js。它每天在指定时间循环执行爬虫任务。每天要按顺序执行三项任务,即:
1)getnewuser.js:通过对比当前库中的用户关注列表获取新用户信息,并依靠该机制自动将知乎上值得关注的新人纳入库;
2)usersnapshot.js:循环抓取当前库中的用户数据和答案列表,并保存为每日快照。
3)saveviewfile.js:根据最新快照的内容,生成用户分析列表,过滤出昨天、近期和历史精华答案发布到“见知乎”网站@ >。
以上三项任务完成后,主线程每隔几分钟就会刷新一次知乎主页,验证当前cookie是否还有效。,提醒您及时更换cookies。替换cookie的方法和初始化一样,只需要手动登录一次,然后取出cookie值即可。如果对具体的代码实现感兴趣,可以仔细阅读注释,调整一些配置,甚至尝试自己重构整个爬虫。
提示
1)getnewuser 的原理是通过比较前后两天快照中用户的注意力数量来指定抓包,所以必须至少在两个快照之后才开始,甚至会自动跳过如果之前执行过。
2)可以中途恢复快照。如果程序因错误而崩溃,用forever stop停止它,然后添加参数-i -ng,立即执行并跳过新用户阶段从刚刚捕获的快照中途继续。
3)抓拍快照时不要轻易增加(伪)线程数,即usersnapshots中的maxthreadcount属性。线程过多会导致429错误,同时捕获的大量数据可能来不及写入数据库,造成内存溢出。因此,除非您的数据库在 SSD 上,否则不要使用超过 10 个线程。
4)从 saveviewfile 生成分析结果的工作需要至少 7 天的快照。如果快照内容少于 7 天,则会报告错误并跳过错误。以前的分析工作可以通过查询数据库手动执行。
5)考虑到大部分人不需要复制一个“look知乎”,自动发布wordpress文章功能入口已经被注释掉了。如果你搭建过wordpress,记得打开xmlrpc,然后设置一个专门发布文章的用户,在config.js中配置相应参数,在saveviewfile中取消注释相关代码。
6)因为知乎对头像做了防盗链处理,所以我们在抓取用户信息的时候也拿到了头像,保存在本地。在发布 文章 时,我们使用了本地头像地址。需要将url路径指向http服务器中保存头像的文件夹,或者将保存头像的文件夹直接放到网站目录下。
7)代码可能不容易阅读。除了node.js本身的回调结构混乱之外,部分原因是我刚开始写程序的时候才开始接触node.js,有很多不熟悉的地方导致结构混乱并且没有来得及更正;另一部分是很多时候拼凑起来积累了很多丑陋的判断条件和重试规则。如果全部删除,代码量可能会减少三分之二。但是没有办法做到这一点。为了保证一个系统的稳定运行,这些都是必须要添加的。
8)本爬虫源码基于WTFPL协议,对修改和分发不做任何限制。