网站建设. 龙兵科技,做设计用的常用网站,二次开发是指,站长工具高清有吗差不多俩个星期了吧#xff0c;一直在调试关于微信公众号的文章爬虫系统#xff0c;终于一切都好了#xff0c;但是在这期间碰到了很多问题#xff0c;今天就来回顾一下#xff0c;总结一下#xff0c;希望有用到的小伙伴可以学习学习。 1、做了俩次爬虫了#xff0c;第… 差不多俩个星期了吧一直在调试关于微信公众号的文章爬虫系统终于一切都好了但是在这期间碰到了很多问题今天就来回顾一下总结一下希望有用到的小伙伴可以学习学习。 1、做了俩次爬虫了第一次怕的凤凰网那个没有限制随便爬所以也就对自动化执行代码模块放松了警惕觉得挺简单的但是其实不是这样的我被这个问题困扰了好几天差不多4天的一个样子因为搜狗做的限制同一个ip获取的次数多了首先是出现验证码其次是就是访问限制了直接就是不能访问利用 request得到的就是访问次数过于频繁这样子的提示所以说开发过程中最头疼的不是代码的编写而是测试写完代码不能立马测试这种感觉相信大多数的程序员是不能喜欢的我现在写的程序是每天执行三次这样的一个频率还行而且因为是多公众号采集嘛每个公众号之间的间隔时间也的有要不然同时访问十几个公众号的上百篇文章也是不现实的说到这里插一句怎么让每个公众号怕去玩之后等一段具体的时间在执行下一个最后用的setInterval函数解决的 每过80秒执行一个公众号把每次的执行代码写到hello中泡的有点远了收一收哈说说cron这个包自动化执行npm官网上只给了一个例子但是我这个指桑拿可能是有点压制的厉害不能够玩却理解他的用法然后我说理解不了怎么办啊上网搜呗百度cron包的具体用法一看嚯还挺多于是就看啊看啊但是仔细以分析就不是那么回事儿了都是废话没什么用网上一般的用法中都带有一个问号但是我加上问号的时候就报错了所以说都是扯淡最后在同学组的一个前端技术讨论群中说了一声还真有热心的群友给我找了一个链接我进去一看试了一下还行所以呢非常感谢这个帮助我解惑的同学再次我把qq群号和链接附上方便正在看这篇文章的你学习QQ群号435012561链接http://www.tuicool.com/articles/yy2Ivmj这个链接里面说的还行至少能用这里我还行到一个问题就是timezone我们之前用过一次用的是洛杉矶时间但是这次明显不行啊要用咱们中国的时间啊但是我试了几次北京的不行重庆的可以所以我就用了重庆的。 2、这里要说的是从地址栏获取参数的问题我上一个做的没问题但是这个不知道怎么就不行了上一个从地址栏得到的是数字但是这个得到的是字符串再加上mongodb中的对字段的要求还是挺严格的所以一个分页功能也困扰了我几个小时吧最后是怎么解决的呢是通过我加的一个mongodb的讨论群在里面问了一句这是怎么了发了个截图里面就有一个热心的网友说你这明显是传入的数据格式不对啊一语惊醒梦中人我说是啊然后就把得到的参数我用Number函数处理了一下让string类型的数字变成了number类型的数字就好了所以说大家在用mongodb的时候一定要注意存储数据的格式 3、mongodb查询数据语句组织方式 其实说白了就是limit和skip俩个函数的使用但是具体的格式可的看好了还有我这个是接受的参数不过mongo的参数接受也好弄直接写就好了不用像sql那样搞什么${}这种类型的后面的sort函数说明了排序的方式这里是设置的以ctime字段为标准-1表示倒序1表示正序 4、在本次代码编写中我首次使用了try catch 这个补错的方式事实证明还行可以把偶尔的错误正常的打印出来但是不影响代码的整体执行或者是说下一次执行整体感觉非常好 具体的使用方法在try中放入你要执行的代码在最后加上一行throw Error(); 然后给catch传入一个参数e在catch中可以打印很多个信息我只打印了其中的一个e.message 5、这次编码过程中主要用到了anync包其中的ansyc.each循环ansyc.waterfall执行完上面的才可以执行下面的而且撒谎给你下之间还可以从上至下传递参数这个很重要因为在本次编程中每次获取的内容不同每次代码执行的条件不同即需要的参数也不同即有可能下一次代码的执行就需要用到上一次代码执行得到的结果所以说这个anync包真的是值得研究他的每个方法都不同有时候可以得到意想不到的效果。 6、在mysql中如果想要达到这样一个效果就是说如果数据库中已经存在了那就不予理会或者说不重复存储如果数据库中不存在那么就存储进来很简单直接把插入数据的insert 换成 replace 。但是在mongodb中应该是没有或者说是我还没有发现我是这么解决的定义了一个开关令这个开关为真每次存储之前先把所有的数据循环一遍看看有没有这条数据如果有让开关变为假如果没有继续执行即判断此时开关的真假如果是真的那就执行插入操作如果是假的就不予理会这就达到了类似的效果否则每次都会存储大量的重复数据 7、本次采集的核心就是我文件中的common.js了首先因为要采集所以需要用到request包采集到之后要处理html格式的数据使之可以使用类jquery的操作那么久用到了cheerio这个包然后在循环采集的时候会用到anync.each这个方法所以会用到async这个包 7-1、 通过搜狗微信采集就要分析搜狗微信的路径每个公众号的页面的路径是这样的 http://weixin.sogou.com/weixin?type1s_frominputquery%E8%BF%99%E6%89%8D%E6%98%AF%E6%97%A5%E6%9C%ACieutf8_sug_n_sug_type_ 这个是“这才是日本”的页面的链接经过分析所有的公众号的链接只有query后面的参数不同但是query后面的参数是什么呢其实就是通过encodeURIComponent这个函数转化之后的“这才是日本”所以说都一样获取那个公众号就将那个公众号的名字编码之后动态的组合成一个链接访问就可以进入到每个链接里面了但是这个链接只是请求到了这个页面 并不是 这个页面所以还的进一步处理就是得到当前页面的第一个内容的链接即href 当得到了这个链接就会发现他有他的加密方式其实很简单的就是在链接里面的加了三个amp把链接里面的这三个amp;替换为空就好了这也就是第一步得到每一个公众号的页面链接 7-2 得到链接之后就要进行访问了即请求请求每个地址得到每个地址的内容但是每个页面显示的内容都不在页面中即html结构中在js中藏着所以要通过正则匹配得到每篇文章的对象然后就循环每个公众号的这个对象得到这个对象中的每篇文章的一些信息包括titlethumbabstractURLtime五个字段但是我使用的代码烂透了尽然当时使用了 对象.属性.foreachfunctionitem,index{ } 这种烂透了的方式弄的最后好的在写一次循环才可以完全的得到每一个对象否则只可以得到第一个在这里应该用async.each,或者async.foreach这俩中方式每种都可以啊而且都是非常好用的方式。这样的话买就得到了每篇文章的以上基本消息 7-3、 第三个阶段就是进入到每篇文章的详情页获得每篇文章的内容点赞数作者公众号阅读量等数据在这里碰到的主要问题是人家的content直接在在js中所有的img标签都有问题他是以image-src ...这种形式存在雨content中但是这样的话这样的图片在我们的网页中不能被显示因为标签存在问题啊html文档不认识这样的img标签啊所以这里要进行一些处理把所有的image-src ...用replace替换为img src ...这样的话就OK了但是我在编程的时候进行到这儿碰到了一个傻逼问题我将这样的得到的content放到html中可以但是存到mongodb中每个引号的前面莫名其妙的多了一条杠每个img标签多了三条杠这样的话就又不可以显示了我就一直纠结啊怎么能存储的时候不要这三条杠呢经过了一番艰苦卓绝的斗争最后还是没能解决了最后加了一个mongodb 的讨论群我进去问了一下有一个大神立马说你知道什么是转义字符吗我当时很懵逼啊我自认为我知道啊人家说你的群备注还是前端你做前端的不明白这是转义字符吗我就更加懵逼了然后过了一会儿我才明白过来这个是存储的时候被转义了但是当从数据库读的时候就自动有没有了所以说只有存在数据库中的数据有三条杠原始数据和读取出来的数据都没有真是完美啊 8、最后想说一点这次是我第一次接触有验证码的网页请求这里用到了阿里一个服务识别验证码 END! https://www.cnblogs.com/boboweiqi/p/6782300.html 转载于:https://www.cnblogs.com/softidea/p/8073617.html