爬虫,大多人对于爬虫的理解都停留在使用后端语言如Python写的爬虫。但是实际上,使用客户端JavaScript有诸多后端爬虫所无法拥有的优势:
可以方便的分享给其他人用,只要对方电脑里有浏览器
由于跑在客户端,几乎可以无视对方网站的反爬虫机制
可以拥有完善的UI,无开发基础的小白也可以随意使用
1、爬虫相关的包
(1)处理get post put delete head 请求 轻量接http请求库,模仿浏览器登陆
const request = require('superagent');
(2)加载html
const cheerio = require('cheerio');
(3)加载文件系统模块 将数据存到一个文件中的时候会用到
const fs = require('fs'); fs.writeFile('saveFiles/zybl.txt', content, (error1) => { // 将文件存起来文件路径要存的内容错误 if (error1) throw error1; // console.log(' text save '); });
(4)将文件存为xlse
const fs = require('graceful-fs');
新建xlsx文件
const writeStream = fs.createWriteStream('saveFiles/trader.xlsx');
向slsx里面写入内容
writeStream.write(title);
(5)异步处理
const Promise = require('bluebird');
(6)一个高层次的浏览器自动化图书馆 先要安装phantomjs 然后在装nightmare
const Nightmare = require('nightmare');
(7)const co = require('co');
2、爬虫代码
'use strict'; const co = require('co'); const fs = require('fs'); const Nightmare = require('nightmare'); // 可视化的浏览器 const url = 'http://sports.qq.com/isocce/'; const onError = function(err) { console.log(err); }; const getHtml = function(pageUrl) { const pageScraper = new Nightmare(); // 打开浏览器 let content = null; return co(function * run() { yield pageScraper.goto(pageUrl.url).wait(); console.log('222222' + pageUrl.url); content = yield pageScraper.evaluate(() = >{ const temp = document.querySelector('body').innerHTML; return temp; }); console.log('子页面链接'); console.dir(content); yield fs.writeFile('../../saveFiles/' + pageUrl.title + '.html', content, (err) = >{ console.log('存文件.......'); if (err) return console.log(err); return console.log('Save pageUrl content to ' + pageUrl.title + '.html'); }); }); }; co(function * run() { const scraper = new Nightmare({ show: true }); // 打开一个可视化的浏览器 let counter = 0; // let next = null; let links = []; yield scraper.goto(url) // 跳转的地址 .wait(); // .click('#feed-laliga > a'); for (let i = 0; i < 5; i++) { yield scraper.wait(2000).click('#feed-laliga > a'); } links = yield scraper.evaluate(() = >{ const temp = document.querySelectorAll('#feed-laliga h3 > a'); const list = []; for (const each of temp) { console.log('each'); console.log(each); list.push({ title: each.innerText, url: each.href, }); } return list; }); // 在这里 加载更多 console.log('这里'); console.dir(links); for (const link of links) { if (link !== null && link.url !== 'javascript:void(0)') { counter += 1; setTimeout(() = >{ getHtml(link); }, counter * links.length * 250); } } yield scraper.end(); }). catch(onError);
网友评论文明上网理性发言 已有0人参与
发表评论: