接下来,我们将探讨如何从微信朋友圈中抓取数据。
直接使用Charles或mitmproxy来微信朋友圈的接口数据并非易事,因为数据都是经过加理的。而Appium作为一个自动化测试工具,则能有效地模拟App的操作并获取当前展示的内容。只要App界面上显示了所需的信息,我们便能利用Appium将其抓取下来。
以Android平台为例,本节将介绍如何抓取微信朋友圈的动态内容。这些动态信息包括好友昵称、正文以及发布日期。对于发布日期,我们需要进行格式转换,例如将“1小时前”转换为具体的日期后保存至MongoDB数据库。
在开始之前,请确保您的PC已安装好Appium、Android开发环境以及Python版本的Appium API。确保您的Android手机已安装微信App、PyMongo库,并且MongoDB服务已启动。具体的安装方法可以参考第一章的内容。
我们需要创建一个名为Moments的类,并进行一些初始化配置,如下所述:
这个类将进行一系列的初始化工作,包括驱动配置、延时等待设置、以及与MongoDB的连接配置等。
接下来,我们将实施登录微信的步骤。点击登录按钮,输入用户名和密码,提交即可完成登录。以下是一个简单的实现示例:
这个过程涉及一些点击和输入操作,虽然不同平台和版本间可能存在差异,但此例仍具有一定的参考价值。
完成登录后,我们将进入朋友圈页面。选择朋友圈选项卡,点击朋友圈按钮,即可进入朋友圈页面,以下是代码实现示例:
现在,我们可以开始实际的抓取工作了。
由于朋友圈内容可以通过拖动不断刷新,因此我们需要模拟一个无限拖动的操作,实现方法如下:
我们使用swipe()方法,通过传入起始和终止点的坐标来实现拖动效果,并加入无限循环以实现无限拖动。
获取当前显示的朋友圈中每条动态的区块元素后,我们需要遍历这些区块元素。对于每个区块元素,我们再获取其内部显示的昵称、正文和发布时间。以下是代码实现示例:
在这个过程中,我们将遍历每条动态。对于每条动态,我们使用find_element_by_id()方法获取昵称、正文和发布日期对应的元素,然后通过get_attribute()方法获取这些内容。这样我们就能成功获取到朋友圈的每条动态信息了。
关于日期的处理,我们调用了一个Processor类的date()方法。这个方法的实现如下:
该方法使用正则表达式来提取时间中的具体数值,然后利用时间转换函数来实现时间的转换。例如,如果时间是“5分钟前”,该方法将先提取出5这个数值,接着用当前时间戳减去相应的秒数来得到发布时间的时间戳,最后再将时间戳转化为标准时间格式。
我们将调用MongoDB的API来存储爬取的结果。为了去除重复数据,我们使用了update()方法。以下是其实现示例:
根据昵称和正文进行信息查询。如果数据库中不存在该信息,则插入新数据;如果存在,则更新原有数据。这个操作的关键在于第三个参数设为True。这个参数的作用是实现“存在即更新、不存在则插入”的逻辑。
通过调用以上几个方法,我们便能实现一个方法,用于启动整个爬取过程。以下是代码实现示例:
如此一来,我们就完成了整个微信朋友圈的爬虫编写。当代码运行时,手机微信将被启动并成功进入朋友圈页面,然后开始执行持续的拖动操作。控制台将输出相应的爬取结果,这些结果将被保存至MongoDB数据库中。
您可前往MongoDB查看爬取结果,如图11-46所示。在此图中,您将看到朋友圈的数据已成功保存在数据库中。
本节源代码可在以下地址获取:/Python3WebSpider/Moments。