var https = require('https');
var iconv = require('iconv-lite');
var cheerio = require('cheerio');
var mysql = require('mysql');var text_url = 'https://www.zhihu.com/question/36260262/answer/67686600';
var baseurl = 'https://baike.baidu.com';// 创建连接
var connection = mysql.createConnection({host     : 'localhost',user     : 'root',password : '12345678',database : 'testmysql',useConnectionPooling: true
});var options = {// proxy:'1.197.16.3',method: 'GET',headers: {"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',// "cookie": '__cfduid=dd8936888a6f1979387fac18b0e7cb1781563936793; PHPSESSID=g66j025p81urea4b35ku32alv4; Hm_lvt_2d527f7b5c8cdde7b45e368a84b53fe8=1564483203,1564484204,1564484208,1564484213; Hm_lpvt_2d527f7b5c8cdde7b45e368a84b53fe8=1565190149'}
};/**** @param {*} urls* @param { 通过传入的函数对数据返回之前进行处理 } fn*/
function batchFetch(urls) {return urls.map(url => {return new Promise(function (resolve, reject) {https.get(url, options, (res)=>{var length=0;var arr=[];res.on("data",function(chunk){arr.push(chunk);length+=chunk.length;});res.on('end', ()=>{var name = '';var catee = '';var data=Buffer.concat(arr,length);var change_data = iconv.decode(data,'utf-8');var $ = cheerio.load(change_data.toString());var cur_cate = $('.lemmaWgt-lemmaTitle-title');if(cur_cate != undefined){name = $(cur_cate).find('h1').text();catee = $(cur_cate).find('h2').text();}var contentsum = '';if($('.lemma-summary').text() != undefined){contentsum = $('.lemma-summary').text();}var pic = '';if($('.side-content .summary-pic a').find('img').attr('src') != undefined){pic = $('.side-content .summary-pic a').find('img').attr('src');// console.log(pic);}// console.log('suc', 1)// console.log({'name': name, 'class': catee, 'summary': contentsum})resolve({'name': name, 'class': catee, 'image': pic, 'summary': contentsum});})}).on('error', (e)=>{resolve({'name': '', 'class': '', 'summary': ''});});});})
}function reqinfo(url){return new Promise(function (resolve, reject) {setTimeout(()=>{reject(0)}, 5000);https.get(url, options,(res) => {// console.log(res.headers.location.slice(0,5), res.headers.location)if(res.headers.location.slice(0,4) == 'http'){reject(0);}else {setTimeout(()=>{reject(0)}, 5000);https.get('https:' + res.headers.location, options, (res)=>{setTimeout(()=>{reject(0)}, 5000);https.get(baseurl + res.headers.location, options, (res)=>{var length=0;var arr=[];var name = '';var catee = '';res.on("data",function(chunk){arr.push(chunk);length+=chunk.length;});res.on('end', ()=>{var urls = [];var result = [];var data=Buffer.concat(arr,length);var change_data = iconv.decode(data,'utf-8');// console.log(change_data);var $ = cheerio.load(change_data.toString());var cur_cate = $('.lemmaWgt-lemmaTitle-title');if(cur_cate != undefined){name = $(cur_cate).find('h1').text();catee = $(cur_cate).find('h2').text();}var contentsum = '';if($('.lemma-summary').text() != undefined){contentsum = $('.lemma-summary').text();}var pic = '';if($('.side-content .summary-pic a').find('img').attr('src') != undefined){pic = $('.side-content .summary-pic a').find('img').attr('src');// console.log(pic);}result.push({'name': name, 'class': catee, 'image': pic,'summary': contentsum});var cate = $('.cmn-clearfix .item');if(cate != undefined){cate.each((index, value)=>{var ccate = $(value).find('a').attr('href');if(ccate != undefined){// console.log(ccate)urls.push(baseurl + ccate)}});}if(urls.length !== 0){let promises = batchFetch(urls);// console.log('len', urls.length)Promise.all(promises).then(function (data) {// console.log('success', data.length)// 所有请求返回值for (let i of data){result.push(i);}resolve(result);}).catch(function (data) {// console.log('err', data);resolve(result);});// req_other(urls, 0, result, num);}else {resolve(result);}// console.log(result)})}).on('error', (e)=>{reject(0);})}).on('error', (e)=>{reject(0);})}}).on('error', (e)=>{reject(0);})})
}var errornum = 0;
var Bindex = 0;
function req_text(offindex) {console.log('index', offindex);var  sql = 'SELECT * from zhihuNum limit ' + offindex + ',1 ';
//查connection.query(sql,function (err, result) {if(err){console.log('[SELECT ERROR] - ',err.message);connection.end();return;}else {if (result.length !== 0){// console.log(result[0].name)var url = encodeURI(baseurl + '/search/word?word=' + result[0].name);// console.log(url)reqinfo(url).then(function (data) {var class_num = data.length;for (var item of data){var  addSql = 'INSERT INTO zhihuFinish(Id, class_num, num, name, class, image, summary) VALUES(?,?,?,?,?,?,?)';var  addSqlParams = [Bindex, class_num, result[0].num, item.name, item.class, item.image, item.summary];Bindex++;// 这个连接也是异步的connection.query(addSql, addSqlParams,function (err, result) {if(err){console.log('[INSERT ERROR] - ',err.message);}else {// console.log('success');// kindex++;}});}offindex++;if(offindex%10 === 0){setTimeout(()=>{req_text(offindex)}, 10000)}else {req_text(offindex);}},function (data) {offindex++;// console.log('e', data);if(offindex%100 === 0){setTimeout(()=>{req_text(offindex)}, 10000)}else {req_text(offindex);}})}else{connection.end();}}});
}connection.connect();
req_text(0);

遇到问题比较多。
1、在百度百科中搜索中文时,url中会多出一个数字。我找了页面中的js文件,没找到这个数字是怎么得来的(我曾经爬过谷歌翻译,谷歌翻译页面中有一个js,就是根据输入字符串得到一个tk值)。
所以最后我发现可以在响应头中得到这一个数字。
除此之外,url中的中文经过url编码后得到的字串和最后请求总的url也是不一样的,依然是从响应头中获得。
所以,一共经过了三层get请求才得到最终所需要的值。
2、本系列的第二篇讲过使用promise将异步变为同步,按照第二篇里讲过的内容,就会失去js异步的强大功能,所以可以使用到promise的all方法。本片文章中的batchFetch就是将传过去的url数组变为promise数组,然后使用promise.all方法异步执行。
3、经过百度查阅资料,js的请求限时是120s。我在运行该js文件过程中,经常遇到代码卡死,应该是请求过程中出错,导致一直等到120s结束才进行下一步。所以,我在promise中使用一个setTimeout,设置时间是5000ms,当5000ms过去,执行函数,改变reject值。

nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)五 对提到的关键字(书名或者电影名)去百度百科上爬取介绍相关推荐

  1. nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)一 爬取所有话题类型

    首先爬取话题广场所有话题. var cheerio = require('cheerio'); var iconv = require('iconv-lite'); var https= requir ...

  2. nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)六 在express中建立路由

    创建express的过程以及开启html引擎我就不赘述了. var express = require('express'); var router = express.Router(); var m ...

  3. nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)六 html

    使用的是express后台返回html. res.render('xxx(html名称)'); 有可能在浏览器里看到的是静态文件,是因为浏览器把它认为是文件格式,所以要设置头 res.set({'Co ...

  4. nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)四 存储提到的内容的次数

    var cheerio = require('cheerio'); var iconv = require('iconv-lite'); var https= require('https'); va ...

  5. 关于使用NodeJS+Express搭建服务器访问静态资源的一些填坑经验

    前言 NodeJs是一个能让前端开发工程师变成全栈工程师的神器.最近在搞一个私活,需要上传图片到服务器存储.按照以前的想法,是用Java写代码搭服务器.奈何,大学毕业后就一直在搞前端和安卓开发.Jav ...

  6. 虚拟服务器nodejs项目部署打包,nodejs+express搭建服务器及vue项目部署打包

    一.Express 1.Node.js 2.Express Express是一个保持最小规模的灵活的Node.js web应用程序开发框架,为web和移动应用程序提供一组强大的功能 安装: npm i ...

  7. nodejs+express搭建服务器

    1.Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能 ...

  8. Python 爬虫 :搜狗百科,爬取多个人名的属性表信息 pycharm selenium

    任务名称: 在搜狗百科上爬取一些人名的属性表信息 任务来源: 初学爬虫,牛刀小试 开发工具: PyCharm 开发团队: 213 开发人员: 小鞋带.小泽.阿烨 开发时间: 2019-12-15 20 ...

  9. NodeJs本地搭建服务器,模拟接口请求,获取json数据

    最近在学习Node.js,虽然就感觉学了点皮毛,感觉这个语言还不错,并且也会一步步慢慢的学着的,这里实现下NodeJs本地搭建服务器,模拟接口请求,获取json数据. 具体的使用我就不写了,这个博客写 ...

最新文章

  1. Datawhale组队学习周报(第005周)
  2. 国务院任命!清华、北航分别迎来新任副校长
  3. STL六大组件:分配器、容器、迭代器、算法、仿函数、适配器
  4. Java TCP/IP Socket 编程 笔记
  5. Python 3.2 beta 2 发布
  6. Java基础——Java NIO详解(二)
  7. Java主要处理哪些类型的异常_Java技术高效处理异常有哪些呢?
  8. 【超全指南】Java 8 中使用 Optional 处理 null 对象
  9. JVM调优总结(转载)
  10. LZJ流体质量计算机价格,LZJ-ⅢC型流体质量计算机技巧.doc
  11. Error response from daemon: Container 2c6d35b44a9862c63a6caf11a5622a33fe27979e12e51f9bd96f8dad98521c
  12. git 解决push报错:[rejected] master -> master (fetch first) error: failed to push some refs to
  13. MYSQL的简单查询
  14. 24V-2A矿用本安电源设计
  15. Chrome控制台打印输出彩色调试信息
  16. 抖音养号需要注意什么?
  17. SAP 项目实施阶段全过程
  18. vue使用阿里云矢量图
  19. 网页解析之Jsoup
  20. 在线画图工具-chord diagram和弦图

热门文章

  1. C语言学习笔记---查漏补缺
  2. 汇聚全球200多颗在轨遥感卫星,今日影像,今日推送!
  3. JavaEE框架类——监听器(观察者模式)和Servlet技术的监听器session沌化与活化技术
  4. web前端大作业 (仿英雄联盟网站制作HTML+CSS+JavaScript) 学生dreamweaver网页设计作业
  5. IntelliJ IDEA Remote Development 使用体验
  6. SUST暑期集训题解(可持久化数据结构)
  7. ioa的app开发和android区别,ioA 7000
  8. C语言如何打开txt文件
  9. lara with tp
  10. 19显示文字的区位码