竟然可以用 Python 抓取公号文章保存成 PDF
off999 2024-12-01 02:18 14 浏览 0 评论
、
Python技术
人生苦短,我用 Python!
今天为大家介绍如何将自己喜欢的公众号的历史文章转成 PDF 保存到本地。前几天还有朋友再问,能不能帮把某某公众号的文章下载下来,因为他很喜欢这个号的文章,但由于微信上查看历史文章不能排序,一些较早期的文章翻很长时间才能找到,而且往往没有一次看不了几篇,下次还得再重头翻,想想就很痛苦。
抓取的思路
目前我在网上找了找,看到实现的方式大概分为以下三种:
- 通过手机和电脑相连,利用 Fiddler 抓包获取请求和返回报文,然后通过报文模拟请求实现批量下载。
- 通过搜狗浏览器或者用 wechatsogou 这个 Python 模块,去搜索公号后,实现批量下载。
- 通过公众号平台,这个需要你能登陆到公众号平台即可,剩下就比较简单。
整体来看最后一种方式是最简单的,接下来将以第三种方式为例,为大家介绍如何达到批量下载的目的。
获取 Cookie
首先我们登陆到公众号平台,登陆成功后会跳转到公众号管理首页,如下图:
然后我们在当前页面打开浏览器开发者工具,刷新下页面,在网络里就能看到各种请求,在这里我们点开一个请求 url,然后就能看到下图网络请求信息,里面包含请求的 Cookie 信息。
接下来我们需要把 Cookie 信息复制下来转换成 Json 格式串保存到文本文件里,以供后面请求链接时使用。这里需要写一段 Python 代码进行处理,新建文件 gen_cookies.py 写入代码如下:
# gen_cookies.pyimport 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 写了少量代码就实现文章的抓取和转换的工作,如果有兴趣你也可以试试。
python学习资料获取方式
右上角点击关注
评论区任意评论或者转发一下
做完1、2步,私信回复“学习”
私信不要多字,不要少字,不要错字,私信方法:点击我头像,进入主页面,右上角有私信功能,在关注的上方位置。
相关推荐
- Python钩子函数实现事件驱动系统(created钩子函数)
-
钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...
- Python函数(python函数题库及答案)
-
定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...
- Python技能:Pathlib面向对象操作路径,比os.path更现代!
-
在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...
- 使用Python实现智能物流系统优化与路径规划
-
阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...
- Python if 语句的系统化学习路径(python里的if语句案例)
-
以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...
- [Python] FastAPI基础:Path路径参数用法解析与实例
-
查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...
- Python小案例55- os模块执行文件路径
-
在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....
- python:os.path - 常用路径操作模块
-
应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...
- 原来如此:Python居然有6种模块路径搜索方式
-
点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...
- 每天10分钟,python进阶(25)(python进阶视频)
-
首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...
- python 打地鼠小游戏(打地鼠python程序设计说明)
-
给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...
- python线程之十:线程 threading 最终总结
-
小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...
- Python信号处理实战:使用signal模块响应系统事件
-
信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...
- Python多线程:让程序 “多线作战” 的秘密武器
-
一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...
- 用python写游戏之200行代码写个数字华容道
-
今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)