所以本次爬虫的目标很简单:
1. 获取公众号所有文章的标题和正文
2. 获取所有文章的发表时间
3. 获取所有文章的链接
4. 获取文章的评论(可选)
5. 获取到的文章与原文一致,最好文章可编辑,文中图片正常,文内链接可跳转
6. 分析文章并重新排版(待定,目前还没准备好分析的要点)
想要实现的功能没有涉及数据分析,所以操作还是很简单的
1. 准备一个微信个人公众号
2. 电脑已安装python
3. 代码执行时,部分模块需要安装,安装语句:pip install 包名
- wechatsogou 抓取公众号文章库,安装这个包会把oupsieve, beautifulsoup4, Pillow, lxml, future, bs4包也安装了
- Werkzeug WSGI⼯具库, 如Client类,EnvironBuilder类,debugg工具,这个库默认存在的,但是1.0.1版本的werkzeug.contrib已经被移除了,所以我们要卸载原版本,并安装更高的版本
步骤:pip3 uninstall Werkzeug
pip3 install Werkzeug==0.11.15 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
- pdfkit 用于Node和浏览器的PDF文档生成库
- wkhtmltopdf 可以将html文件转化成pdf文件,需要先下载wkhtmltopdf命令行工具,根据自己的电脑型号下载,下载地址:https://wkhtmltopdf.org/downloads.html
下载后解压并安装,记录下安装路径
原因
由于我们查看的微信公众号的文章链接都是随机生成的,如果在前端想要获取往期推送的所有文章,就需要手动点开一个个复制,非常麻烦,所以我们用一个网上常规的方法,准备一个个人公众号,后台获取长期链接
获取步骤:
1)登录个人公众号,点击草稿箱》新的创作》写新图文》点击超链接
2)选择需要抓取的公众号,按F12获取一个开头为“appmsg”开头的url
3)解析该url
https://mp.weixin.qq.com/cgi-bin/appmsg 请求的基础部分
?action=list_ex 常用于动态网站,实现不同的参数值而生成不同的页面或者返回不同的结果
&begin=0&count=5&fakeid=MzIwMTIzNDMwNA==&type=9&query=&token=318406675&lang=zh_CN&f=json&ajax=1 设置参数
4)设置url
count:一次请求返回的个数
begin:当前请求的页数,当begin为0时,请求后返回最新的5篇文章
只有url是无法访问的,因为我们获取url时是登录了个人公众号的,直接用python访问是未登录的,所以我们还得获取请求头。
1)新建一个yaml文件,存入我们公众号的标识符以及参数
2)解析yaml文件
接口访问需要的内容我们准备好了,接下来我们先试下单个接口抓取公众号最新文章,看下准备的数据是否正确,同时看下接口的返回值,找出我们需要的内容
操作步骤:
1)进入cmd页面,输入python进入python编译器
2) 导入requests 模块,执行gel接口,接口里的cookie和agent信息是上面步骤1.2获取的,需要自己手动填入,下图可以看出我们抓取成功了
解析json返回值
下图是接口的返回信息,可以看出对我们有用的信息有:文章id,文章创建时间,文章链接,文章标题
现在我们已经准备好接口了,开始抓取公众号所有文章,由于不知道公众号具体有多少文章,所以采用循环的方式抓取,直到所有文章抓取完成。同时代码还实现了跳过之前已抓取部分,但是仍有很多不合理的地方,比如在公众号发了新文后,就会有少量重复数据,以及之前抓取过的话,会导致最新文章抓不到,等等。因为这个写的比较简易,大家可以自行优化。
附上代码:
从前面步骤2.1可以知道,接口的返回结果中,我们有用的只有文章id,文章标题,文章创建时间,文章链接,我们可以把步骤2.2的代码优化下,将接口返回的这些数据提取出来,写入csv文件中。
附上代码:
可将如下代码插叙步骤2.2的代码中
输出结果如下图:
到这里,我们现在就还差正文信息了,而这才是我最想要的内容,但是使用python直接访问url的话获取到的内容并不是我们想要的文章内容,而是html文件,所以在这一步我试了几种方法去实现,一开始想的是存储文章的图片到csv中,方便查看,但是最终放弃了,使用了下方的第4种。
1)第一种:使用正则。通过正则在html中筛选出自己要的内容,这个太麻烦了,还得自己对文章排版,直接pass了
2) 第二种:使用BeautifulSoup库。 BeautifulSoup库的解析数据功能强大,可以通过直接获取文本,这个我用了后发现它提取出了很多页面的多余字符,比如点赞,收藏等,而且只有文本,要想插入其他信息还得根据标签提取,太麻烦了。写了段简单的代码测试功能,这个用来处理纯文本还是很方便的。所以该方案也被pass了
想要学习该方法的可以看下这个链接:https://blog.csdn.net/weixin_54852327/article/details/115916146
3)第三种:使用selenium截图搭配PIL处理图片。selenium截取图片很方便,这种方式可以原生态的保留文章信息,缺点是无法编辑。顺便处理了下长文章截图不全问题,属于我的备选方案。
附上代码:
4)第四种:使用pdfkit。直接将url处理成pdf文档,该方法简单方便,转换的pdf文档内容与原文章排版一致,文档内容可以自行加批注,文内链接也可点击,还可以自己设置标题和正文,推荐使用。
使用该方法的时候,我发现如果直接用的话,会显示不了文章中的图片,所以优化了下代码。
附上代码:
到了这里,我们整个流程就结束了,还剩下一些优化,比如pdf合并,pdf文档排版优化,日志打印,以及代码模块化等等,大家可以自行优化。