分享文章:微信公众号 文章的爬虫系统
优采云 发布时间: 2022-11-11 06:34分享文章:微信公众号 文章的爬虫系统
已经快两个星期了,一直在调试微信公众号的文章爬虫系统,终于一切正常,但是这期间遇到了很多问题。朋友们可以学习学习。
1. 我已经爬过两次了。第一次怕凤凰网,没有任何限制,可以自由爬行,于是放松了对自动代码执行模块的警惕。我认为这很简单,但事实并非如此。这个问题困扰了我几天,快4天了。由于搜狗的限制,相同的ip被获取的次数更多。第一个是验证码,第二个是访问限制。问题是访问次数太频繁,这样的提示,所以开发过程中最头疼的不是代码的写,而是测试。写完代码,不能马上测试。相信大部分程序员都不会喜欢这种感觉。我现在写的程序一天执行3次,这样的频率还不错,并且因为有多个公众号采集,所以每个公众号之间也有时间间隔,否则会同时访问十几个。几百个公众号文章也是不现实的,所以这里说一句,如何让每个公众号都不敢玩,等待特定时间,执行下一个,最后使用setInterval函数解决问题的,
每80秒执行一个公众号,将每个执行代码写入hello。它有点远。让我们来看看。再说说自动执行的cron包。npm官网只有一个例子,但是我的桑拿观点可能有点过头了。我不能玩,但我理解他的用法。然后我说我不明白该怎么办。我搜索了互联网,百度,以及cron包的具体用法。所以我只是看了一下,但仔细分析后发现不是这样,都是胡说八道,没用的,网上一般用法都有问号,但是我加问号的时候就报错了,所以这都是废话。最后在同学的一个前端技术讨论群里说了出来。真的有热心的群友帮我找到了链接。我进去试了一下。没关系,所以非常感谢这位同学帮我解决了疑惑。再次附上QQ群号和链接,方便大家阅读本文章时学习。QQ群号:435012561,链接:,这个链接说好的,至少可以用。我这里还有一个问题,就是时区。我们以前用过一次,用的是洛杉矶时间,但这次显然行不通。我们需要利用在中国的时间,但我尝试了几次。北京的不行,重庆的可以,所以我用重庆的。. QQ群号:435012561,链接:,这个链接说好的,至少可以用。我这里还有一个问题,就是时区。我们以前用过一次,用的是洛杉矶时间,但这次显然行不通。我们需要利用在中国的时间,但我尝试了几次。北京的不行,重庆的可以,所以我用重庆的。. QQ群号:435012561,链接:,这个链接说好的,至少可以用。我这里还有一个问题,就是时区。我们以前用过一次,用的是洛杉矶时间,但这次显然行不通。我们需要利用在中国的时间,但我尝试了几次。北京的不行,重庆的可以,所以我用重庆的。
2.这里要说的是从地址栏获取参数的问题。我做的最后一个没有问题,但我不知道为什么这个不起作用。我从地址栏中得到的最后一个是一个数字,但这个是一个字符串。,而且mongodb对字段的要求比较严格,所以一个分页功能困扰了我几个小时。我最后是怎么解决的?我加了一个mongodb讨论群,在里面问我问怎么回事,我发了截图,有热心网友说你传入的数据格式明显不对。我叫醒了做梦者,我说是的,然后把我得到的参数放上去。,我用Number()函数处理了,把类型字符串的个数变成了一个类型数,就好了,
3、MongoDB查询数据语句组织:
其实说白了就是limit和skip这两个函数的使用,不过具体格式可以看好,我是接受参数,但是mongo参数可以直接接受写入,不用做像sql这种${""}是什么类型,后面的sort函数说明了排序的方式,这里是基于ctime字段的设置,-1表示倒序,1表示正序,
4.在这段代码编写中,我第一次使用了try catch方法。事实证明是可以的,偶尔的错误可以正常打印出来,但是不影响代码的整体执行,还是下次执行,整体感觉很好,
具体用法,把你要执行的代码放在try里面,最后加一行,throw Error();
然后将参数e传递给catch。在 catch 中可以打印许多消息。我只打印了其中一个,e.message,
5.本次编码过程主要用到了anync包,其中ansyc.each循环,ansyc.waterfall在上面执行完后可以执行下面的,参数可以上下传给你,这个很重要,因为在这个编程中,每次得到的内容都不一样,每次代码执行的条件也不一样,也就是需要的参数也不一样,也就是有可能接下来的代码执行需要使用之前的代码执行。因此,这个anync包真的很值得研究。他的每一种方法都不一样,有时会得到意想不到的结果。
6.如果想在mysql中实现这样的效果,也就是如果数据库中已经存在,那么忽略它,或者不重复存储,如果数据库中不存在,那么就存储进去,非常简单直接将插入替换为替换以插入数据。但是在mongodb里面应该是没有的,或者我还没有找到。我是这样解决的。我定义了一个开关并使这个开关为真。每次存储前,循环所有数据看有没有,如果没有,如果有,让switch变为false,如果没有,继续执行,即判断switch是true还是false这次如果为真,则执行插入操作,如果为假,则忽略它,这样就达到了类似的效果,否则每次都存储很多重复数据,
7.这个采集的核心是我文件中的common.js。首先,因为需要采集,所以需要使用request包。采集 到达后,我需要处理 html 格式,以便它可以使用类似 jquery 的操作。长期使用cheerio包后,在循环采集的时候会用到anync.each方法,所以会用到async包。
7-1。
通过搜狗微信采集,有必要分析一下搜狗微信的路径。每个公众号页面的路径是这样的
%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%AC&ie=utf8&_sug_=n&_sug_type_=
这是“这就是日本”页面的链接。经分析,所有的公众号链接都只是在查询后面的参数不同,但是查询后面的参数是什么,其实是通过函数encodeURIComponent()转换的“这是日本”,所以都是同理,获取公众号,对公众号名称进行编码,动态组合成一个链接,每个链接都可以访问,但是这个链接只是请求这个页面,
不是
这个页面,所以进一步的处理就是获取当前页面第一个内容的链接,也就是href
当你拿到这个链接时,你会发现他有他的加密方法。其实很简单,就是在链接中加三个耳放;将链接中的三个amps替换为空的,就像这样是第一步,获取每个公众号的页面链接,
7-2
获取到链接后,需要访问,即请求,请求每个地址,获取每个地址的内容,但是每个页面显示的内容不在页面中,即在html结构中,隐藏在js中,所以需要通过正则匹配,得到每个文章的对象,然后循环每个公众号的对象,得到这个对象中每个文章的一些信息,包括title, thumb, abstract, URL , time, 五个字段,但是我用的代码很烂,虽然我当时用过
object.properties.foreach(function(item,index){
})
这种烂方法,最后最好还是写个循环把每一个对象都拿到,不然只能拿到第一个,这里应该用async.each,或者async.foreach这两种方法,哪一种都可以,就是都非常有用。在这种情况下,如果您购买,您将获得每个文章的上述基本信息,
7-3。
第三阶段是进入每个文章的详情页,获取每个文章的内容、点赞数、作者、公众号、阅读数等数据。这里主要遇到的问题就是人家的内容是直接在js里的,所有的img标签都有问题。他以这种形式存在于rain内容中,但是在这种情况下,这样的图片是无法在我们的网页中显示的,因为标签存在的问题是html文档无法识别这样的img标签,所以我们需要做一些处理在这里,并将它们全部替换为
<p>