线报屋-赚客吧

 找回密码
 立即注册
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
自助购买限时2元/天
查看: 2785|回复: 0

从零编写一只会赚钱的爬虫

[复制链接]
发表于 2020-7-4 10:17 | 显示全部楼层 |阅读模式

79淘薅羊毛论坛网站限时开放注册!加入79淘,交流、分享一手实时活动线报!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

[backcolor=rgba(255, 255, 255, 0.5)]本文引见的是怎样编写一只会赢利的爬虫,那怎样编写一只爬虫去赢利呢?且听我逐个讲去,正在开端之前我们不能不提到一个名次“羊毛党”,当今社会收集非常兴旺,林林总总的仄台为了抢用户,推新,推行大概一些其他的目标皆纷繁推出了一些有奖举动,好比注册收白包,玩游戏发白包,约请收白包啦之类的,那个时分便呈现了一批人,他们会从差别渠讲得到那些疑息,然后特地薅那些羊毛,随意每笔古个能够未几,可是集腋成裘,参与的举动多了也是一笔很客不雅的支出。

[backcolor=rgba(255, 255, 255, 0.5)]上里我们提到了渠讲,有些人能够有干系能获得内乱部动静,可是年夜部门人皆是出有这类干系的,以是只能靠那些有黑幕动静的羊毛年夜佬分享的疑息去薅羊毛,可是他人为何把疑息分享给您呢?由于约请推人头有嘉奖呀,那个时分收集上又降生了一多量羊毛资讯网站,QQ群,微疑群,而我们本节的目标次要便是编写一只从各个羊毛资讯网站抓失信息,按时抓与,然后天生简报收收给我们的爬虫。

[backcolor=rgba(255, 255, 255, 0.5)]正在开端之前起首需求确保我们开辟的机械曾经准确装置了nodejs,假如还没有装置,能够参考前面的网站停止装置,http://www.runoob.com/nodejs/nodejs-install-setup.html,上面我们便正式开端会赢利爬虫的开辟了,您筹办好了吗?

[backcolor=rgba(255, 255, 255, 0.5)]1、起首我们新建文件夹moneyRobot用于存储我们的项目文件,并新建文件readed.json文件用于存储抓与过的链接,以后翻开掌握台进进该目次(windows电脑能够正在按住shift键的同时正在该目次中左击挑选今后处翻开号令止),然后运转号令:

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em][size=1em]npm init -y



[backcolor=rgba(255, 255, 255, 0.5)]那一步的次要目标是初初化项陌生成package.json文件记载我们的前面所需求的一些项目依靠。接着我们便开端装置我们的项目依靠了

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em][size=1em]npm install request cheerio fs-extra iconv-lite --save



[backcolor=rgba(255, 255, 255, 0.5)]经由过程上里的号令我们便装置好了那个项目一切的依靠了,接下去筹办开端进进项目标开辟了,正在入手编写之前我们先构想一下,起首如许的网站其实不只要一个,我们也没有会只抓与一个,而是要抓与许多个然后综开获得的疑息,可是关于每一个网站我们不成能皆写一份代码呀,以是我们要念一个法子让我们的代码对年夜部门网站皆合用,实在写过爬虫的该当皆明白实在关于这类静态网站实在抓与皆好未几,只不外是节面纷歧样而已,固然要除开同步获得内乱容的,以是也又许多法子让它战那些间接输出内乱容的静态网站一样抓与,那里未几做会商,为了让我们能用一份代码抓与差别的网站,我机关了以下数据构造:

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em][size=1em][{
[size=1em]  url: '',
[size=1em]  selector: '',
[size=1em]  isGBK: false
[size=1em]}]



[backcolor=rgba(255, 255, 255, 0.5)]url字段暗示待抓与的网址,selector暗示的是抓与节面的挑选器,isGBK暗示那个网站是否是GB2312大概GBK编码,这类编码呼应疑息需求用iconv-lite那个库去做转换,然后我们开端编写单个URL的抓与办法:

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em]34

[size=1em]35

[size=1em]36

[size=1em]37

[size=1em]38

[size=1em][size=1em]function grab(item) {
[size=1em]  const { url, selector, headers = {} } = item;
[size=1em]  const oldData = fs.readJsonSync(READED_PATH);
[size=1em]  const grabUrl = url;
[size=1em]  request({
[size=1em]    url,
[size=1em]    encoding: null,
[size=1em]    headers: Object.assign({}, headers, {
[size=1em]      userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
[size=1em]    })
[size=1em]  }, (err, response, body) => {
[size=1em]    if (err) {
[size=1em]      startList();
[size=1em]    } else {
[size=1em]      const newBody = item.isGBK ? iconv.decode(body,'gb2312').toString() : body.toString();
[size=1em]      const $ = cheerio.load(newBody);
[size=1em]      const list = $(selector);
[size=1em]      list.each(function() {
[size=1em]        const _this = $(this);
[size=1em]        let url = _this.attr('href');
[size=1em]        if (!/^https?/.test(url)) {
[size=1em]          url = joinPath(grabUrl, url);
[size=1em]        }
[size=1em]        const title = _this.text().replace(/\d{2}:?\d{2}:?\d{2}/g, '');
[size=1em]        const isRead = checkIsRead(oldData, url);
[size=1em]        if (!isRead && title.trim() && !RegExp(FILTER_WORDS.join('|')).test(title)) {
[size=1em]          oldData.unshift(url);
[size=1em]          newData.push({
[size=1em]            title,
[size=1em]            url
[size=1em]          });
[size=1em]        }
[size=1em]      });
[size=1em]      fs.writeJsonSync(READED_PATH, oldData);
[size=1em]      startList();
[size=1em]    }
[size=1em]  });
[size=1em]}



[backcolor=rgba(255, 255, 255, 0.5)]此中READED_PATH暗示的是记载曾经抓与过的链接记载的当地文件地点,文件以JSON方法记载,startList办法是遍历一切待抓与地点的办法,上面是该办法的代码:

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em][size=1em]function startList() {
[size=1em]  const item = sources.shift();
[size=1em]  if (item) {
[size=1em]    grab(item);
[size=1em]  } else {
[size=1em]    if (newData.length) {
[size=1em]      const subject = '新的举动线报';
[size=1em]      let content = '\r\n\r\n';
[size=1em]      newData.forEach(item => {
[size=1em]        const { title, url } = item;
[size=1em]        content += `${title}\r\n\r\n${url}\r\n\r\n`;
[size=1em]      });
[size=1em]      sendMessage(subject, content);
[size=1em]    }
[size=1em]  }
[size=1em]}



[backcolor=rgba(255, 255, 255, 0.5)]那里又呈现了一个sendMessage办法,我们抓与到了动静需求推收到我们的脚机,推收的话便那些渠讲,短疑,微疑,邮件之类的,邮件的话我们没有会常常来看,短疑的话本钱仍是有一些的,最合适的便是邮件了,那里利用的是Server酱去停止微疑动静的推收,怎样利用呢?翻开网址http://sc.ftqq.com然后登录,出有账号的能够注册一个,面击收收动静,我们能够获得我们的SCKEY战挪用代码

https://sc.ftqq.com/SCKEY.send?text=仆人效劳器又挂失落啦~

[backcolor=rgba(255, 255, 255, 0.5)]然后我们正在代码中简朴的编写收收代码:

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em][size=1em]function sendMessage(title, content) {
[size=1em]  request({
[size=1em]    url: `[size=1em]https://sc.ftqq.com/SCU43320Tb8f1c7232560d9aa45f9b3c60b3d99ad5c4bf326b4df0.send?text=${encodeURIComponent(title)}&desp=${encodeURIComponent(content)}`
[size=1em]  })
[size=1em]}



[backcolor=rgba(255, 255, 255, 0.5)]如许子我们的要冒爬虫便根本完成了,上面是一切代码,包罗了一些小我私家找的比力好的源,可是内里会有渣滓疑息,减了一些简朴的过滤,仍是有,有爱好的伴侣能够再来调调:

[backcolor=rgba(255, 255, 255, 0.5)][backcolor=white !important][size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em]34

[size=1em]35

[size=1em]36

[size=1em]37

[size=1em]38

[size=1em]39

[size=1em]40

[size=1em]41

[size=1em]42

[size=1em]43

[size=1em]44

[size=1em]45

[size=1em]46

[size=1em]47

[size=1em]48

[size=1em]49

[size=1em]50

[size=1em]51

[size=1em]52

[size=1em]53

[size=1em]54

[size=1em]55

[size=1em]56

[size=1em]57

[size=1em]58

[size=1em]59

[size=1em]60

[size=1em]61

[size=1em]62

[size=1em]63

[size=1em]64

[size=1em]65

[size=1em]66

[size=1em]67

[size=1em]68

[size=1em]69

[size=1em]70

[size=1em]71

[size=1em]72

[size=1em]73

[size=1em]74

[size=1em]75

[size=1em]76

[size=1em]77

[size=1em]78

[size=1em]79

[size=1em]80

[size=1em]81

[size=1em]82

[size=1em]83

[size=1em]84

[size=1em]85

[size=1em]86

[size=1em]87

[size=1em]88

[size=1em]89

[size=1em]90

[size=1em]91

[size=1em]92

[size=1em]93

[size=1em]94

[size=1em]95

[size=1em]96

[size=1em]97

[size=1em]98

[size=1em]99

[size=1em]100

[size=1em]101

[size=1em]102

[size=1em]103

[size=1em]104

[size=1em]105

[size=1em]106

[size=1em]107

[size=1em]108

[size=1em]109

[size=1em]110

[size=1em]111

[size=1em]112

[size=1em]113

[size=1em]114

[size=1em]115

[size=1em]116

[size=1em]117

[size=1em]118

[size=1em]119

[size=1em]120

[size=1em]121

[size=1em]122

[size=1em]123

[size=1em]124

[size=1em]125

[size=1em]126

[size=1em]127

[size=1em]128

[size=1em]129

[size=1em]130

[size=1em]131

[size=1em]132

[size=1em]133

[size=1em]134

[size=1em]135

[size=1em]136

[size=1em]137

[size=1em][size=1em]const path = require('path');
[size=1em]const fs = require('fs-extra');
[size=1em]const request = require('request');
[size=1em]const cheerio = require('cheerio');
[size=1em]const iconv = require('iconv-lite');

[size=1em]const FILTER_WORDS = ['假造', '硬件', '破解', '搬砖', '查核', '讲具', '王者光彩', '本创修正', '做图必备', '手艺', '建造', '神器', '封闭', '黄了'];

[size=1em]const READED_PATH = path.join(__dirname, 'readed.json');
[size=1em]const newData = [];

[size=1em]const sources = [
[size=1em]  {
[size=1em]    url: '[size=1em]https://www.zhuanyes.com/',
[size=1em]    selector: '#threadlisttableid a'
[size=1em]  },
[size=1em]  {
[size=1em]    url: '[size=1em]http://www.wz169.com/category/xianbao/',
[size=1em]    selector: '#main a'
[size=1em]  },
[size=1em]  {
[size=1em]    url: '[size=1em]https://www.work28.com/category-4.html',
[size=1em]    selector: '.listbody ul a'
[size=1em]  },
[size=1em]  {
[size=1em]    url: '[size=1em]https://www.xiaozuan8.com/xianbao/',
[size=1em]    selector: '#postlist_blog .post-title_blog a'
[size=1em]  },
[size=1em]  {
[size=1em]    url: '[size=1em]http://www.79tao.com/forum-44-1.html',
[size=1em]    selector: 'tbody[id^="normalthread_"] .new a.xst',
[size=1em]  },
[size=1em]  {
[size=1em]    url: '[size=1em]http://www.wz169.com/category/xianbao/',
[size=1em]    selector: '#main h2.list-title a'
[size=1em]  },
[size=1em]  // {
[size=1em]  //   url: '[size=1em]https://www.fxzhan.com/?cate=2',
[size=1em]  //   selector: '.mainlist .wx_li a'
[size=1em]  // },
[size=1em]  {
[size=1em]    url: '[size=1em]http://8ym.cn/RptList',
[size=1em]    selector: '.list-group .list-group-item'
[size=1em]  },
[size=1em]  {
[size=1em]    url: '[size=1em]https://www.haojiyou.la/html/newslist-14.html',
[size=1em]    selector: '.news-left ul li span a'
[size=1em]  }
[size=1em]];

[size=1em]function checkIsRead(readData, url) {
[size=1em]  return readData.indexOf(url) !== -1;
[size=1em]}

[size=1em]function grab(item) {
[size=1em]  const { url, selector, headers = {} } = item;
[size=1em]  const oldData = fs.readJsonSync(READED_PATH);
[size=1em]  const grabUrl = url;
[size=1em]  request({
[size=1em]    url,
[size=1em]    encoding: null,
[size=1em]    headers: Object.assign({}, headers, {
[size=1em]      userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
[size=1em]    })
[size=1em]  }, (err, response, body) => {
[size=1em]    if (err) {
[size=1em]      startList();
[size=1em]    } else {
[size=1em]      const newBody = item.isGBK ? iconv.decode(body,'gb2312').toString() : body.toString();
[size=1em]      const $ = cheerio.load(newBody);
[size=1em]      const list = $(selector);
[size=1em]      list.each(function() {
[size=1em]        const _this = $(this);
[size=1em]        let url = _this.attr('href');
[size=1em]        if (!/^https?/.test(url)) {
[size=1em]          url = joinPath(grabUrl, url);
[size=1em]        }
[size=1em]        const title = _this.text().replace(/\d{2}:?\d{2}:?\d{2}/g, '');
[size=1em]        const isRead = checkIsRead(oldData, url);
[size=1em]        if (!isRead && title.trim() && !RegExp(FILTER_WORDS.join('|')).test(title)) {
[size=1em]          oldData.unshift(url);
[size=1em]          newData.push({
[size=1em]            title,
[size=1em]            url
[size=1em]          });
[size=1em]        }
[size=1em]      });
[size=1em]      fs.writeJsonSync(READED_PATH, oldData);
[size=1em]      startList();
[size=1em]    }
[size=1em]  });
[size=1em]}

[size=1em]function sendMessage(title, content) {
[size=1em]  request({
[size=1em]    url: `[size=1em]https://sc.ftqq.com/SCU43320Tb8f1c7232560d9aa45f9b3c60b3d99ad5c4bf326b4df0.send?text=${encodeURIComponent(title)}&desp=${encodeURIComponent(content)}`
[size=1em]  })
[size=1em]}

[size=1em]function startList() {
[size=1em]  const item = sources.shift();
[size=1em]  if (item) {
[size=1em]    grab(item);
[size=1em]  } else {
[size=1em]    if (newData.length) {
[size=1em]      const subject = '新的举动线报';
[size=1em]      let content = '\r\n\r\n';
[size=1em]      newData.forEach(item => {
[size=1em]        const { title, url } = item;
[size=1em]        content += `${title}\r\n\r\n${url}\r\n\r\n`;
[size=1em]      });
[size=1em]      sendMessage(subject, content);
[size=1em]    }
[size=1em]  }
[size=1em]}

[size=1em]function start() {
[size=1em]    startList();
[size=1em]}

[size=1em]function joinPath(url, path) {
[size=1em]  const pathArr = url.split(/(?<!\/)\/(?!\/)/);
[size=1em]  if (path[0] === '/') {
[size=1em]    return pathArr[0] + path;
[size=1em]  } else {
[size=1em]    if (path.substr(0, 2) === './') {
[size=1em]      pathArr.pop();
[size=1em]      return pathArr.join('/') + '/' + path.substr(2);
[size=1em]    } else {
[size=1em]      const backArr = path.split('../');
[size=1em]      pathArr.length = pathArr.length - backArr.length;
[size=1em]      return pathArr.join('/') + '/' + backArr[backArr.length - 1];
[size=1em]    }
[size=1em]  }
[size=1em]}

[size=1em]start();



[backcolor=rgba(255, 255, 255, 0.5)]最初另有一个成绩便是怎样按时抓与呢?我们只需求简朴的设置按时使命就能够了,至于按时怎样设,百度一下漫山遍野,那里便未几做会商了,假如念更及时一面,抓与距离工夫能够设的短一面,那个能够看本人状况而定。

[backcolor=rgba(255, 255, 255, 0.5)]好了,一个会赢利的爬虫便完成了


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|赚客吧APP下载|赚客吧-线报网 ( 闽ICP备14018093号-1 )

GMT+8, 2020-8-15 16:33 , Processed in 0.225440 second(s), 10 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表