微信公众号爬虫方案分析Python

微信公众号爬虫方案分析(爬取文艺相处公众号) 之前考虑过使用搜狗微信来爬取微信公众号信息,不过搜狗提供的数据有诸多弊端,比如文章链接是临时的,文章没有阅读量等指标

本文包含相关资料包-----> 点击直达获取<-------

微信公众号爬虫方案分析(爬取文艺相处公众号)

之前考虑过使用搜狗微信来爬取微信公众号信息,不过搜狗提供的数据有诸多弊端,比如文章链接是临时的,文章没有阅读量等指标,所以考虑通过手机客户端利用 Python 爬微信公众号文章。

因为微信公众平台并没有对外提供 Web 端入口,只能通过手机客户端查看公众号文章,所以使用 Fiddler 来进行抓包,分析微信公众号相关操作的请求信息,后面通过 Python 代码来模拟微信请求。

抓取公众号所有历史文章

使用 Fiddler 抓包方式,打开手机某个微信公众号历史文章列表,上拉加载更多,此时可以找到加载更多文章的 URL 请求地址:

分析 response,几个字段信息:

  • ret:请求是否成功,0 就表示成功
  • msg_count: 返回的数据条数
  • can_msg_continue: 是否还有下一页数据
  • next_offset: 下一次请求的起始位置
  • general_msg_list:真实数据

general_msg_list 是历史文章里面的基本信息,包括每篇文章的标题、发布时间、摘要、链接地址、封面图等,而像文章的阅读数、点赞数、评论数、赞赏数这些数据都需要通过额外接口获取。

通过字段 can_msg_continue 确定是否继续抓取,再结合 next_offset 就可以加载更多数据,我们需要把 url 中可变的参数 offset 用变量来代替,递归调用直到 can_msg_continue 为 0 说明所有文章都爬取完了。

``` class WeiXinCrawler: def crawl(self, offset=0): """ 爬取更多文章 """ # appmsg_token需刷新 url = "https://mp.weixin.qq.com/mp/profile_ext?" \ "action=getmsg&" \ "__biz=MzUzNTcwNDkxNA==&" \ "f=json&offset={offset}&" \ "count=10&is_ok=1&scene=124&uin=777&key=777&" \ "pass_ticket=z%2FYMNxHa1GuVS1pHj99nPCf1uwQrkEaSJeztTLDcQCGGJx%2BH5evDSY9ooI3nDLQx&" \ "wxtoken=&" \ "appmsg_token=954_X70f2Zp%252BnwCvfxt6YdRWgETK3fRaWtXY80tJfQ~~&x5=1&" \ "f=json".format(offset=offset)

    # 从 Fiddler 获取最新的请求头参数
    headers = """
    省略
    """
    # 将"Host: mp.weixin.qq.com"格式的字符串转换成字典类型转换成字典类型
    headers = utils.headers_to_dict(headers)
    response = requests.get(url, headers=headers, verify=False)
    result = response.json()
    if result.get("ret") == 0:
        msg_list = result.get("general_msg_list")
        logger.info("抓取数据:offset=%s, data=%s" % (offset, msg_list))
        self.save(msg_list)
        # 递归调用直到 can_msg_continue 为 0 说明所有文章都爬取完了
        has_next = result.get("can_msg_continue")
        if has_next == 1:
            next_offset = result.get("next_offset") #下一次请求的起始位置
            time.sleep(2)
            self.crawl(next_offset)
    else:
        # 错误消息
        logger.error("请求参数失效,请重新设置")
        exit()

```

将爬取的文章存储到 MongoDB

关于数据的存储有很多选择,最简单的方式就是直接保存到 CSV 文件中,这种方式操作简单,适合数据量少的情况,Python 的标准库 CSV 模块就可以直接支持。如果遇到数据量非常大的情况,就必须要用到专业的数据库系统,既可以使用 MySQL 这样的关系型数据库,也可以使用 MongoDB 一类的文档型数据库。用 Python 操作 MongoDB 非常方便,无需定义表结构就可以直接将数据插入,所以使用 MongoDB 来存储数据。

  • 连接数据库

# 连接 mongodb connect('ssq_weixin', host='localhost', port=27017) - 定义数据模型

class Post(Document): """ 文章信息 """ title = StringField() # 文章标题 content_url = StringField() # 文章链接 content = StringField() # 文章内容 digest = StringField() # 文章摘要 cover = URLField(validation=None) # 封面图 p_date = DateTimeField() # 推送时间 read_num = IntField(default=0) # 阅读数 like_num = IntField(default=0) # 点赞数 comment_num = IntField(default=0) # 评论数 reward_num = IntField(default=0) # 赞赏数 author = StringField() # 作者 u_date = DateTimeField(default=datetime.now) # 最后更新时间 - 获取文章标题、文章链接等信息存入数据库

``` @staticmethod def save(msg_list):

      msg_list = msg_list.replace("\/", "/")
      data = json.loads(msg_list)
      msg_list = data.get("list")
      for msg in msg_list:
          p_date = msg.get("comm_msg_info").get("datetime")
          msg_info = msg.get("app_msg_ext_info")  # 非图文消息没有此字段
          if msg_info:
              WeiXinCrawler._insert(msg_info, p_date)
              multi_msg_info = msg_info.get("multi_app_msg_item_list")
              for msg_item in multi_msg_info:
                  WeiXinCrawler._insert(msg_item, p_date)
          else:
              logger.warning(u"此消息不是图文推送,data=%s" % json.dumps(msg.get("comm_msg_info")))

  @staticmethod
  def _insert(item, p_date):
      keys = ('title', 'author', 'content_url', 'digest', 'cover', 'source_url')
      sub_data = utils.sub_dict(item, keys)
      post = Post(**sub_data)
      p_date = datetime.fromtimestamp(p_date)
      post["p_date"] = p_date
      logger.info('save data %s ' % post.title)
      try:
          post.save()
      except Exception as e:
          logger.error("保存失败 data=%s" % post.to_json(), exc_info=True)

```

获取阅读数、点赞数、赞赏数

点开一篇文章,通过 Fiddler 抓包分析,观察发现获取文章阅读数、点赞数的 URL 接口为: https://mp.weixin.qq.com/mp/getappmsgext ,后面有很多查询参数,请求方法为 POST。

取之前存取的 content_url 中的参数和获取点赞数的接口的 body 参数中,除了 chksm 其它几个参数都在,我们把 content_url 中的参数替换到 body 中 再来验证请求会不会正常返回数据。经过多次实验是 ok 的。

```

这个参数是从Fiddler中拷贝出 URL,然后提取出查询参数部分再转换成字典对象

稍后会作为参数传给request.post方法

data_url_params = { 将url中的查询参数转换为字典格式 } body = '自己的请求体' data = utils.str_to_dict(body, "&", "=") #将body的字符串转换为字典格式 data.update(content_url_params)

data_url = "https://mp.weixin.qq.com/mp/getappmsgext"

r = requests.post(data_url, data=data, verify=False, params=data_url_params, headers=headers) ```

开工:

``` if name == ' main ': crawler = WeiXinCrawler() crawler.crawl()

for post in Post.objects(reward_num=0):
    crawler.update_post(post)
    time.sleep(5) #sleep时间稍微久点,防止出现301错误

```

可以愉快的爬取啦!

数据分析、可视化

后续可以利用 Pandas 对爬取的数据进行数据,通过 Matplotlib 对数据进行可视化展示。时间有限暂时先不做了。

参考文献

  • 主题微博爬虫的设计与实现(中原工学院·王艳阁)
  • 基于标记模板的分布式网络爬虫系统的设计与实现(华中科技大学·杨林)
  • 基于爬虫的网络新闻订阅和跟踪系统的设计与实现(华中科技大学·严园)
  • 基于Storm云平台的分布式网络爬虫技术研究与实现(电子科技大学·付志鸿)
  • 面向应用商店的主题爬虫设计与实现(东南大学·韩进宾)
  • 基于微信公众平台的可扩展架构研究与实现(兰州大学·吴挺)
  • 基于redis的分布式自动化爬虫的设计与实现(华中科技大学·曾胜)
  • 基于标记模板的分布式网络爬虫系统的设计与实现(华中科技大学·杨林)
  • 基于用户偏好的微信公众号文章推荐系统(上海交通大学·王成)
  • 微信公众平台智能维护系统的设计与实现(·河北师范大学)
  • 基于微服务架构的微信第三方平台—微众平台的设计与实现(南京大学·马振东)
  • 面向应用商店的主题爬虫设计与实现(东南大学·韩进宾)
  • 主题爬虫关键技术研究(哈尔滨工程大学·黄正德)
  • 移动APP行为数据获取和特征分析(电子科技大学·李俊辰)
  • 面向博客的主题爬虫设计与实现(华中师范大学·刘嫚)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码港湾 ,原文地址:https://m.bishedaima.com/yuanma/35896.html

相关推荐

  • 基于SpringBoot框架的公寓管理系统

    这是一套采用🔥🔥SpringBoot为核心的公寓管理系统的源代码,主要编程语言为Java,并结合了SpringBoot和Vue,js技术栈,开发工具可以选择Idea或Eclipse
    2024年05月23日
    2 1 1
  • SSM框架大学社团信息管理系统源码+论文(mysql+maven)

    这是一个🔥🔥SSM框架大学社团信息管理系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 深度学习图像识别开发技术栈为SSM项目,可以作为毕业设计课程设计作业基于SSM框架+Maven+mysql(springmvc+spring+mybatis)实现一个大学社团信息管理系统
    2024年05月23日
    8 1 3
  • 基于Python实现图像绘制

    1, 问题描述 使用 Iris 数据集,在一个 figure 中绘制出右侧的 16 个子图, 分别使用花瓣长度,花瓣宽度,花萼长度和花萼宽度这四种数据
    2024年05月14日
    3 1 1
  • 基于Java+SSH的学生选课系统

    这是一个🔥🔥基于SSH的学生选课系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 学生选课系统开发技术栈为SSH项目,可以作为毕业设计课程设计作业基于Java
    2024年05月23日
    4 1 1
  • 基于Java的新闻热点与趋势挖掘工具

    基于Java的新闻热点与趋势挖掘工具 一,项目概述 1,1 项目简介 本项目为一个新闻站点文章爬取和分析工具,能够通过抓取一定时间内某个新闻网站上所发布的所有新闻
    2024年05月14日
    3 1 1
  • springmvc实现医院挂号系统、javaweb+mysql

    这是一个🔥🔥springmvc实现医院挂号系统,javaweb+mysql🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 医院挂号系统开发技术栈为SSM项目
    2024年05月23日
    8 1 1
  • 基于JAVA的酒店住宿管理系统

    基于Java的宾馆住宿管理系统 摘 要 随着信息技术的发展,计算机已被广泛的应用于社会的各个领域,成为推动社会发展的技术动力,而在计算机应用中,软件的作用十分突出
    2024年05月14日
    2 1 1
  • 基于Java+SSH的飞机票订票售票系统

    飞机票订票售票系统在当今日益发展的航空运输行业中扮演着重要角色,随着航空业的不断增长和乘客需求的增加,建立一个高效,可靠的飞机票订票售票系统显得尤为重要,本系统基于Java语言和SSH框架
    2024年05月07日
    2 1 1
  • 大型商场应急预案管理系统

    这是一个🔥🔥基于SpringBoot框架的大型商场应急预案管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    2 1 1
  • SSM框架整合权限控制管理系统代码

    这是一个🔥🔥SSM框架整合权限控制管理系统代码🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 权限管理系统开发技术栈为SSM项目,可以作为毕业设计课程设计作业基于SSM框架(springmvc
    2024年05月23日
    16 1 2

发表回复

登录后才能评论