当前位置:   article > 正文

使用python爬取微信公众号文章_python 获取微信公众号文章内容

python 获取微信公众号文章内容

一、背景

 

有时候看到某一个微信公众号中的文章,觉得写的非常不错,有种当时就想把该公众号所有的文章都看完的冲动,但是使用手机看不是特别方便,就想把文章全部下载下来到电脑上面看。

二、爬虫实现步骤

使用python爬取微信公众号文章,总共分为如下几步:

第一步:获取微信公众号的文章地址和入参规则;

第二步:将爬取的文章标题和url保存到数据库;

第三步:针对微信公众号连续爬取超过60次会提示访问太频繁而拒绝响应(记录当前爬取到的页码及异常情况处理)【{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}】

三、爬虫实现过程

第一步:需要有一个个人微信公众号,订阅号也是可以的。

第二步:进入微信公众平台,新建图文素材,在界面上方有一个“超链接”的按钮,点击进入。

第三步:输入公众号名称进行检索,按F12,如下图显示公众号的文章请求地址、cookie、user-agent、请求参数。

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import time
  4. import csv
  5. import pandas as pd
  6. import traceback
  7. import mymysql
  8. import uuid
  9. # 目标url
  10. url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
  11. # 使用Cookie,跳过登陆操作
  12. headers = {
  13. "Cookie": "appmsglist_action_3202723363=card; pgv_pvid=532343460; ua_id=OlRastLitDwq627TAAAAAJzUEREVZq7JaMyyQMxMEIw=; wxuin=42623452127; mm_lang=zh_CN; uuid=2702030d23431cc966563362; rand_info=CAESIKyltjg5bkliwmXupK/rdnCAEv5Nymy4o9rKsv12DRqR; slave_bizuin=3202723363; data_bizuin=3202723363; bizuin=3204433363; data_ticket=3JEz+aeGoOMeIRs/DjEPhZnKfqzismwik5LzOk6uXt+Z7CBkXJ+taoQJdCFeb8bJ; slave_sid=Zk5zbFBjODBTT3ZHVGR4ZzRWSTRMZnlPY2tTN2pjVnI5MFdyZzRxX2NNWTRNVV9aUHFjdlZ4Y0xrallmQ2c0WmcxWWFoaGZJVGlPVUJzOTBRNzhWSGpKT216a2lOS2c1VHF4YkVVa0drR2R0VlRqR01tMEoyM2dLMXhIb2M5TGZNOHNJQXRPaTl0SGpZMzd2; slave_user=gh_968271d6ce85; xid=81ded7b144cd53195323432e6e776",
  14. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
  15. }
  16. data = {
  17. "token": "474544364",
  18. "lang": "zh_CN",
  19. "f": "json",
  20. "ajax": "1",
  21. "action": "list_ex",
  22. "begin": "0",
  23. "count": "5",
  24. "query": "",
  25. "fakeid": "MzA5MzMA==",
  26. "type": "9",
  27. }
  28. #时间转日期格式
  29. def timetoDate(timeStamp):
  30. #timeStamp = 1643275175
  31. timeArray = time.localtime(timeStamp)
  32. otherStyleTime = time.strftime("%Y-%m-%d", timeArray)
  33. return otherStyleTime
  34. #抓取公众号文章
  35. def grapArtile():
  36. # 计数器
  37. counter = 0
  38. # 页数
  39. page = 0
  40. content_list = []
  41. # for i in range(20):
  42. content_json = []
  43. # 查询最新的页码
  44. mysqlConn = mymysql.MYMYSQL()
  45. mysqlConn.query()
  46. page = mysqlConn.page_no
  47. try:
  48. while 1:
  49. data["begin"] = page*5
  50. # 使用get方法进行提交
  51. content_json = requests.get(url, headers=headers, params=data).json()
  52. msglen = len(content_json["app_msg_list"]);
  53. #如果没有文章了,退出
  54. if msglen == 0:
  55. break
  56. items = []
  57. # 返回了一个json,里面是每一页的数据
  58. for item in content_json["app_msg_list"]:
  59. # 提取每页文章的标题及对应的url
  60. wzid = uuid.uuid1().hex
  61. yz = (wzid, item["title"], item["link"], timetoDate(item["create_time"]))
  62. items.append(yz)
  63. counter += 1
  64. print("爬取第" + str(page + 1) + "页,第" + str(counter) + "条")
  65. mysqlConn.batchInsert(items)
  66. page = page + 1
  67. time.sleep(3)
  68. except:
  69. print("出现【KeyError】异常,文件保存,原因")
  70. print(content_json)
  71. traceback.print_exc()
  72. mysqlConn.update(page)
  73. time.sleep(30*60)
  74. grapArtile()
  75. else:
  76. print("出现【KeyError】异常,文件保存")
  77. print(content_json)
  78. #saveFile(content_list)
  79. mysqlConn.update(page)
  80. time.sleep(30*60)
  81. grapArtile()
  82. grapArtile()

第五步:将文章标题和url保存到数据库

  1. import pymysql
  2. import traceback
  3. import uuid
  4. class MYMYSQL():
  5. def __init__(self,):
  6. # 打开数据库连接
  7. conn = pymysql.connect("127.0.0.1", "user", "password", "python_pc", charset='utf8')
  8. self.conn = conn
  9. # 查询
  10. def query(self):
  11. self.conn.select_db('python_pc')
  12. # 获取游标
  13. cur = self.conn.cursor()
  14. cur.execute("select * from t_record where sno=1")
  15. while 1:
  16. res = cur.fetchone()
  17. if res is None:
  18. # 表示已经取完结果集
  19. break
  20. print(res[1])
  21. self.page_no = res[1]
  22. cur.close()
  23. #更新
  24. def update(self,cur_no):
  25. self.conn.select_db('python_pc')
  26. # 获取游标
  27. cur = self.conn.cursor()
  28. nums = cur.execute("update t_record set page_no="+str(cur_no)+",update_time=now() where sno=1")
  29. print("更新的数据条数:"+str(nums))
  30. cur.close()
  31. self.conn.commit()
  32. def batchInsert(self, list):
  33. self.conn.select_db('python_pc')
  34. # 获取游标
  35. cur = self.conn.cursor()
  36. # 另一种插入数据的方式,通过字符串传入值
  37. sql = "insert into t_article values(%s,%s,%s,%s)"
  38. insert = cur.executemany(sql, list)
  39. cur.close()
  40. self.conn.commit()
  41. if __name__ == "__main__":
  42. try:
  43. me = MYMYSQL()
  44. # me.query()
  45. # me.update(3)
  46. # me.query()
  47. # list = []
  48. # for i in range(0,5):
  49. # wzid = uuid.uuid1().hex
  50. # yz = (wzid,'111','222')
  51. # list.append(yz)
  52. # print(list)
  53. # me.batchInsert(list)
  54. except:
  55. traceback.print_exc()

 参考资料:
https://blog.csdn.net/jingyoushui/article/details/100109164
--python操作mysql数据库
https://blog.csdn.net/kongsuhongbaby/article/details/84948205

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号