当前位置:   article > 正文

爬虫 | 抓取微信公众号阅读量(python3 + mongdb)_微信阅读量抓取

微信阅读量抓取

 

声明:此文件内容只适合个人学习参考,不得作为商业用途。谢谢!

 

截止到 2019年08月19日18:21:38 亲测可用。

需要的环境:python3 + mongdb

 

需要修改的部分 是代码中的 # 0,#1,#2,#3,具体参照代码部分。

参数修改说明:

# 0

mangodb 数据存储配置

# 1

微信公众平台参数

找到“新建图文素材”

 

“检查” 查看网络请求。

搜索要找的公众号:

 

回车,点击出现的公众号,右侧的 Network,则出现相关url:

 

 

找到url 中出现的参数:

# 2

通过 代理服务器 获取参数:我用的是 Charles

# 3

设置抓取的开始页码。

说明:如果抓了一会出现没有数据,说明数据失效,请重新设置 #2 和 #3 部分即可。如果经过一段时间重新设置啥也不起作用,说明 请求频繁,微信被拒绝。可更换微信公众号,重新设置 #1,#2 和 #3。

 

 爬虫文件1:

存储到mangodb

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import time
  4. import json
  5. from pymongo import MongoClient
  6. #from requests.packages.urllib3.exceptions import InsecureRequestWarning
  7. #requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  8. # -------------配置信息开始---------------------------
  9. # 0
  10. # mango 数据库名称
  11. this_mango_base_name= "lianTong_Wx"
  12. # 数据存储名称
  13. this_sheetName = "孙三苗"
  14. # 1
  15. # agent 【自己改一次就行】
  16. this_Agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
  17. # 从公众平台获取的信息
  18. this_Cookie = "RK=YDxkyyTtcC; ptcz=5c28ad19691371f1f2215899b9c32bd41eee2f920b082a1fb630a8bf8c838f43; ua_id=LEnm9PHfiX941k4PAAAAANbhfiV9BSOuTypE9Grfwz0=; mm_lang=zh_CN; pgv_pvi=9484698624; pgv_pvid=1604216750; o_cookie=326158775; pac_uid=1_326158775; tvfe_boss_uuid=6e82e2762fc3c7e1; noticeLoginFlag=1; XWINDEXGREY=0; eas_sid=41N5l6P2U8m333r9Z7m056I1P5; ied_qq=o0326158775; _ga=GA1.2.1224445687.1562834085; wxuin=62926310217144; ts_uid=3085165680; pgv_si=s326170624; cert=2q9C18dlNtPHEB7jMiyM5e3vbxOVI0Y1; mmad_session=de6452ccbec185104e09c96b6993ee72fe140a098bd64db7c78233f53cc8fd6c6a607ced639a08f8421fe431555d7920369bce0e8d10f4589b5d6057272b6316042b9f59e6af1c07d34af196ba6f497fee4a1ff43b1a6e9ba596f1c2b5cf87ca11de1c56c245721266e7088080fefde3; pgv_info=ssid=s5300444549; sig=h014e6e70ba9db8f575b44f947a9234bb6bedd280a9248533ebfa7446fe06cd7e32a6aea962898dc01c; ptisp=cnc; rewardsn=; wxtokenkey=777; remember_acct=928596269%40qq.com; qm_authimgs_id=1; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=; openid2ticket_oq4qKuKX1TaomkzwMuzxbHHFUzl8=pG6irwxD2rBTETfrMgA2FuaviyQgyaylv/ZctG7dHvA=; qm_verifyimagesession=h01c9563c5a0d70f34421e35a13e9940408c28320751d500621992ffb48d288a2d5cfe5db77a58e0453; uuid=efb1a396d6b9523590e50a287ce2526e; data_bizuin=3096087211; bizuin=3001031126; data_ticket=6B1hXI/GGiMgCSvAlhkIgds5AB3ObpyvSNjUgEgBZJmswjt1VlnnUxPNyFGW9hJC; slave_sid=ZzNTOHJ3UFBTYWJKcXY5eVhoRTlPa2tIazhuSjBJaW85RlRJTVNJZVNBbnRYYVFjTW1ZaTNvWG1GMGJ1eTdSMEtGamIyblo4OHdLMU04eFF6MlB0RWhUQTRKMkRMMHdFRHdvcEhhNV80Y0NYQ1NKa3piTUFJQ3dWbGpGN3FZc1N2Y1dja3Y2eDlhVnhnNEVO; slave_user=gh_99ec35f7100f; xid=b3cf27a3c009e2e32e56d1e75ac944eb"
  19. # 账户token
  20. this_token = "1866865635"
  21. # 公众号独一无二的一个id
  22. this_fakeid = "MjM5NzU2OTgyMg=="
  23. # 2
  24. # fillder 中取得一些不变得信息
  25. # req_id = "0614ymV0y86FlTVXB02AXd8p"
  26. # uin 【自己改一次就行】
  27. this_uin = "MTc5MTY3NzkwMA%3D%3D"
  28. # 【常需要修改的参数】
  29. this_pass_ticket = "I9kFuRkUW%252BCT%252BwMr8IMQPXRuhhoFnZ44lPE9%252FgnVO4GFfplB7aZDkJsphI4XZ92C"
  30. # 【常需要修改的参数】
  31. this_appmsg_token = "1022_zFB8INnBT9fTaZoqYFPJIaF9WCYQNEUt-78BI74Cqqc36xX3HTdkZYMeFSWJkfblkDknIUugRx_Xj5cW"
  32. # 【常需要修改的参数】
  33. this_key = "c4663b7b314f3cd81aa79b55defa7b0abdc184895aa16e454eef7daddeb9b49ccd82c37ea3fb662e84fd497bf1c68b027b961460b1daf660b21c23ced6444aa17209b89f80dcf714d8466f5ec2f1880a"
  34. # 3
  35. # 【常需要修改的参数】 开始页码
  36. begin_page = 1
  37. # -------------配置信息结束--------------------------
  38. # 目标url
  39. url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
  40. Cookie = this_Cookie
  41. headers = {
  42. "Cookie": Cookie,
  43. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15",
  44. }
  45. """
  46. 需要提交的data
  47. 以下个别字段是否一定需要还未验证。
  48. 注意修改yourtoken,number
  49. number表示从第number页开始爬取,为5的倍数,从0开始。如0、5、10……
  50. token可以使用Chrome自带的工具进行获取
  51. fakeid是公众号独一无二的一个id,等同于后面的__biz
  52. """
  53. token = this_token
  54. fakeid = this_fakeid
  55. # type在网页中会是10,但是无法取到对应的消息link地址,改为9就可以了
  56. type = '9'
  57. data1 = {
  58. "token": token,
  59. "lang": "zh_CN",
  60. "f": "json",
  61. "ajax": "1",
  62. "action": "list_ex",
  63. "begin": "365",
  64. "count": "5",
  65. "query": "",
  66. "fakeid": fakeid,
  67. "type": type,
  68. }
  69. # 毫秒数转日期
  70. def getDate(times):
  71. # print(times)
  72. timearr = time.localtime(times)
  73. date = time.strftime("%Y-%m-%d %H:%M:%S", timearr)
  74. return date
  75. # 获取阅读数和点赞数
  76. def getMoreInfo(link):
  77. # 获得mid,_biz,idx,sn 这几个在link中的信息
  78. mid = link.split("&")[1].split("=")[1]
  79. idx = link.split("&")[2].split("=")[1]
  80. sn = link.split("&")[3].split("=")[1]
  81. _biz = link.split("&")[0].split("_biz=")[1]
  82. # fillder 中取得一些不变得信息
  83. #req_id = "0614ymV0y86FlTVXB02AXd8p"
  84. uin = this_uin
  85. pass_ticket = this_pass_ticket
  86. appmsg_token = this_appmsg_token
  87. key = this_key
  88. # 目标url
  89. url = "http://mp.weixin.qq.com/mp/getappmsgext"
  90. # 添加Cookie避免登陆操作,这里的"User-Agent"最好为手机浏览器的标识
  91. phoneCookie = "wxtokenkey=777; rewardsn=; wxuin=2529518319; devicetype=Windows10; version=62060619; lang=zh_CN; pass_ticket=4KzFV+kaUHM+atRt91i/shNERUQyQ0EOwFbc9/Oe4gv6RiV6/J293IIDnggg1QzC; wap_sid2=CO/FlbYJElxJc2NLcUFINkI4Y1hmbllPWWszdXRjMVl6Z3hrd2FKcTFFOERyWkJZUjVFd3cyS3VmZHBkWGRZVG50d0F3aFZ4NEFEVktZeDEwVHQyN1NrNG80NFZRdWNEQUFBfjC5uYLkBTgNQAE="
  92. headers = {
  93. "Cookie": phoneCookie,
  94. "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400"
  95. }
  96. # 添加data,`req_id`、`pass_ticket`分别对应文章的信息,从fiddler复制即可。
  97. data = {
  98. "is_only_read": "1",
  99. "is_temp_url": "0",
  100. "appmsg_type": "9",
  101. 'reward_uin_count':'0'
  102. }
  103. """
  104. 添加请求参数
  105. __biz对应公众号的信息,唯一
  106. mid、sn、idx分别对应每篇文章的url的信息,需要从url中进行提取
  107. key、appmsg_token从fiddler上复制即可
  108. pass_ticket对应的文章的信息,也可以直接从fiddler复制
  109. """
  110. params = {
  111. "__biz": _biz,
  112. "mid": mid,
  113. "sn": sn,
  114. "idx": idx,
  115. "key": key,
  116. "pass_ticket": pass_ticket,
  117. "appmsg_token": appmsg_token,
  118. "uin": uin,
  119. "wxtoken": "777",
  120. }
  121. # 使用post方法进行提交
  122. content = requests.post(url, headers=headers, data=data, params=params).json()
  123. # 提取其中的阅读数和点赞数
  124. #print(content["appmsgstat"]["read_num"], content["appmsgstat"]["like_num"])
  125. try:
  126. readNum = content["appmsgstat"]["read_num"]
  127. print(readNum)
  128. except:
  129. readNum=0
  130. try:
  131. likeNum = content["appmsgstat"]["like_num"]
  132. print(likeNum)
  133. except:
  134. likeNum=0
  135. try:
  136. comment_count = content["comment_count"]
  137. print("true:" + str(comment_count))
  138. except:
  139. comment_count = -1
  140. print("false:" + str(comment_count))
  141. # 歇3s,防止被封
  142. time.sleep(3)
  143. return readNum, likeNum,comment_count
  144. # 最大值365,所以range中就应该是73,15表示前3
  145. def getAllInfo(url, begin):
  146. # 拿一页,存一页
  147. messageAllInfo = []
  148. # begin 从0开始,365结束
  149. data1["begin"] = begin
  150. # 使用get方法进行提交
  151. content_json = requests.get(url, headers=headers, params=data1, verify=False).json()
  152. time.sleep(3)
  153. # 返回了一个json,里面是每一页的数据
  154. if "app_msg_list" in content_json:
  155. for item in content_json["app_msg_list"]:
  156. # 提取每页文章的标题及对应的url
  157. url = item['link']
  158. # print(url)
  159. readNum, likeNum ,comment_count= getMoreInfo(url)
  160. info = {
  161. "title": item['title'],
  162. "readNum": readNum,
  163. "likeNum": likeNum,
  164. 'comment_count':comment_count,
  165. "digest": item['digest'],
  166. "date": getDate(item['update_time']),
  167. "url": item['link']
  168. }
  169. messageAllInfo.append(info)
  170. # print(messageAllInfo)
  171. return messageAllInfo
  172. # 写入数据库
  173. def putIntoMogo(urlList):
  174. host = "127.0.0.1"
  175. port = 27017
  176. # 连接数据库
  177. client = MongoClient(host, port)
  178. # 建库
  179. lianTong_Wx = client[this_mango_base_name]
  180. # 建表
  181. wx_message_sheet = lianTong_Wx[this_sheetName]
  182. # 存
  183. if urlList is not None:
  184. for message in urlList:
  185. wx_message_sheet.insert_one(message)
  186. print("成功!")
  187. def main():
  188. # messageAllInfo = []
  189. # 爬10页成功,从1页开始
  190. for i in range(begin_page, 365):
  191. begin = i * 5
  192. messageAllInfo = getAllInfo(url, str(begin))
  193. print('\033[1;31;40m')
  194. print('*' * 50)
  195. print("\033[7;31m第%s页!\033[1;31;40m\033[0m\033[1;31;40m" % i) # 字体颜色红色反白处理
  196. print('*' * 50)
  197. print('\033[0m')
  198. # print("第%s页" % i)
  199. putIntoMogo(messageAllInfo)
  200. if __name__ == '__main__':
  201. main()

爬虫文件2

导出到excel

  1. import pymongo
  2. from openpyxl import Workbook
  3. title = "孙三苗";
  4. excel_QA = Workbook() # 建立一个工作本
  5. sheet = excel_QA.active # 激活sheet
  6. sheet.title = title # 对sheet进行命名
  7. sheet.cell(1, 1).value = '推送日期'
  8. sheet.cell(1, 2).value = '位置'
  9. sheet.cell(1, 3).value = '标题'
  10. sheet.cell(1, 4).value = '点赞数'
  11. sheet.cell(1, 5).value = '阅读量'
  12. #
  13. myclient = pymongo.MongoClient("mongodb://localhost:27017/")
  14. mydb = myclient["lianTong_Wx"]
  15. mycol = mydb[title]
  16. count=2
  17. num=1
  18. dd=''
  19. for x in mycol.find():
  20. # print('dd'+dd)
  21. if x['date'] == dd:
  22. num+=1
  23. # print("true:" + str(num))
  24. else:
  25. num=1
  26. # print("false:" + str(num))
  27. # print("mummmmmmm:" + str(num))
  28. sheet.cell(count, 1).value = x['date']
  29. dd= x['date']
  30. sheet.cell(count, 2).value = num
  31. sheet.cell(count, 3).value = x['title']
  32. sheet.cell(count, 4).value = x['likeNum']
  33. sheet.cell(count, 5).value = x['readNum']
  34. count+=1
  35. excel_QA.save(title+".xlsx")#保存

 

抓取结果:

有数字表示正常,其中

false:-1  是 未获取到评论数,如果不需要可忽略。

如果连续出现 false:-1 而没有数字,请重新从当前页抓取。比如 在 16页 下方出现了:

那么,请从17页重新抓取即可,需修改 # 3 的数字。

mangdb 数据:

如有问题请在下方留言。

或关注我的公众号“孙三苗”,输入“联系方式”。获得进一步帮助。

或在公众号中输入关键词:微信爬虫包 获取源代码。

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

闽ICP备14008679号