Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用 Python 爬取微信公众号文章?

如何使用 Python 爬取微信公众号文章?

作者头像
纯洁的微笑
发布于 2020-03-02 10:06:19
发布于 2020-03-02 10:06:19
5K10
代码可运行
举报
文章被收录于专栏:纯洁的微笑纯洁的微笑
运行总次数:0
代码可运行

有时候我们遇到一个好的公众号,里面的每篇都是值得反复阅读的,这时就可以使用公众号爬虫将内容抓取保存下来慢慢赏析。

安装 Fiddler

Fiddler 的下载地址为:https://www.telerik.com/download/fiddler ,安装好之后,确保手机和电脑的网络为同一个局域网。

Finddler 的配置

点击 Tools >> Options >> Connections 面板,参考下图配置,Fiddler 的默认端口为 8888,如果 8888 端口被占用了,可修改为其他端口。

点击 Tools >> Options >> HTTPS 面板,参考下图配置

Android 手机配置

进入 WLAN 设置,选择当前所在局域网的 WIFI 设置,代理设置为 手动 ,代理服务器主机名为 Finddler 中 右上角 Online 点击显示,端口号为 8888。

在手机浏览器中访问配置的地址:http://ip:8888,当显示 Fiddler Echo Service,则配置手机成功。

Finddler 为了拦截 HTTPS 请求,手机中必须安装 CA 证书,在 http://ip:8888 也中点击 FiddlerRoot certificate,下载并安装证书。此时配置工作全部完成。

微信历史页面

以 【腾旭大申网】为例,点击【上海新闻】菜单的二级菜单【历史消息】。

观察 Fiddler 的变化,此时在左侧窗口中会陆续出现多个URL连接地址,这个就是 Fiddler 拦截的 Android 请求。

  1. Result:服务器的响应结果
  2. Protocol:请求协议,微信协议都是 HTTPS 所以需要在手机端和PC端安装证书
  3. HOST:主机名
  4. URL:URL 地址

其中有一条以https://mp.weixin.qq .com/mp/profile_ext?action=home... 开头的URL就是我们需要的。点击 右侧 Inspectors 面板,再点击下面的 Headers 和 WebView 面板,会出现如下图样

Headers 面板

  1. Request Headers:请求行,里面有请求方式、请求地址、请求协议等待
  2. Client、Cookies:请求头

WebView 面板

WebView 面板显示的是服务器返回的 HTML 代码渲染后的结果,Textview 面板则显示的为服务器返回的 HTML 源代码

抓取历史页面

在上一节中公众号消息历史页面已经可以显示在 Fiddler 的 WebView 面板了,这一节则使用 Python 抓取历史页面。创建一个名为 wxcrawler.py 的脚本,抓取页面我们需要 URL 地址和 HEADER 请求头,直接从 Finddler 中拷贝

把 header 转换为 Json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding:utf-8
import requests

class WxCrawler(object):

    # 复制出来的 Headers,注意这个 x-wechat-key,有时间限制,会过期。当返回的内容出现 验证 的情况,就需要换 x-wechat-key 了
    headers = """Connection: keep-alive
        x-wechat-uin: MTY4MTI3NDIxNg%3D%3D
        x-wechat-key: 5ab2dd82e79bc5343ac5fb7fd20d72509db0ee1772b1043c894b24d441af288ae942feb4cfb4d234f00a4a5ab88c5b625d415b83df4b536d99befc096448d80cfd5a7fcd33380341aa592d070b1399a1
        Upgrade-Insecure-Requests: 1
        User-Agent: Mozilla/5.0 (Linux; Android 10; GM1900 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 XWEB/992 MMWEBSDK/191102 Mobile Safari/537.36 MMWEBID/7220 MicroMessenger/7.0.9.1560(0x27000933) Process/toolsmp NetType/WIFI Language/zh_CN ABI/arm64
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/wxpic,image/apng,*/*;q=0.8
        Accept-Encoding: gzip, deflate
        Accept-Language: zh-CN,en-US;q=0.9
        Cookie: wxuin=1681274216; devicetype=android-29; version=27000933; lang=zh_CN; pass_ticket=JvAJfzySl6uLWYdYwzyQ+4OqrqiZ2zfaI4F2OCVR7omYOmTjYNKalCFbr75X+T6K; rewardsn=; wxtokenkey=777; wap_sid2=COjq2KEGElxBTmotQWtVY2Iwb3BZRkIzd0Y0SnpaUG1HNTQ0SDA4UGJOZi1kaFdFbkl1MHUyYkRKX2xiWFU5VVhDNXBkQlY0U0pRXzlCZW9qZ29oYW9DWmZYOTdmQTBFQUFBfjD+hInvBTgNQJVO
        X-Requested-With: com.tencent.mm"""

    url = "https://mp.weixin.qq .com/mp/profile_ext?action=home&__biz=MjEwNDI4NTA2MQ==&scene=123&devicetype=android-29&version=27000933&lang=zh_CN&nettype=WIFI&a8scene=7&session_us=wxid_2574365742721&pass_ticket=JvAJfzySl6uLWYdYwzyQ%2B4OqrqiZ2zfaI4F2OCVR7omYOmTjYNKalCFbr75X%2BT6K&wx_header=1"


    # 将 Headers 转换为 字典
    def header_to_dict(self):
        headers = self.headers.split("\n")
        headers_dict = dict()
        for h in headers:
            k,v = h.split(":")
            headers_dict[k.strip()] = v.strip()
        return headers_dict;


    def run(self):
        headers = self.header_to_dict()
        response = requests.get(self.url, headers=headers, verify=False)

        print(response.text)


if __name__ == "__main__":

    wx = WxCrawler()
    wx.run()

下图就是打印在控制台的内容,其中在 JavaScript 中 变量 msgList 的值就是需要的内容

接下来就是提取 msgList 内容,使用正则表达式提取内容,返回一个文章列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import html
import json

def article_list(self, context):
    rex = "msgList = '({.*?})'"
    pattern = re.compile(pattern=rex, flags=re.S)
    match = pattern.search(context)
    if match:
        data = match.group(1)
        data = html.unescape(data)
        data = json.loads(data)
        articles = data.get("list")
        return articles

下面就是解析 msgList 的结果

  1. title:文章标题
  2. content_url:文章链接
  3. source_url:原文链接,有可能为空
  4. digest:摘要
  5. cover:封面图
  6. datetime:推送时间

其他的内容保存在 multi_app_msg_item_list 中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'comm_msg_info': 
    {
        'id': 1000033457, 
        'type': 49, 
        'datetime': 1575101627, 
        'fakeid': '2104285061', 
        'status': 2, 
        'content': ''
    }, 
    'app_msg_ext_info': 
    {
        'title': '快查手机!5000多张人脸照正被贱卖,数据曝光令人触目惊心!', 
        'digest': '谁有权收集人脸信息?', 
        'content': '', 
        'fileid': 0, 
      'content_url': 'http:\\/\\/mp.weixin.qq.com\\/s?__biz=MjEwNDI4NTA2MQ==&mid=2651824634&idx=1&sn=3e4c8eb35abb1b09a4077064ba0c44c8&chksm=4ea8211079dfa8065435409f4d3d3538ad28ddc197063a7e1820dafb9ee23beefca59c3b32d4&scene=27#wechat_redirect', 
        'source_url': '', 
        'cover': 'http:\\/\\/mmbiz.qpic.cn\\/mmbiz_jpg\\/G8vkERUJibkstwkIvXB960sMOyQdYF2x2qibTxAIq2eUljRbB6zqBq6ziaiaVqm8GtEWticE6zAYGUYqKJ3SMuvv1EQ\\/0?wx_fmt=jpeg', 
        'subtype': 9, 
        'is_multi': 1, 
        'multi_app_msg_item_list': 
            [{
                'title': '先有鸡还是先有蛋?6.1亿年前的胚胎化石揭晓了', 
                'digest': '解决了困扰大申君20多年的问题', 
                'content': '', 
                'fileid': 0, 
                'content_url': 'http:\\/\\/mp.weixin.qq.com\\/s?__biz=MjEwNDI4NTA2MQ==&mid=2651824634&idx=2&sn=07b95d31efa9f56d460a16bca817f30d&chksm=4ea8211079dfa8068f42bf0e5df076a95ee3c24cab71294632fe587bcc9238c1a7fb7cd9629b&scene=27#wechat_redirect', 
                'source_url': '', 
                'cover': 'http:\\/\\/mmbiz.qpic.cn\\/mmbiz_jpg\\/yl6JkZAE3S92BESibpZgTPE1BcBhSLiaGOgpgVicaLdkIXGExe3mYdyVkE2SDXL1x2lFxldeXu8qXQYwtnx9vibibzQ\\/0?wx_fmt=jpeg', 
                'author': '', 
                'copyright_stat': 100, 
                'del_flag': 1, 
                'item_show_type': 0, 
                'audio_fileid': 0, 
                'duration': 0, 
                'play_url': '', 
                'malicious_title_reason_id': 0, 
                'malicious_content_type': 0
             }, 
             {
                 'title': '外交部惊现“李佳琦”!网友直呼:“OMG被种草了!”', 
                 'digest': '种草了!', 
                 'content': '', ...}
            ...]
抓取单个页面

在上节中我们可以得到 app_msg_ext_info 中的 content_url 地址了,这是需要从 comm_msg_info 这个不规则的 Json 中取出。这是需要使用 demjson 模块补全不规则的 comm_msg_info。

安装 demjson 模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install demjson
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import demjson

# 获取单个文章的URL
content_url_array = []

def content_url(self, articles):
    content_url = []
    for a in articles:
        a = str(a).replace("\/", "/")
        a = demjson.decode(a)
        content_url_array.append(a['app_msg_ext_info']["content_url"])
        # 取更多的
        for multi in a['app_msg_ext_info']["multi_app_msg_item_list"]:
            self.content_url_array.append(multi['content_url'])
    return content_url

获取到单个文章的地址之后,使用 requests.get() 函数取得 HTML 页面并解析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

# 解析单个文章
def parse_article(self, headers, content_url):
    for i in content_url:
        content_response = requests.get(i, headers=headers, verify=False)
        with open("wx.html", "wb") as f:
            f.write(content_response.content)
        html = open("wx.html", encoding="utf-8").read()
        soup_body = BeautifulSoup(html, "html.parser")
        context = soup_body.find('div', id = 'js_content').text.strip()
        print(context)
所有历史文章

把历史消息往下滑动时出现了正在加载中...,这是公众号的历史消息正在翻页,在 Fiddler 中查看得知,公众号请求的地址为 https://mp.weixin.qq .com/mp/profile_ext?action=getmsg&__biz...

翻页请求地址返回结果,一般可以分析出

  1. ret:是否成功,0为成功
  2. msg_count:每页的条数
  3. can_msg_continue:是否继续翻页,1为继续翻页
  4. general_msg_list:数据,包含了标题、文章地址等信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def page(self, headers):
    response = requests.get(self.page_url, headers=headers, verify=False)
    result = response.json()
    if result.get("ret") == 0:
        msg_list = result.get("general_msg_list")
        msg_list = demjson.decode(msg_list)
        self.content_url(msg_list["list"])
        #递归
        self.page(headers)
    else:
        print("无法获取内容")

总结

到这里已经爬取到了公众号的内容,但是单个文章的阅读数和在看数还未爬取。思考一下,这些内容改如何爬取?

示例代码: https://github.com/JustDoPython/python-100-day

PS:公号内回复 :Python,即可进入Python 新手学习交流群,一起100天计划!

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 纯洁的微笑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
请问苹果手机有教程么
请问苹果手机有教程么
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
50行Python代码,教你获取公众号全部文章
小詹说:我们平时阅读公众号的文章会遇到一个问题——阅读历史文章体验不好。的确如此,小詹自己也这么认为。所以今天分享的是好朋友 Python3X 的一篇干货分享,原文如下:
小小詹同学
2019/07/12
2.6K0
50行Python代码,教你获取公众号全部文章
Python爬取微信公众号文章和评论 (基于Fiddler抓包分析)
  感觉微信公众号算得是比较难爬的平台之一,不过一番折腾之后还是小有收获的。没有用Scrapy(估计爬太快也有反爬限制),但后面会开始整理写一些实战出来。简单介绍下本次的开发环境:
happyJared
2018/09/20
4.3K0
Python爬取微信公众号文章和评论 (基于Fiddler抓包分析)
Python 系列文章 —— WxCrawler
WxCrawler # coding:utf-8 import requests import re import html import demjson import json from bs4 import BeautifulSoup import urllib3 class WxCrawler(object): urllib3.disable_warnings() #Hearders,x-wechat-key 会过期,会出验证问题 headers = """Connect
玩转编程
2022/01/15
3240
使用Python快速获取公众号文章定制电子书(一)
因为工作原因,小之停更了一段时间,发生了很多事,不过从今天开始,我将会满血复活。这篇文章将分享一个我最近写的 Python 相关的小 demo 。爬取某个公众号的所有历史文章,并导出到本地,方便之后在线下环境直接观看。
小之丶
2018/07/27
6230
使用Python快速获取公众号文章定制电子书(一)
微信公众号信息抓取方法(二)——抓取文章点赞、阅读、评论、小程序信息
上一篇文章文章将cookie信息保存到redis中, 则这一节主要是取出cookie, 并且构造方法去获取文章的点赞、阅读、评论、小程序信息, 而且不会访问文章内容页, 防止被微信认为是刷阅读数而封号, cookie的有效期保险一些为2个小时。所以在2个小时内一定要处理完数据
aox.lei
2018/09/10
6.1K1
用 Python 爬微信公众号的数据
0 前言 最近想搞一点秘密的小东西,然后就发现了一个非常有用的库 wechatsogou,听个名字你就大概能猜出是什么来的了,基于搜狗微信搜索的微信公众号爬虫接口,有了这个就可以玩起来了。 1 环
伪君子
2018/04/17
2.3K0
用 Python 爬微信公众号的数据
python之抓取微信公众号文章系列3
发现了一个非常有用的库 wechatsogou,听个名字你就大概能猜出是什么来的了,基于搜狗微信搜索的微信公众号爬虫接口,有了这个就可以玩起来了。
周小董
2019/03/25
3.4K0
python之抓取微信公众号文章系列3
Python Fiddler抓包工具教学,获取公众号(pc客户端)数据
前言 今天来教大家如何使用Fiddler抓包工具,获取公众号(PC客户端)的数据。 Fiddler是位于客户端和服务器端的HTTP代理,是目前最常用的http抓包工具之一。 开发环境 python 3.8 运行代码 pycharm 2021.2 辅助敲代码 requests 第三方模块 Fiddler 汉化版 抓包的工具 微信PC端 如何抓包 配置Fiddler环境 先打开Fiddler,选择工具,再选选项 在选项窗口里点击HTTPS,把勾选框都勾选上 在选项窗口里点击链接,把勾选框都勾选上,然后点
松鼠爱吃饼干
2023/03/08
3.5K0
Python Fiddler抓包工具教学,获取公众号(pc客户端)数据
基于PC端的爬取公众号历史文章
微信后台很多消息未回复:看到时已经回复不了。有问题可以添加我的微信:菜单 ->联系我
不断折腾
2019/09/23
2.6K0
基于PC端的爬取公众号历史文章
微信公众号信息抓取方法(一)——抓取公众号历史消息列表数据
研究微信抓取之前, 看过知乎有大神写的比较完善的例子, 受到启发, 才完成了整个微信公众号的抓取。 微信公众号内容的批量采集与应用 微信抓取的难点: 1. 无法获取到微信公众号的信息(微信并没有提供列表) 2. 无法脱离客户端获取微信公众号历史消息页面 3. 可以获取到文章内容页但是脱离客户端后无法获取到点赞、阅读数据
aox.lei
2018/09/10
13.4K0
使用Python快速获取公众号文章定制电子书(二)
接上篇文章使用Python快速获取公众号文章定制电子书(一)。我们现在已经成功的将公众号历史消息的前十条文章给爬取了出来,使用 content_url 这个关键字段,我们便可以轻易的获取文章具体内容,并将文章保存到本地文件中。实际上上面这些东西已经是我们实现爬取公号文章的核心功能了,剩下的就是如何通过某种方式将公众号的所有文章一次性爬取出来。
小之丶
2018/07/27
5780
使用Python快速获取公众号文章定制电子书(二)
微信公众号文章爬取 | 数据爬取及可视化系列
简单来说,整个技术路线是这样的: 用电脑架设一个代理服务器, 然后手机设置wifi代理, 打开手机微信, 浏览微信文章的历史页面, 在电脑端截取获取的数据,再做其他处理…… 具体步骤如下: 一、安装代
mixlab
2018/04/16
1.8K0
微信公众号文章爬取 | 数据爬取及可视化系列
基于搜狗微信搜索的微信公众号爬虫接口
安装 pip install wechatsogou --upgrade 使用 初始化 API import wechatsogou # 可配置参数 # 直连 ws_api = wechatsogou.WechatSogouAPI() # 验证码输入错误的重试次数,默认为1 ws_api = wechatsogou.WechatSogouAPI(captcha_break_time=3) # 所有requests库的参数都能在这用 # 如 配置代理,代理列表中至少需包含1个 HTTPS 协议的代理,
用户8442333
2021/05/21
5.5K1
python之抓取微信公众号文章系列2
微信公众号历史的所有文章(来源???) 每篇文章的阅读量和点赞量(电脑上浏览文章只显示内容,没有阅读量、点赞量、评论……)
周小董
2019/03/25
4.6K1
python之抓取微信公众号文章系列2
Python——如何优雅的爬取公众号信息
最近两个周业余时间在赶的一个项目,因为精力有限所以进展缓慢,索性就先把接近完善的这部分代码,先分享出来吧。
Ed_Frey
2019/09/16
3K0
Python——如何优雅的爬取公众号信息
微信公众号历史消息列表地址获取原理分析及接口制作
问题产生的背景:之前发布过一篇福利文限时|免费领WPS稻壳会员 文章中涉及到了需要跳转到wps官方公众号去。
许坏
2020/03/04
1.8K0
python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。
参照资料:selenium webdriver 如何添加cookie: https://www.cnblogs.com/sundahua/p/10202494.html
forxtz
2020/10/10
7770
python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。
用Python抓取某大V的公众号文章
我之前用Charles来抓取了得到App的音频资料 抓取得到App音频数据,于是又收到有读者要我抓取公众号文章,于是就有了这一篇文章. 不知道爬谁的文章好,想了想找了比较接地气的公众号大V[匿名一下,省得被认为蹭流量],于是在微信上征得他同意后,开始干活了!
龙哥
2018/10/22
2.4K0
用Python抓取某大V的公众号文章
爬取微信公众号文章
************************************************************************************************ 试了多种方法,发现还是使用自己创建一个公众号再搜索的方式最有用。 有三种方法, 第一种:用搜狗微信公众号搜过,这个只能收到前10条; 第二种:用fiddler或手机抓包,从访问链接去获得appmsg_token,发现虽然这个值就在html页面里,但只有抓包的数据里含有效值,直接访问的是空的,而且还有时效性。这样,每次都要抓包获取,就很麻烦。 第三种:就是这种用公众号搜公众号的,虽然速度慢点,但便捷了不少。 print("* 程序原理:") print(">> 通过selenium登录获取token和cookie,再自动爬取和下载") print("* 使用前提: *") print(">> 电脑已装Firefox、Chrome、Opera、Edge等浏览器") print(">> 下载selenium驱动放入python安装目录,将目录添加至环境变量(https://www.seleniumhq.org/download/)") print(">> 申请一个微信公众号(https://mp.weixin.qq.com)") 演示视频: 约12M,放在了百度网盘里,链接在最底下。 或在线看:https://www.365yg.com/i6660332551661421059#mid=1574068880239629 效果如下:
小锋学长生活大爆炸
2020/08/13
1.6K0
爬取微信公众号文章
微信公众号爬虫 微信公众号爬虫
爬取步骤: 1. get_cookie.py用selenium登陆,获取cookie,其中你需要勾选“记住”选项,还需要微信扫描二维码,确定顺利登陆
尾尾部落
2018/09/04
9.1K0
推荐阅读
相关推荐
50行Python代码,教你获取公众号全部文章
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验