当前位置:   article > 正文

node crawler简单使用_node-crawler

node-crawler

需求:获取某一个网站,商品的名称+价格;

以下按京东商品列表URL进行测试,

1、搭建node环境,此node安装不多介绍

2、node爬虫工具,安装 npm install crawler

3、创建index.js,直接贴代码

  1. /**
  2. * 此js主要是通过PATH_URL,根据源码中的html风格,根据特定的标签获取HTML中的href,写入JSON文件中
  3. */
  4. const fs = require('fs');
  5. const Crawler = require('crawler');
  6. const _ = require('lodash')
  7. //在爬相关图片信息时,需要得到指定的URL:https://search.jd.com,
  8. const PATH_URL = 'https://search.jd.com/Search?keyword=%E5%8D%8E%E4%B8%BA%E6%89%8B%E6%9C%BA&enc=utf-8&suggest=5.def.0.base&wq=huawie%E6%89%8B%E6%9C%BA&pvid=b314d64bbf02446187feba4eed246377';
  9. // 为了console输出而定义的变量
  10. let cnt = 0;
  11. // 查找到的HTML地址
  12. let listDataRes = []
  13. // 爬虫抓取
  14. const c = new Crawler({
  15. maxConnections: 10,
  16. retries: 3, // 失败重连3
  17. callback: function (error, res, done) {
  18. if (error) {
  19. console.log(error)
  20. } else {
  21. // 注:抓取图片的规则,需要自己定义
  22. const $ = res.$;
  23. console.log(' ------------>title: ', $('title').text())
  24. const dataList = $('.goods-list-v2 li');
  25. dataList.each((index, dataItem) => {
  26. let dataRes = {};
  27. const idKey = dataItem.attribs['data-sku']
  28. // 获取li标签下的标签集合
  29. const firstChildren = dataItem.children
  30. firstChildren.forEach(twoItem => {
  31. // 得到相关div标签
  32. if (twoItem.type === 'tag' && twoItem.name === 'div') {
  33. const twoChildren = twoItem.children
  34. twoChildren.forEach(threeItem => {
  35. // -------> 获取商品价格
  36. if (threeItem.type === 'tag' && threeItem.name === 'div' && threeItem.attribs.class === 'p-price') {
  37. const threeChildren = threeItem.children
  38. // 获取strong标签
  39. threeChildren.forEach(fourItem1 => {
  40. if (fourItem1.type === 'tag' && fourItem1.name === 'strong') {
  41. const fourItem1Children = fourItem1.children
  42. // 获取i标签
  43. fourItem1Children.forEach(fiveItem1 => {
  44. if (fiveItem1.type === 'tag' && fiveItem1.name === 'i') {
  45. const price = (fiveItem1.children[0]).data
  46. dataRes.price = price
  47. }
  48. })
  49. }
  50. })
  51. }
  52. // -------> 获取商品名称
  53. if (threeItem.type === 'tag' && threeItem.name === 'div' && threeItem.attribs.class === 'p-name p-name-type-2') {
  54. const threeChildren2 = threeItem.children
  55. // 获取strong标签
  56. threeChildren2.forEach(fourItem2 => {
  57. if (fourItem2.type === 'tag' && fourItem2.name === 'a') {
  58. const fourItem2Children = fourItem2.children
  59. // 获取i标签
  60. fourItem2Children.forEach(fiveItem3 => {
  61. if (fiveItem3.type === 'tag' && fiveItem3.name === 'em') {
  62. const fiveItem3Children = fiveItem3.children
  63. const fiveItem3ChildrenObj = fiveItem3Children.find(f => f.type === 'text')
  64. const name = fiveItem3ChildrenObj ? fiveItem3ChildrenObj.data : ''
  65. dataRes.name = name
  66. }
  67. })
  68. }
  69. })
  70. }
  71. })
  72. }
  73. })
  74. if (!_.isEmpty(dataRes)) {
  75. listDataRes.push(dataRes);
  76. }
  77. })
  78. console.log(`${cnt++}`); //这里就是为了自己在console中看到进度,没有实际用处。
  79. }
  80. done(); // 函数在回调中完成工作后必须调用它
  81. }
  82. });
  83. // 将其相关href写入json文件
  84. const writeListJson = () => {
  85. console.log(' =================> 队列为空时,数据处理完成')
  86. // 写入文件内容(如果文件不存在会创建一个文件)
  87. fs.writeFile('./jd_data/jd_goods_list.json', JSON.stringify(listDataRes), function (err) {
  88. if (err) {
  89. throw err;
  90. }
  91. console.log('all requests done and json saved!');
  92. });
  93. }
  94. // 指定爬取一个Url,将其添加到队列中
  95. //绝大多数网站,都有反爬机制。只有小众网站没有。所以我们需要使用以下配置
  96. //浏览器可以下载,但是服务端爬虫无效。反爬:检测你这个请求是通过浏览器发出来,还是服务端(解决方案:让服务端伪装成浏览器来发这个请求)
  97. c.queue({
  98. url: PATH_URL,
  99. headers: { 'User-Agent': 'requests' }//让服务端伪装成客户端
  100. });
  101. // 在队列为空时,调用以下函数
  102. c.on('drain', writeListJson);

4、cmd进入到index.js目录,执行 node index.js,生成如下

注意:简单的页面抓取数据,很容易实现。效果也不错,主要是根据HTML标签规则自定义获取数据。

目前存在一个问题:

例如:打开京东商品URL时,源码中展示的为30个商品信息列表,在鼠标向下滑动时,会自动追加商品数量,滑动到底部时查看源码中商品数量已增加到60个。

(刚开始研究node抓取数据)问题为在以上例子中只能抓取首屏的数据,那么如何滑动滚轮动态加载内容爬取?哪位大哥知道的,劳驾留个言指教一下小弟,先在此谢谢了。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/396799
推荐阅读
相关标签
  

闽ICP备14008679号