分享:微信公众号文章采集系统---开箱即用
优采云 发布时间: 2022-10-04 19:20分享:微信公众号文章采集系统---开箱即用
本着开源、方便用户的精神,将“微信公众号文章采集系统”打包成虚拟机。您只需下载并安装虚拟机镜像即可使用。
系统镜像有6G,只能以*敏*感*词*的形式下载。镜像*敏*感*词*下载地址
链接:密码:7r4d
首先要感谢凡口团队的领导,将他的采集项目开源。
这里可以称为系统,因为涉及到的技术很多,这里罗列一下:
1、Anyproxy阿里巴巴开源代理*敏*感*词*使用4.0版本,可以方便的修改响应信息。我在系统中安装了anyproxy,安装非常简单。先安装nodejs环境,然后使用npm安装anyproxy。
从 anyproxy 4.0 开始,可以将规则开发为模块。编写规则代码后,无需更改原代码,只需将规则文件带入anproxy的参数即可。这里使用的命令 anproxy --rule weixin.js。anproxy是如何设置https证书的,可以参考官网。我在虚拟机中设置了全局代理,所以需要在anyproxy之后开启,8001端口才能访问请求成功。
规则代码的主要逻辑是拦截微信公众号的请求,并将数据转发给php。
2. apache+php+mysql 这个主要用作web服务器,处理anyproxy拦截的请求,处理微信文章数据和点赞数和阅读数。
截取数据的处理可以看具体的php代码,逻辑也不算太复杂。这里是phpstudy的集成开发环境,方便使用。
3.按键精灵,按键精灵是一款国产的类似vb语法的模拟键盘鼠标的工具。这里使用按钮向导来模拟Windows下微信客户端的点击。
处理多个微信公众号时,客户端需要点击,所有手动操作均由按钮向导模拟。当我去查看具体代码时,我使用了一个小技巧来处理点击历史消息。事实是,我开始通过直接识别图片来找到“历史消息”按钮的位置,但是我发现找不到,然后就只能将鼠标向下划圈,直到特定颜色在该区域中找到,即“历史消息”按钮。
当一个想法不起作用时,尝试另一个想法。整个系统都搞定了,就是处理这种看似有效,但无效的事情,然后再试,以此类推。
4.windows微信客户端,其实我也试过用安卓模拟器,因为我的目标是开箱即用,所以需要把所有的程序一起安装,但是安卓模拟器是不可能安装在里面的虚拟机。,也就是说,不可能在虚拟机中做二次虚拟化。这个坑我已经踩过了,你不用踩。记得之前有人问过阿里云windows服务器能不能装安卓模拟器。我想答案是一样的。虚拟机不能用于辅助虚拟化。服务器无法安装 Android 模拟器。
于是,在我试用安卓模拟器的时候,发现原来微信pc客户端(包括mac)的功能已经完善,然后我又尝试了windows客户端。
5、virtualbox虚拟机,这是来自Oracle的虚拟机。会涉及到一些网络配置,比如设置成NAT模式。
现在虚拟机镜像已经开源了,里面的所有代码都在虚拟机里面,可以随意修改。
从最开始知道公众号文章采集,到知道实现原理,最后到做镜像,中间经历了各种困难,费时费力——密集,向各种人征求意见,甚至吃饭和睡觉。想到一个详细的解决方案,有解决问题的喜悦,也有被问题纠缠的苦恼,感谢在这个过程中帮助过人。
安装使用过程中遇到问题可以加我微信(liuhan199012)
干货分享:干货 | 分享一下爬虫正确的学习路径
"
阅读这篇文章大约需要 10 分钟
"
在当今大数据时代,网络爬虫已经成为获取数据的重要手段,但要学好爬虫却不是那么简单
首先,知识点和方向太多了。涉及计算机网络、编程基础、前端开发、后端开发、App开发与逆向工程、网络安全、数据库、运维、机器学习、数据分析等,连接了一些主流技术栈像一个大网络一样在一起
因为涉及的方向很多,所以要学的东西也很分散,很乱。很多初学者不知道该学什么知识,在学习过程中不知道如何解决防爬问题。我们会做这篇文章。一些概括和总结
初级爬虫
一些最基本的网站,往往没有任何防爬措施。例如,对于一个博客网站,如果我们要爬取整个网站,可以沿着列表页面爬到文章页面,然后再爬下该网站的时间、作者、文字等信息。 文章。
如何编写代码?使用 Python 的 requests 等库就够了,写一个基本的逻辑,按照每个文章的源码,用XPath、BeautifulSoup、PyQuery或者正则表达式,或者粗鲁的字符串进行解析。匹配所需的内容,然后添加要编写的文本并保存,就完成了。
代码很简单,就是几个方法调用。逻辑很简单,几个周期加存储。最后,我们可以看到文章 文章 已经保存到我们的计算机上。当然,有的同学可能代码写得不是很好或者懒得写,所以使用基本的可视化爬虫工具,比如爪鱼和采集器,也可以通过可视化点击爬取数据。
如果存储方面稍微扩展,可以连接 MySQL、MongoDB、Elasticsearch、Kafka 等来保存数据,实现持久化存储。以后查询或操作会更方便。
反正不管效率如何,一个完全没有反爬的网站可以用最基本的方式完成。
此时,你说你可以爬了吗?不,还有很长的路要走。
Ajax,动态渲染
随着互联网的发展,前端技术也在不断变化,数据加载的方式不再是单纯的服务端渲染。现在可以看到很多网站数据可能是以接口的形式传输的,或者即使不是接口也是一些JSON数据,然后通过JavaScript渲染。
这时候再想用requests爬取也没用,因为request往下爬的源码是服务端渲染出来的,浏览器在页面上看到的结果和得到的结果不一样要求。真实数据由 JavaScript 执行。数据源可能是ajax,也可能是页面中的一些数据,也可能是一些ifame页面等,但大多数情况下,可能是通过ajax接口获取的。
因此,很多时候需要对Ajax进行分析,知道这些接口的调用方式后,再用程序进行模拟。但有些接口携带加密参数,如token、sign等,不易模拟。应该做什么?
一种方法是分析网站的JavaScript逻辑,挖掘里面的代码,找出这些参数是如何构造的,找到思路后再用爬虫模拟或者重写。如果你解决了,那么直接模拟的方法会效率更高,这需要一些 JavaScript 基础。当然,有些网站的加密逻辑太牛了,你可能要花一个星期。出来了,最后放弃了。
如果想不通或不想想通,该怎么办?这时候有一种简单粗暴的方式直接模拟浏览器爬取,比如Puppeteer、Pyppeteer、Selenium、Splash等。这样爬取的源码就是真正的网页代码,数据可以被自然提取。它还绕过了分析 Ajax 和一些 JavaScript 逻辑的过程。这样一来,既能看又能爬,也不难。同时,它模拟了一个浏览器,并没有太多的法律问题。
但实际上,后一种方法也会遇到各种反爬的情况。现在很多网站会识别webdriver,看你用的是Selenium之类的工具,直接kill或者不返回数据,所以你摸到这种网站,我得来解决这个问题.
多进程、多线程、协程
上面的情况用单线程爬虫模拟比较简单,但是存在速度慢的问题。
爬虫是 IO 密集型任务,所以大部分情况下它可能在等待网络响应。如果网络响应速度慢,则必须一直等待。但是这个空闲时间实际上可以让CPU做更多的事情。那我们该怎么办?打开更多线程。
所以,这个时候,我们可以在一些场景下加入多进程和多线程。多线程虽然有GIL锁,但对爬虫影响不大,所以使用多进程多线程可以成倍增加。为了提高爬取速度,相应的库有线程和多处理。
异步协程更加强大。有了aiohttp、gevent、tornado等,基本上你可以做你想做的并发,但是你要放轻松,不要让其他人网站挂掉。
总之,有了这几个,爬虫的速度就会提高。
但是提高速度不一定是好事,反爬肯定很快就会来,封IP,封账号,打验证码,返回假数据,所以有时候好像是个解决办法?
分散式
多线程、多处理、协程都可以加速,但毕竟还是单机爬虫。要真正实现规模化,我们必须依赖分布式爬虫。
分布式的核心是什么?资源共享。比如爬取队列共享、去重指纹共享等。
我们可以使用一些基本的队列或者组件来实现分布式,比如RabbitMQ、Celery、Kafka、Redis等,但是在很多人尝试实现分布式爬虫之后,总会出现一些性能和扩展性的问题。当然,傲慢的除外。很多公司其实都有一套自己开发的分布式爬虫,更贴近业务。当然,这是最好的。
现在主流的Python分布式爬虫还是基于Scrapy,对接Scrapy-Redis、Scrapy-Redis-BloomFilter或者使用Scrapy-Cluster等,都是基于Redis共享爬取队列的,总会多多少少遭遇。内存问题。所以也有人考虑连接其他的消息队列,比如RabbitMQ、Kafka等,解决一些问题,效率还不错。
总之,要想提高爬取效率,就必须掌握分布。
验证码
爬虫难免会遇到反爬,验证码就是其中之一。要想爬回来,必须先解码验证码。
现在可以看到很多网站都会有各种各样的验证码,比如最简单的图形验证码。如果验证码的文字是规则的,可以被OCR或者基础模型库识别。如果不想做,可以直接去编码平台做,准确率还是有的。
但是,您现在可能看不到任何图形验证码。都是行为验证码,比如一个测试,一个盾牌等等。国外也有很多,比如reCaptcha等等。对于一些比较简单的,比如滑动,可以找一些方法来识别差距,比如图像处理比较,深度学习识别都是可以的。轨迹就是写一个模拟正常人的行为,加上一些jitter之类的。有了轨迹后如何模拟?如果你牛逼,那你可以直接分析验证码的JavaScript逻辑,输入轨迹数据,然后就可以在里面得到一些加密的参数,直接把这些参数放到表单或者界面中。可以直接使用。当然也可以通过模拟浏览器来拖动,
当然,拖拽只是验证码,还有文字选择、逻辑推理等,如果实在不想做,可以找个编码平台解决,模拟一下,但毕竟有些专家会选择自己训练深度学习。相关模型,采集数据,标注,训练,针对不同的业务训练不同的模型。这样,有了核心技术,就不用花钱找编码平台,再研究验证码的逻辑模拟,加密参数就可以解决了。但是,有的验证码非常难,有的我也拿不到。
当然也可能会因为请求太频繁而弹出一些验证码,这可以通过更换IP来解决。
阻止 IP
封IP也是一件很头疼的事,最有效的办法就是换代理。
代理的种类很多,市面上有免费的,收费的也太多了。
首先你可以使用市面上的免费代理,自己搭建一个代理池,采集全网所有的免费代理,然后加一个测试者持续测试,测试的网址可以改成你的网址想爬。这样,通过测试的人通常可以直接用来攀登你的目标网站
付费代理也是如此。很多商家都提供了代理提取接口,一个请求就可以获得几十上百个代理。我们还可以将它们访问到代理池中。不过这个代理也分为各种套餐,开放代理、独家代理等的质量,被封杀的概率也不同。
有些商家也使用隧道技术设置代理,所以我们不知道代理的地址和端口,而代理池是他们维护的,比如云,所以用起来比较省心,但是可控性较小。更差。
有比较稳定的代理,比如拨号代理、蜂窝代理等,访问成本会更高一些,但也能在一定程度上解决一些IP阻塞问题。
但这些事情背后并不简单,为什么一个好的高密特工就是无缘无故爬不上去,背后的一些事情我就不说了。
账户关闭
有些信息需要模拟登录才能爬。如果你爬得太快,人家网站会直接封你号,没啥好说的。比如你爬了公众号,如果他们屏蔽了你的WX账号,那就完蛋了。
当然,一种解决方案是减慢频率并控制节奏。
另一种方法是查看其他终端,例如手机页面、App页面、wap页面,看看有没有绕过登录的方法。
另一种更好的方法是转移。如果你有足够的数字,建立一个池
例如:Cookies 池、Token 池、Sign 池。反正不管是什么池子,多个账户的 Cookies 和 Tokens 都会放到这个池子里,使用的时候随机抽取一个。
如果要保持爬取效率不变,那么100个账号对比20个账号,每个账号对应的Cookies和Token的访问频率变成原来的1/5,因此被屏蔽的概率也随之降低
奇怪的回爬
以上就是一些比较主流的反爬,当然还有很多精彩的反爬。比如返回假数据、返回图像数据、返回乱序数据、返回诅咒数据、返回求饶数据,这要看具体情况。
你必须小心这些防攀爬。之前看到反爬直接返回 rm -rf / 的情况并不少见。如果碰巧有一个脚本来模拟执行并返回结果,那后果可想而知。
JavaScript 反向
说到主线。随着前端技术的进步和网站反爬意识的增强,很多网站选择在前端工作,即对前端的一些逻辑或代码进行加密或混淆处理-结尾。当然,这不仅仅是为了保护前端代码不被轻易窃取,更重要的是防爬虫。比如很多Ajax接口都会携带一些参数,比如sign、token等,在上一篇文章中也提到过。我们可以使用上面提到的方法来爬取这种数据,比如Selenium,但是总的来说效率太低了。毕竟它模拟了网页渲染的全过程,真实的数据可能只是隐藏在一个小界面中。
如果我们真的能找出一些接口参数的逻辑,用代码模拟执行,效率会翻倍,一定程度上可以避免上述反爬现象。
但问题是什么?难的
webpack一方面是前端代码被压缩转码成一些bundle文件,丢失了一些变量的意义,不容易恢复。然后一些网站和一些混淆器机制会把前端代码变成你根本看不懂的东西,比如字符串拆解、变量十六进制化、控制流扁平化、无限调试、控制台被禁用等。 ,前端代码和逻辑都变的面目全非。有的使用 WebAssembly 等技术直接编译前端核心逻辑,然后只能慢慢做。虽然有些人有一定的技能,但还是需要很多时间。但是一旦你弄清楚了,一切都会好起来的。怎么说?就像奥数题,解决了就上天堂,解决不了GG。
很多招聘爬虫工程师的公司会问有没有JavaScript逆向基础,有哪些网站被破解了,比如某宝、某多、某篇文章等,如果找到自己需要的,可能直接雇佣你。每个网站都有不同的逻辑和难度
应用程序
当然,爬虫不仅仅是网络爬虫。随着互联网时代的发展,越来越多的企业选择将数据放到app上,甚至有的企业只有app没有网站。所以只能通过App抓取数据。
你怎么爬?基本的工具是抓包。查尔斯和提琴手可以使用班车。抓到接口后,就可以直接用它来模拟了。
如果接口有加密参数怎么办?爬取时可以处理的一种方法,例如 mitmproxy 直接*敏*感*词*接口数据。另一方面,你可以拿Hook,比如Xposed,你也可以拿到。
攀爬时如何实现自动化?你不能总是得到它。其实工具很多,Android原生的adb工具也可以,Appium是现在比较主流的方案,当然还有其他的向导可以实现。
最后,有时我真的不想自动化这个过程。我只是想把里面的一些接口逻辑抽出来,所以只好逆向了。IDA Pro、jdax 和 FRIDA 等工具就派上用场了。当然,这个过程和 JavaScript 逆向工程一样痛苦,甚至可能需要阅读汇编指令。失去一束头发的情况并非不可能。
聪明的
上面的pass很熟悉,恭喜你,你已经超过了80%或者90%的爬虫玩家。当然,专门从事 JavaScript 逆向工程和 App 逆向工程的人,都是站在食物链顶端的人。严格来说,这已经不属于爬虫类的范畴了,我们也不算在其中。反正我不是。
除了以上一些技巧,在某些场合,我们可能还需要结合一些机器学习技术,让我们的爬虫更加智能。
例如,现在很多博客和新闻文章在页面结构和要提取的相似信息上都有比较高的相似度。
例如,如何区分一个页面是索引页还是详情页?如何提取详细页面的 文章 链接?如何解析文章页面的页面内容?这些实际上可以通过一些算法来计算。
因此,一些智能解析技术也被开发出来,例如提取详情页。朋友写的GeneralNewsExtractor表现很好。
假设我有一个请求,我要爬10000条新闻网站数据,是不是需要一一写XPath?把我写下来。如果有智能分析技术,在容忍一定误差的情况下,几分钟就可以完成。
总之,如果我们能学会这一点,我们的爬虫技术将会更加强大。
运维
这也是一件大事。爬虫与运维也密切相关。
比如写了一个爬虫后,如何快速部署到100台主机上运行。
比如如何灵活监控各个爬虫的运行状态。
比如爬虫有代码变化,如何快速更新。
比如,如何监控一些爬虫的占用内存和CPU消耗。
比如如何科学控制爬虫的时序,
比如爬虫出现问题,如何及时接收通知,如何设置科学的报警机制。
在这里,每个人都有自己的部署方式,例如使用 Ansible,当然。如果使用Scrapy,就有Scrapyd,然后配合一些管理工具,也可以完成一些监控和定时任务。不过我现在更多的使用Docker+Kubernetes,加上一套DevOps,比如GitHub Actions、Azure Pipelines、Jenkins等,快速实现分发部署。
你们中的一些人使用 crontab 执行计划任务,一些人使用 apscheduler,一些人使用管理工具,还有一些人使用 Kubernetes。就我而言,我使用 Kubernetes 比较多,定时任务也很容易实现。
至于监控,有很多,一些专门的爬虫管理工具自带一些监控和报警功能。一些云服务还带来了一些监控功能。我使用 Kubernetes + Prometheus + Grafana。CPU、内存、运行状态是什么,一目了然。在 Grafana 中配置报警机制也很方便,支持 Webhook、email 甚至是钉钉。
对于数据存储和监控,使用Kafka和Elasticsearch非常方便。我主要用后者,然后配合Grafana,监控数据爬取量、爬取速度等一目了然。
结语
到目前为止,爬虫覆盖的一些知识点几乎是一样的。这个怎么样?让我们整理一下。是计算机网络、编程基础、前端开发、后端开发、App开发与逆向工程、网络安全、数据库、运维、机器学习?全部覆盖?
以上总结可视为爬虫新手到爬虫高手的路径。其实每个方向都有很多可以研究的点,每一个点如果提炼出来都会非常了不起。
爬虫经常学会学习,成为全栈工程师或者全职工程师,因为你可能真的什么都懂。但是没有办法。他们都是爬行动物强迫的。如果不困于生活,谁愿意成为天才?
但是天赋呢?摸我的头顶,该死,我的头发呢?
好吧,每个人都知道。
最后一点,珍惜生命,珍惜每一根头发!