用 Python 抓取公号文章保存成 PDF

今天为大家介绍如何将自己喜欢的公众号的历史文章转成 PDF 保存到本地。前几天还有朋友再问,能不能帮把某某公众号的文章下载下来,因为他很喜欢这个号的文章,但由于微信上查看历史文章不能排序,一些较早期的文章翻很长时间才能找到,而且往往没有一次看不了几篇,下次还得再重头翻,想想就很痛苦。

抓取的思路

目前我在网上找了找,看到实现的方式大概分为以下三种:

  1. 通过手机和电脑相连,利用 Fiddler 抓包获取请求和返回报文,然后通过报文模拟请求实现批量下载。
  2. 通过搜狗浏览器或者用 wechatsogou 这个 Python 模块,去搜索公号后,实现批量下载。
  3. 通过公众号平台,这个需要你能登陆到公众号平台即可,剩下就比较简单。

整体来看最后一种方式是最简单的,接下来将以第三种方式为例,为大家介绍如何达到批量下载的目的。

获取 Cookie

首先我们登陆到公众号平台,登陆成功后会跳转到公众号管理首页,如下图:

然后我们在当前页面打开浏览器开发者工具,刷新下页面,在网络里就能看到各种请求,在这里我们点开一个请求 url,然后就能看到下图网络请求信息,里面包含请求的 Cookie 信息。

接下来我们需要把 Cookie 信息复制下来转换成 Json 格式串保存到文本文件里,以供后面请求链接时使用。这里需要写一段 Python 代码进行处理,新建文件 gen_cookies.py 写入代码如下:

# gen_cookies.py
import json
# 从浏览器中复制出来的 Cookie 字符串cookie_str = "pgv_pvid=9551991123; pac_uid=89sdjfklas; XWINDEXGREY=0; pgv_pvi=89273492834; tvfe_boss_uuid=lkjslkdf090; RK=lksdf900; ptcz=kjalsjdflkjklsjfdkljslkfdjljsdfk; ua_id=ioje9899fsndfklsdf-DKiowiekfjhsd0Dw=; h_uid=lkdlsodifsdf; mm_lang=zh_CN; ts_uid=0938450938405; mobileUV=98394jsdfjsd8sdf; \……中间部分省略 \ EXIV96Zg=sNOaZlBxE37T1tqbsOL/qzHBtiHUNZSxr6TMqpb8Z9k="
cookie = {}# 遍历 cookie 信息for cookies in cookie_str.split("; "): cookie_item = cookies.split("=") cookie[cookie_item[0]] = cookie_item[1]# 将cookies写入到本地文件with open('cookie.txt', "w") as file: # 写入文件 file.write(json.dumps(cookie))

好了,将 Cookie 写入文件后,接下来就来说下在哪里可以找到某公号的文章链接。

获取文章链接

在公号管理平台首页点击左侧素材管理菜单,进入素材管理页面,然后点击右侧的新建图文素材按钮,如下图:

进入新建图文素材页面,然后点击这里的超链接:

在编辑超链接的弹出框里,点击选择其他公众号的连接:

在这里我们就能通过搜索,输入关键字搜索我们想要找到公众号,比如在这里我们搜索 "Python 技术",就能看到如下搜索结果:

然后点击第一个 Python 技术的公众号,在这里我们就能看到这个公众号历史发布过的所有文章:

我们看到这里文章每页只显示五篇,一共分了31页,现在我们再打开自带的开发者工具,然后在列表下面点下一页的按钮,在网络中会看到向服务发送了一个请求,我们分析下这个请求的参数。

通过请求参数,我们大概可以分析出参数的意义, begin 是从第几篇文章开始,count 是一次查出几篇,fakeId 对应这个公号的唯一 Id,token 是通过 Cookie 信息来获取的。好了,知道这些我们就可以用 Python 写段代码去遍历请求,新建文件 gzh_download.py,代码如下:

# gzh_download.py# 引入模块import requestsimport jsonimport reimport randomimport timeimport pdfkit
# 打开 cookie.txtwith open("cookie.txt", "r") as file: cookie = file.read()cookies = json.loads(cookie)url = "https://mp.weixin.qq.com"#请求公号平台response = requests.get(url, cookies=cookies)# 从url中获取tokentoken = re.findall(r'token=(\d+)', str(response.url))[0]# 设置请求访问头信息headers = { "Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token=" + token + "&lang=zh_CN", "Host": "mp.weixin.qq.com", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",}
# 循环遍历前10页的文章for j in range(1, 10, 1): begin = (j-1)*5 # 请求当前页获取文章列表 requestUrl = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin="+str(begin)+"&count=5&fakeid=MzU1NDk2MzQyNg==&type=9&query=&token=" + token + "&lang=zh_CN&f=json&ajax=1" search_response = requests.get(requestUrl, cookies=cookies, headers=headers) # 获取到返回列表 Json 信息 re_text = search_response.json() list = re_text.get("app_msg_list") # 遍历当前页的文章列表 for i in list: # 将文章链接转换 pdf 下载到当前目录 pdfkit.from_url(i["link"], i["title"] + ".pdf") # 过快请求可能会被微信问候,这里进行10秒等待 time.sleep(10)

好了,就上面这点代码就够了,这里在将 URL 转成 PDF 时使用的是 pdfkit 的模块,使用这个需要先安装 wkhtmltopdf 这个工具,官网地址在文末给出,支持多操作系统,自己下载安装即可,这里就不再赘述。

安装完后,还需要再执行 pip3 install pdfkit 命令安装这个模块。安装好了,现在来执行下 python gzh_download.py 命令启动程序看下效果怎么样。

看来是成功了,这个工具还是很强大的。

总结

本文为大家介绍了如何通过分析公众号平台的功能,找到可以访问到某个公众号所有文章的链接,从而可以批量下载某公众号所有文章,并转为 PDF 格式保存到本地的目的。这里通过 Python 写了少量代码就实现文章的抓取和转换的工作,如果有兴趣你也可以试试。

参考

https://wkhtmltopdf.org/downloads.html

代码获取方式】

(0)

相关推荐

  • ENScan 一款企业信息收集工具

    背景 本项目为 狼组信息化平台 功能项目,该项目开源 程序主要对百度爱企查 API和接口进行封装可获取 企业基本信息(法人.电话.公司地址等等) 企业ICP备案号以及网站 企业APP信息 企业微信公众 ...

  • 认证授权基础

    认证授权基础

  • 听说现在买房就是给自己投资?Python爬取链家二手房楼盘!

    发现请求头信息如下,这个是后面要模拟的: Host: m.lianjia.com User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Ge ...

  • 用 Python 撸一个 Web 服务器-第8章:用户管理

    用户登录原理 用户登录与注册功能几乎已成为 Web 应用的标配.所以我们有必要给 Todo List 程序增加一个用户管理模块,以此来学习用户登录原理. HTTP 协议是无状态的,这意味着每个完整的 ...

  • 用 Python 抓取公号文章保存成 HTML

    上次为大家介绍了如果用 Python 抓取公号文章并保存成 PDF 文件存储到本地.但用这种方式下载的 PDF 只有文字没有图片,所以只适用于没有图片或图片不重要的公众号,那如果我想要图片和文字下载下 ...

  • 使用Python爬取公号文章(上)

    第一时间获取 Python 技术干货! 阅读文本大概需要 10 分钟. 01 抓取目标 场景:有时候我们想爬取某个大 V 的发布的全部的文章进行学习或者分析. 这个爬虫任务我们需要借助「 Charle ...

  • 医界公号文章这招提升门诊获客60%的转化!

    2020 年不少私立医疗机构门诊量骤减,但「疫苗」接种人次不减反升,成为民营诊所强有力的获客渠道,优质的儿科诊所通过疫苗接种,可以做到转化 60% 左右的患者体验看牙.过敏等产品. 目前 90% 的疫 ...

  • 搜狐肆意抓取公众号作者的稿件,这事有没有人管了?

    其实,搜狐网的这种抓取行为,是对微信公众号作者利益的极大侵害,自媒体作者辛辛苦苦构思题材.查找资料.原创撰写,应当是有自己的著作权的,理应得到国家法律的保护.另外,搜狐网还会恶意抢注今日头条作者的同名 ...

  • Python抓取必应搜索背景图片

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于编码珠玑 ,作者刘亚曦 Python爬虫.数据分析.网站开发等案例教程视频免费在线观 ...

  • Python 抓取知乎几千张小姐姐图片是什么体验?

    来源:Python 技术「ID: pythonall」 知乎上有许多关于颜值.身材的话题,有些话题的回复数甚至高达几百上千,拥有成千上万的关注者与被浏览数.如果我们在摸鱼的时候欣赏这些话题将花费大量的 ...

  • “杨春林的班”公号文章周年精选

    「您在教育上有任何问题,欢迎留言」 点上方蓝标即可关注我们的公众号 "杨春林的班"公号文章周年精选 ♡文/杨春林 时光嫣然,不经意间,"杨春林的班"开通一年了. ...

  • Python 抓取网页乱码原因分析

    在用 python2 抓取网页的时候,经常会遇到抓下来的内容显示出来是乱码. 发生这种情况的最大可能性就是编码问题:运行环境的字符编码和网页的字符编码不一致. 比如,在 windows 的控制台(gb ...

  • 『爬虫四步走』手把手教你使用Python抓取并存储网页数据!

    爬虫是Python的一个重要的应用,使用Python爬虫我们可以轻松的从互联网中抓取我们想要的数据,本文将基于爬取B站视频热搜榜单数据并存储为例,详细介绍Python爬虫的基本流程.如果你还在入门爬虫 ...