用js爬虫,使用到nodejs
例子中爬取的是中国新闻网时政频道的最新10条新闻的title和链接
事先准备:
1、先去node官网下载安装一下
2、推荐vs code,需要通过终端下载插件,不想的话用cmd小黑框做终端,记事本写代码也行。
开始
1、新建文件夹,注意该文件夹名字不能包含中文
2、代码:
const request = require('request');//
const iconv = require('iconv-lite');//设置编码格式
const Cheerio = require('cheerio');
//封装成函数
const requestPromise = (url) =>{
return new Promise((resolve, reject) =>{
//先取消原有的编码格式
request(url, {encoding:null},function (error, response, body) {
if(response.statusCode == 200){
//如果原网页编码格式有问题,可以转成ubt8格式的,该括号内utf-8为原网页编码格式(演示使用)
const bufs = iconv.decode(body, 'utf-8');
const html = bufs.toString('utf-8');//转成utf-8
// console.log(html);
resolve(html);
}
else{
reject(error);
}
});
})
}
const url = 'https://www.chinanews.com.cn/china/'; //.news_list_ulbox ul li div div div:nth-child(1) em a
requestPromise(url).then(res => {
const $ = Cheerio.load(res);//成功后用cheerio加载
$('.news_list_ulbox ul li div div div:nth-child(1) em a').each((i, item) => {
console.log($(item).text());
console.log('https://www.chinanews.com.cn/'+$(item).attr('href'))
});
});
注:其中nth-child可参考nth-child和nth-of-type的区别,为当前选中的元素(div)下的同级
子元素的第n个元素,其中非div类型也参与排序,nth-of-type则非div类型不参与排序
3、以下操作在vs code的终端,或者cmd切换到文件夹目录下执行都可
先初始化一下项目,运行后文件夹出现一个package.json文件
npm init -y
安装request
、iconv-lite
、cheerio
等插件
npm install request --save
npm install iconv-lite --save
npm install cheerio --save
安装完成后package.json文件内容
4、node 文件名
运行
这是运行成功图片,包含网址url被屏蔽了。。
总结
其实就是request获取页面的html元素 + cheerio分析html,来获取一些固定的标签的内容或者标签的url等值。
如何将爬虫获得的数据自动部署在自己的动态网页中?
懒得出来了,思路如下:
简单点可以通过node来连接数据库,将爬取的数据存入数据库中但是不能实时获取。。
可以通过bat来设置每秒用node运行一次js文件,下面代码保存为bat格式
@echo off
:loop
node js文件名
call :delay 1000
goto loop
:delay
echo WScript.Sleep %1>delay.vbs
CScript //B delay.vbs
del delay.vbs
然后网页获取数据库的数据,就行了
(但还是推荐直接py或者java爬虫,然后直接写入动态网页里面)
用js这样子获取得有个前提:有个云服务器(不过好像部署网页都得有一个?)
实测这样运行的话其实也占不了多少云服务器的资源
另:若是Linux系统
bat文件为
for((i=0;i<10;))
do
sleep 2
node news_china.js
done
然后用nohup挂起,防止关闭终端后杀死进程nohup bat文件路径 &
nohup命令使用