当前位置:   article > 正文

如何使用 Python 爬取微信公众号文章_python拷贝微信公众号文字csdn

python拷贝微信公众号文字csdn

我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章。但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦。

于是便想着能不能把某个公众号所有的文章都保存下来,这样就很方便自己阅读历史文章了。

话不多说,下面我就介绍如何使用 Python 爬取微信公众号所有文章的。

主要有以下步骤:

1 使用 Fiddler 抓取公众号接口数据

2 使用 Python 脚本获取公众号所有历史文章数据

3 保存历史文章

Fiddler 抓包

Fiddler 是一款抓包工具,可以监听网络通讯数据,开发测试过程中非常有用,这里不多做介绍。没有使用过的可以查看这篇文章,很容易上手。

https://blog.csdn.net/jingjingshizhu/article/details/80566191

接下来,使用微信桌面客户端,打开某个公众号的历史文章,这里以我的公众号举例,如下图。

如果你的 fiddler 配置好了的话,能够看到如下图的数据。

图中包含抓取的 url、一些重要的参数和我们想要的数据。

这些参数中,offset 控制着翻页,其他参数在每一页中都是固定不变的。

接口返回的数据结构如下图,其中 can_msg_continue 字段控制着能否翻页,1 表示还有下一页,0 表示没有已经是最后一页了。 next_offset 字段就是下一次请求的 offset 参数。

构造请求,获取数据

接下来我们的目标就是根据 url 和一些参数,构建请求,获取标题、文章 url 和日期等数据,保存数据。

保存数据一种是使用 pdfkit 将 文章 url 保存为 pdf 文件;另一种是先保存 html 文件,然后将 html 制作成 chm 文件。

1 将 文章 url 保存为 pdf 文件,关键代码如下:

  1. def parse(index, biz, uin, key):
  2. # url前缀
  3. url = "https://mp.weixin.qq.com/mp/profile_ext"
  4. # 请求头
  5. headers = {
  6. "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 "
  7. "Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 "
  8. "QQBrowser/9.0.2524.400",
  9. }
  10. proxies = {
  11. 'https': None,
  12. 'http': None,
  13. }
  14. # 重要参数
  15. param = {
  16. 'action': 'getmsg',
  17. '__biz': biz,
  18. 'f': 'json',
  19. 'offset': index * 10,
  20. 'count': '10',
  21. 'is_ok': '1',
  22. 'scene': '124',
  23. 'uin': uin,
  24. 'key': key,
  25. 'wxtoken': '',
  26. 'x5': '0',
  27. }
  28. # 发送请求,获取响应
  29. response = requests.get(url, headers=headers, params=param, proxies=proxies)
  30. response_dict = response.json()
  31. print(response_dict)
  32. next_offset = response_dict['next_offset']
  33. can_msg_continue = response_dict['can_msg_continue']
  34. general_msg_list = response_dict['general_msg_list']
  35. data_list = json.loads(general_msg_list)['list']
  36. # print(data_list)
  37. for data in data_list:
  38. try:
  39. # 文章发布时间
  40. datetime = data['comm_msg_info']['datetime']
  41. date = time.strftime('%Y-%m-%d', time.localtime(datetime))
  42. msg_info = data['app_msg_ext_info']
  43. # 文章标题
  44. title = msg_info['title']
  45. # 文章链接
  46. url = msg_info['content_url']
  47. # 自己定义存储路径(绝对路径)
  48. pdfkit.from_url(url, 'C:/Users/admin/Desktop/wechat_to_pdf/' + date + title + '.pdf')
  49. print(title + date + '成功')
  50. except:
  51. print("不是图文消息")
  52. if can_msg_continue == 1:
  53. return True
  54. else:
  55. print('爬取完毕')
  56. return False

2 保存 html 文件,关键代码如下

  1. def parse(index, biz, uin, key):
  2. # url前缀
  3. url = "https://mp.weixin.qq.com/mp/profile_ext"
  4. # 请求头
  5. headers = {
  6. "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 "
  7. "Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 "
  8. "QQBrowser/9.0.2524.400",
  9. }
  10. proxies = {
  11. 'https': None,
  12. 'http': None,
  13. }
  14. # 重要参数
  15. param = {
  16. 'action': 'getmsg',
  17. '__biz': biz,
  18. 'f': 'json',
  19. 'offset': index * 10,
  20. 'count': '10',
  21. 'is_ok': '1',
  22. 'scene': '124',
  23. 'uin': uin,
  24. 'key': key,
  25. 'wxtoken': '',
  26. 'x5': '0',
  27. }
  28. # 发送请求,获取响应
  29. reponse = requests.get(url, headers=headers, params=param, proxies=proxies)
  30. reponse_dict = reponse.json()
  31. # print(reponse_dict)
  32. next_offset = reponse_dict['next_offset']
  33. can_msg_continue = reponse_dict['can_msg_continue']
  34. general_msg_list = reponse_dict['general_msg_list']
  35. data_list = json.loads(general_msg_list)['list']
  36. print(data_list)
  37. for data in data_list:
  38. try:
  39. datetime = data['comm_msg_info']['datetime']
  40. date = time.strftime('%Y-%m-%d', time.localtime(datetime))
  41. msg_info = data['app_msg_ext_info']
  42. # 标题
  43. title = msg_info['title']
  44. # 内容的url
  45. url = msg_info['content_url'].replace("\\", "").replace("http", "https")
  46. url = html.unescape(url)
  47. print(url)
  48. res = requests.get(url, headers=headers, proxies=proxies)
  49. with open('C:/Users/admin/Desktop/test/' + title + '.html', 'wb+') as f:
  50. f.write(res.content)
  51. print(title + date + '成功')
  52. except:
  53. print("不是图文消息")
  54. if can_msg_continue == 1:
  55. return True
  56. else:
  57. print('全部获取完毕')
  58. return False

保存文章

保存为 pdf 文件,用到了 python 的第三方库 pdfkit 和 wkhtmltopdf。

安装 pdfkit:

pip install pdfkit

安装 wkhtmltopdf:

下载地址:

https://wkhtmltopdf.org/downloads.html

安装后将 wkhtmltopdf 目录下的 bin 添加到环境变量中。

保存为 chm 文件,可以下载 Easy CHM ,使用这个软件可以将 html 制作成 chm,使用教程网上比较多。

下载地址:

http://www.etextwizard.com/cn/easychm.html

效果图:

pdf 和 chm 对比

pdf 支持多终端,阅读体验好,但是有个大坑,就是微信文章保存的 pdf 没有图片,很影响阅读体验,暂未找到解决办法。

chm 的好处是可以建立索引,查看文章方便。一个公众号制作成一个 chm 文件,管理方便。不会出现图片不显示问题。

所以推荐将爬取到的公众号文章保存为 chm 文件,方便阅读。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/216580
推荐阅读
相关标签
  

闽ICP备14008679号