总结一下自己原创的一个“亲民取巧的”获取微信公众号文章的方法。(文末附有下载链接)
平时爱逛知乎,收藏了不少别人推荐的数据分析、机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑)。但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便。
所以我就想有什么方法能否将这些公众号文章下载下来。这样的话,看起来也方便。但是网上的方法要么太复杂(对于我这个爬虫入门新手来说),要么付费。
但我的需求其实却很简单——“方便的查找 / 检索 / 浏览相关公众号的任意文章”,所以,一番学习检索后,上手做了一个小工具(打包成可执行文件了),虽然方法和代码相当简单,但实际上手用起来还是挺方便的。也给身边伙伴安利了几波。
* 输入:给定公众号ID,和用户需要获取的公众号文章目录页码数(小于已发布最大收录页数)
* 输出Ⅰ:每个公众号历史文章信息csv文件(链接+标题)
之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种
以下代码通过循环递增赋值,改变url中的页码参数
3.6去掉标题中的非法字符
因为windows下文件命令,有些字符是不能用了,所以需要使用正则剔除
使用pandas的read_csv函数读取爬取的csv文件,循环遍历“链接”,“标题”,“日期”
然后通过调用pdfkit函数转换生成PDF文件
爬取的几个公众号分文件夹存储
输入公众号名称和下载的页数
由于考虑到转pdf的稳定性,我在发布版的代码中没有加转PDF的函数。预留了一个粗糙的py源文件,如果感兴趣,读者可以在此基础上自行调整修改。
6 exe文件下载链接
随着手机阅读的普遍应用,微信公众号阅读,更为普遍,微信和qq一样,都是基于腾讯自研X5内核,不是google原生webview(其实就是进行了二次定制)。实质上也是混合应用的一种,现在很多app产品也开始流行采用X5内核作为其内嵌web浏览服务,所以掌握X5内核的混合应用自动化也是重中之重的一种技能
X5内核应用自动化方式和普通混合应用有非常多的差异,接下来以微信公众号举例介绍怎么来开展X5内核的自动化
在打开的界面中选择信息->勾选是否打开TBS内核Inspector调试功能
2、手机通过usb连接到电脑,打开USB调试模式,通过adb devices命令检测到设备
* 测试微信公众号菜单 // 设置app的主包名和主类名(要启动应用包名和activity) //不要在会话前重置应用状态 //Android是否删除应用,IOS是否删除整个模拟器目录 //输入配置,是否启动Unicode输入法 //结束后是否切换回默认输入法 //滚动到指定位置点击 //进入对话框咨询三次
执行后查看获取到的页面源码,然后就可以愉快的玩耍了
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
这种代码符合常人的思维,但是没有扩展性
比如加新的付款方法,有活动,要改里面的付款流程等等,卧槽,想想就可怕,改一个地方,其他地方,BOOM的就炸了
要付款,付款的核心对象
这里面的user也应该是一个完整的对象
比如它的个人信息,邮箱之类的
一个付款的接口,统一的方法
卧槽,等会!!!!!!要是我的某一个付款平台变了,这个统一的接口肯定就不能要了,那我怎么办,用动态代理实现执行部分功能不就行了嘛
比如统一的接口肯定有一些什么用户校验之类的, 这些都是一样的,但是肯定有一些是不一样的,比如活动判断,我CNMD,NB啊
一个接口,各自的平台写各自的
来计算,这个项目里面多个付款渠道。它的平均的执行效率是什么
这可能是那个渠道方,要的数据
肯定是往数据库里面记的,我学了数据库了,总不能再往txt里面记录把
肯定不止一个渠道啊,而且之后要去掉这个功能怎么办,挨个删吗,删错了,没删干净怎么办??
1、代码严重重复:重复添加,重复删除
2、辅助性的业务功能代码与核心业务代码偶合在一起,代码混乱;很容易造成bug,不好调试维护,升级维护都困难
对!!!!!就整个,妈的,测个核心代码,我还有跑一下辅助代码,之前可烦死我了,我就是想知道核心代码的问题
3、万一之后我的计算时间有bug,或者计算逻辑要改,那就是一个一个个改,我超
什么叫做切面呢,这是一种概念
记录日志,首先建立一个日志对象
那个付款信息对象在这里
日志里面的方法,比如打印日志
我超,我好喜欢这节课,new了这个对象之后已经开始切面编程了,
就是我把辅助业务也封装成对象了
但是这个东西怎么用呢??
我要是把这个对象new 在这里,然后set数据进去,不是根之前一样了吗
动态代理就是jdk帮你实现静态代理
我是需要用一个静态代理把支付功能包进去吗
就是这个实现类对象里面的pay方法不满足需求了
因为它的pay方法里面只有核心的业务逻辑
我想在这个核心的代码前后 加上我的日志代码
笑死了,老师Date 转时间也不会了,老师说他一直用的都是工具类
要不在创建代理的时间,把支付类型放进去(肯定不用这种啊,多蛋疼啊)
要不直接通过 看它走的是哪个实现类 ,去通过反射获取它的类名,当做付款渠道
所以它的意思不过就是面向辅助对象编程????
真他吗是个高端的名字,其实就是套个壳,我真的吐了
执行耗时的对象,我已经给他插入进去了
对面向对象的理解更加深刻了,好耶!
如果不加东西的话,还是一样能吃
把他们分开了各自是各自的,在代理里面再把他们耦合在一起,因为他最终肯定要耦合在一起去用的,要不反射??
使业务逻辑各部分耦合度降低,提高程序的可重用性,同时明显的提高了开发的效率
因为我传进去的接口可能有好几个,所以他只能返回一个Object来
弄明白了家人们,老师课里面清清楚楚的讲过了,我还打了书签,但是我的笔记记得是个寄吧!!!!!!!!!!!!!!!!
这个代理类是存到内存上去的,现在把它保存到磁盘上
所以,他帮我创建了动态代理类,我还用了手动去掉之前的实现类的方法??应该不是,接着看
当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。
代理类的源码我看不懂,但是我看到了源码解读,看哪个注释,大概理解了一下
先这样吧,我大概有那么一点朦胧的印象 关于 动态代理怎么实现的
用了spring 这个对象就在容器里面了,所以要用spring的方法创建?我直接从容器里面拿不就行了吗
以add* 开头的,这也太只能了吧
代码还是混杂的,只不过是在代理类里面混杂的
错了,因为不确定性,最终里面只能获取到连接点信息
连接点信息,就是上面那一大堆
连接点和这个连接点方法,不一样
连接点信息是spring帮我封装起来的一堆东西
1.getMethods是获取类中所有公共方法,包括继承自父类的
2.getDeclaredMethods是获取类中自己声明的方法,即自己声明的任何权限的方法,包括私有方法
只要带mylog就是我的连接点方法
连接点方法,需要被扩展的方法
真的,我哭死,他太温柔了,还给我抛了一个异常,提醒我要别忘了异常环绕和最终环绕
所谓环,就是环绕着这个方法在执行了就是
我要悄悄的反射,然后惊艳所有人
又耦合回去了,真的我本来今天挺难受了,真是让我开心了一下,谢谢你 spring
这个里面可以直接调用 jp 来获取所有需要的属性
除了连接点信息,还能取到返回值信息
因为只更新一条数据,居然可以这么判断ture 和 fails
你看这个代码,多精炼我超
可能他返回的带-,那天打印看看
老师说这个在项目中是不用的。。。??
用aop的方式来做这件事,确实是辅助代码
之后最好用注解的方式,不用切入点表达式
表示带有这个注解的方法,都是我的切入点方法
我只能先这么理解了,这个东西网上看的太复杂了
1、Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
2、Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本
,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。
一句话理解ThreadLocal,向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就只属于这个线程了。
这个我在尚硅谷那里 已经用过了,相当于工具箱,尚硅谷,又是那个练习,呜呜呜,我真的,怎么会有那么好的课 啊
静态变量的创建时间,是比容器创建的时间要早的
老师好像有解决办法,但是说那是新技术,先不讲
这代码可太NB了,不知道能不能跑
@PostContruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
执行顺序还是不太懂,算了,。之后再说吧
所以没有事务注解的也可以 用统一最终通知
表示往那个类的哪个方法织入东西 已经往那个实现类织入了 最终通知了
这个注解是别名的意思吗
超了,我要是不懂 Alias 这个英文,这个知识点又要模模糊糊的过去了,学学英文然后去google问题啊,加油!!
获取到的是接口的方法???
这个地方,没有遍历,怎么判断的
懂了,只进了一个方法,不是进了一个数组