如何通过50行Python代码获取公众号全部文章

前言

我们平时阅读公众号的文章会遇到一个问题——阅读历史文章体验不好。

我们知道爬取公众号的方式常见的有两种:通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章。通过微信公众号的素材管理,获取公众号文章。缺点是需要申请自己的公众号。

今天介绍一种通过抓包PC端微信的方式去获取公众号文章的方法。相比其他的方法非常方便。

如上图,通过抓包工具获取微信的网络信息请求,我们发现每次下拉刷新文章的时候都会请求 mp.weixin.qq.com/mp/xxx (公众号不让添加主页链接,xxx表示profile_ext) 这个接口。

经过多次测试分析,用到了以下几个参数

  • __biz : 用户和公众号之间的唯一id
  • uin :用户的私密id
  • key :请求的秘钥,一段时候只会就会失效
  • offset :偏移量
  • count :每次请求的条数

数据如下

{
 "ret": 0,
 "errmsg": "ok", # 请求状态
 "msg_count": 10, # 信息条数
 "can_msg_continue": 1, # 是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
 "general_msg_list": "{"list":[]}", # 公众号文本信息
 "next_offset": 20,
 "video_count": 1,
 "use_video_tab": 1,
 "real_type": 0,
 "home_page_list": []
}

部分代码如下

 params = {
 '__biz': biz,
 'uin': uin,
 'key': key,
 'offset': offset,
 'count': count,
 'action': 'getmsg',
 'f': 'json'
 }
 headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
 }
 response = requests.get(url=url, params=params, headers=headers)
 resp_json = response.json()
 if resp_json.get('errmsg') == 'ok':
 resp_json = response.json()
 # 是否还有分页数据, 用于判断return的值
 can_msg_continue = resp_json['can_msg_continue']
 # 当前分页文章数
 msg_count = resp_json['msg_count']
 general_msg_list = json.loads(resp_json['general_msg_list'])
 list = general_msg_list.get('list')
 print(list, "**************")

最后打印的list就是公众号的文章信息详情。包括标题(titile)、摘要(digest)、文章地址(content_url)、阅读原文地址(source_url)、封面图(cover)、作者(author)等等...

输出结果如下:

[{
 "comm_msg_info": {
 "id": 1000000038,
 "type": 49,
 "datetime": 1560474000,
 "fakeid": "3881067844",
 "status": 2,
 "content": ""
 },
 "app_msg_ext_info": {
 "title": "入门爬虫,这一篇就够了!!!",
 "digest": "入门爬虫,这一篇就够了!!!",
 "content": "",
 "fileid": 0,
 "content_url": "http:XXXXXX",
 "source_url": "",
 "cover": "I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\/0?wx_fmt=jpeg",
 "subtype": 9,
 "is_multi": 0,
 "multi_app_msg_item_list": [],
 "author": "Python3X",
 "copyright_stat": 11,
 "duration": 0,
 "del_flag": 1,
 "item_show_type": 0,
 "audio_fileid": 0,
 "play_url": "",
 "malicious_title_reason_id": 0,
 "malicious_content_type": 0
 }
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]

获取数据之后,可以保存到数据库中,也可以将文章保存在PDF中。

1、保存在Mongo中

# Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
for i in list:
 app_msg_ext_info = i['app_msg_ext_info']
 # 标题
 title = app_msg_ext_info['title']
 # 文章地址
 content_url = app_msg_ext_info['content_url']
 # 封面图
 cover = app_msg_ext_info['cover']
 # 发布时间
 datetime = i['comm_msg_info']['datetime']
 datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
 mongo_wx.insert({
 'title': title,
 'content_url': content_url,
 'cover': cover,
 'datetime': datetime
 })

结果如下

2、导入到PDF文件中

Python3中常用的操作PDF的库有python-pdf和pdfkit。我用了pdfkit这个模块导出pdf文件。

pdfkit是工具包Wkhtmltopdf的封装类,因此需要安装Wkhtmltopdf才能使用。

可以访问 https://wkhtmltopdf.org/downloads.html下载和操作系统匹配的工具包。

实现代码也比较简单,只需要传入导入文件的url即可。

安装pdfkit库

pip3 install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
 import pdfkit
pdfkit.from_url('公众号文章地址', 'out.pdf')

运行之后成功导出pdf文件。

完整代码

import requests
import json
import time
from pymongo import MongoClient
url = 'http://mp.weixin.qq.com/mp/xxx'(公众号不让添加主页链接,xxx表示profile_ext)
# Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
def get_wx_article(biz, uin, key, index=0, count=10):
 offset = (index + 1) * count
 params = {
 '__biz': biz,
 'uin': uin,
 'key': key,
 'offset': offset,
 'count': count,
 'action': 'getmsg',
 'f': 'json'
 }
 headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
 }
 response = requests.get(url=url, params=params, headers=headers)
 resp_json = response.json()
 if resp_json.get('errmsg') == 'ok':
 resp_json = response.json()
 # 是否还有分页数据, 用于判断return的值
 can_msg_continue = resp_json['can_msg_continue']
 # 当前分页文章数
 msg_count = resp_json['msg_count']
 general_msg_list = json.loads(resp_json['general_msg_list'])
 list = general_msg_list.get('list')
 print(list, "**************")
 for i in list:
 app_msg_ext_info = i['app_msg_ext_info']
 # 标题
 title = app_msg_ext_info['title']
 # 文章地址
 content_url = app_msg_ext_info['content_url']
 # 封面图
 cover = app_msg_ext_info['cover']
 # 发布时间
 datetime = i['comm_msg_info']['datetime']
 datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
 mongo_wx.insert({
 'title': title,
 'content_url': content_url,
 'cover': cover,
 'datetime': datetime
 })
 if can_msg_continue == 1:
 return True
 return False
 else:
 print('获取文章异常...')
 return False
if __name__ == '__main__':
 biz = 'Mzg4MTA2Nzg0NA=='
 uin = 'NDIyMTI5NDM1'
 key = '20a680e825f03f1e7f38f326772e54e7dc0fd02ffba17e92730ba3f0a0329c5ed310b0bd55b3c0b1f122e5896c6261df2eaea4036ab5a5d32dbdbcb0a638f5f3605cf1821decf486bb6eb4d92d36c620'
 index = 0
 while 1:
 print(f'开始抓取公众号第{index + 1} 页文章.')
 flag = get_wx_article(biz, uin, key, index=index)
 # 防止和谐,暂停8秒
 time.sleep(8)
 index += 1
 if not flag:
 print('公众号文章已全部抓取完毕,退出程序.')
 break
 print(f'..........准备抓取公众号第{index + 1} 页文章.')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python爬取微信公众号文章的方法

    最近在学习Python3网络爬虫开发实践(崔庆才 著)刚好也学习到他使用代理爬取公众号文章这里,但是照着他的代码写,出现了一些问题.在这里我用到了这本书的前面讲的一些内容进行了完善.(作者写这个代码已经是半年前的事了,但腾讯的网站在这半年前进行了更新) 下面我直接上代码: TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive

  • python爬取微信公众号文章

    本文实例为大家分享了python爬取微信公众号文章的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from requests.exceptions import RequestException import time import random import MySQLdb import threading import socket import math soc

  • python爬取指定微信公众号文章

    本文实例为大家分享了python爬取微信公众号文章的具体代码,供大家参考,具体内容如下 该方法是依赖于urllib2库来完成的,首先你需要安装好你的python环境,然后安装urllib2库 程序的起始方法(返回值是公众号文章列表): def openUrl(): print("启动爬虫,打开搜狗搜索微信界面") # 加载页面 url = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query=要爬取的公众号名

  • python采集微信公众号文章

    本文实例为大家分享了python采集微信公众号文章的具体代码,供大家参考,具体内容如下 在python一个子目录里存2个文件,分别是:采集公众号文章.py和config.py. 代码如下: 1.采集公众号文章.py from urllib.parse import urlencode import pymongo import requests from lxml.etree import XMLSyntaxError from requests.exceptions import Connec

  • Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)

    背景说明 感觉微信公众号算得是比较难爬的平台之一,不过一番折腾之后还是小有收获的.没有用Scrapy(估计爬太快也有反爬限制),但后面会开始整理写一些实战出来.简单介绍下本次的开发环境: python3 requests psycopg2 (操作postgres数据库) 抓包分析 本次实战对抓取的公众号没有限制,但不同公众号每次抓取之前都要进行分析.打开Fiddler,将手机配置好相关代理,为避免干扰过多,这里给Fiddler加个过滤规则,只需要指定微信域名mp.weixin.qq.com就好:

  • python抓取搜狗微信公众号文章

    初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql # 创建连接 conn = pymysql.connect(host='你的数据库地址', port=端口, user='用户名', passwd='密码', db='数据库名称', charset='utf8') # 创建游标 cursor = conn.cursor() cursor.execute("sel

  • 如何通过50行Python代码获取公众号全部文章

    前言 我们平时阅读公众号的文章会遇到一个问题--阅读历史文章体验不好. 我们知道爬取公众号的方式常见的有两种:通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章.通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自己的公众号. 今天介绍一种通过抓包PC端微信的方式去获取公众号文章的方法.相比其他的方法非常方便. 如上图,通过抓包工具获取微信的网络信息请求,我们发现每次下拉刷新文章的时候都会请求 mp.weixin.qq.com/mp/xxx (公众号不让添加主页链接,xxx表示profi

  • 50行Python代码获取高考志愿信息的实现方法

    最近遇到个任务,需要将高考志愿信息保存成Excel表格,BOSS丢给我一个网址表格之后就让我自己干了.虽然我以前也学习过Python编写爬虫的知识,不过时间长了忘了,于是摸索了一天之后终于完成了任务.不得不说,Python干这个还是挺容易的,最后写完一看代码,只用了50行就完成了任务. 准备工作 首先明确一下任务.首先我们要从网址表格中读取到一大串网址,然后访问每个网址,获取到页面上的学校信息,然后将它们在写到另一个Excel中.显然,我们需要一个爬虫库和一个Excel库来帮助我们完成任务. 第

  • 只用50行Python代码爬取网络美女高清图片

    一.技术路线 requests:网页请求 BeautifulSoup:解析html网页 re:正则表达式,提取html网页信息 os:保存文件 import re import requests import os from bs4 import BeautifulSoup 二.获取网页信息 常规操作,获取网页信息的固定格式,返回的字符串格式的网页内容,其中headers参数可模拟人为的操作,'欺骗'网站不被发现 def getHtml(url): #固定格式,获取html内容 headers

  • 50行Python代码实现人脸检测功能

    现在的人脸识别技术已经得到了非常广泛的应用,支付领域.身份验证.美颜相机里都有它的应用.用iPhone的同学们应该对下面的功能比较熟悉 iPhone的照片中有一个"人物"的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术. 这篇文章主要介绍怎样用Python实现人脸检测.人脸检测是人脸识别的基础.人脸检测的目的是识别出照片里的人脸并定位面部特征点,人脸识别是在人脸检测的基础上进一步告诉你这个人是谁. 好了,介绍就到这里.接下来,开始准备我们的环境. 准备工作 本文的人

  • 使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym,只使用 Numpy 来创建 agent. 各位看官好,我(作者 Mike Shi--译者注)将在本文教大家如何用 50 行 Python 代码,教会 AI 玩一个简单的平衡游戏.我们会用到标准的 OpenAI Gym 作为测试环境,仅用 Numpy 创建我们的 AI,别的不用. 这个小游戏就是经典的

  • 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等场景. 目标检测的根本任务就是将图片或者视频中感兴趣的目标提取出来,目标的识别可以基于颜色.纹理.形状.其中颜色属性运用十分广泛,也比较容易实现.下面就向大家分享一个我做的小实验---通过OpenCV的Python接口来实现从视频中进行颜色识别和跟踪. 下面就是我们完整的代码实现(已调试运行): i

  • python下载微信公众号相关文章

    本文实例为大家分享了python下载微信公众号相关文章的具体代码,供大家参考,具体内容如下 目的:从零开始学自动化测试公众号中下载"pytest"一系列文档 1.搜索微信号文章关键字搜索 2.对搜索结果前N页进行解析,获取文章标题和对应URL 主要使用的是requests和bs4中的Beautifulsoup Weixin.py import requests from urllib.parse import quote from bs4 import BeautifulSoup im

  • 仅用50行Python代码实现一个简单的代理服务器

    之前遇到一个场景是这样的: 我在自己的电脑上需要用mongodb图形客户端,但是mongodb的服务器地址没有对外网开放,只能通过先登录主机A,然后再从A连接mongodb服务器B. 本来想通过ssh端口转发的,但是我没有从机器A连接ssh到B的权限.于是就自己用python写一个. 原理很简单. 1.开一个socket server监听连接请求 2.每接受一个客户端的连接请求,就往要转发的地址建一条连接请求.即client->proxy->forward.proxy既是socket服务端(监

  • 使用Python获取公众号下所有的文章

    导出公众号所有文章 随着互联网的不断发展,网络上兴起了很多的自媒体平台.不用我说,相信大家也能知道当下非常流行的平台都有哪些. 可以说凡是比较知名的自媒体,都有自己的公众号.但是平台的创新与出现可谓层出不穷,如果需要入住平台,肯定需要获取原平台的历史资源. 比如说微信公众号,我们就需要获取微信公众号的文章,将其导出后,入住其他的平台,那么如何获取自己公众号下的所有文章呢? 开发者ID与开发者密码 其实,公众号给我们开发中提供了非常友好的接口,并不需要我们一个一个去爬,就可以获取文章的所有链接.

  • 11行Python代码实现解密摩斯密码

    目录 1.引言 2.代码示例 2.1摩尔斯电码科普 2.2 加密 2.3 解密 3.总结 1.引言 小屌丝:鱼哥,快来求助求助! 小鱼:嗯? 啥事,让你这么慌慌张张的? 小屌丝:刚刚我女神给我发古来这一段符号,我不知道啥意思,能不能帮我翻译一下? 小鱼:啥符号? 小屌丝:这个"… …-- --… —… …— … …-- —… —… -----" 小鱼:这… 这不是摩斯密码吗,你女神啥时候这么厉害了? 小屌丝:鱼哥,别管那么多了,快看看能不能翻译出啥意思,万一是我的女神要找我压马路呢?

随机推荐