代码还是热乎的,只要你细心一步步的慢慢调试,绝壁没问题

前期准备

  1. 订阅号;
  2. Python;
  3. Fiddler;
  4. 微信账号;

流程

  1. 使用用微信公众号生成cookie
  2. 使用Fiddler抓取微信公众号数据, 获取阅读数
  3. 通过cookie请求公众号获取文章,再使用Fiddler抓取的数据获取阅读数
  4. 整理数据写入到数据库

效果

  1. 平均20s可爬取一篇文章。为了微信号、订阅号的安全 时间间隔长一点
  2. 可按日期爬取文章。
  3. 视频文章无法爬取。当然了代码优化优化应该也是可以的
  4. 订阅号会出现 搜索文章限制问题。换一个订阅号解决

操作

操作

  1. 获取订阅号Cookie
    1.1、基于Python调用chromedriver.exe, 打开URL
    1.2、输入账号、密码
    1.3、手动扫码
    1.4、生成cookie.txt 文件, 包含cookie信息
  2. Fiddler抓取微信客户端公众号请求数据, 获取阅读量
    需要获取req_id 、 pass_ticket 、 appmsg_tojen、cookie 和user-agent

    2、1 电脑登录微信(PC版)
    2、2 关注需要爬取的公众号
    2、3 设置Fiddler 并保存配置

    微信客户端请求公众号文章, fiddler抓取到的数据req_id 、 pass_ticket 、 appmsg_tojen


    微信客户端请求公众号文章, fiddler抓取到的数据cookie 和user-agent

最后恢复Fiddler的配置,会报错的

END!!!前面的获取工作就结束了…

一、获取cookie

# -*- coding: utf-8 -*-import time
import json
from selenium import webdriver
import sys
sys.path.append('/path/to/your/module')post = {}driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get('https://mp.weixin.qq.com')
time.sleep(2)driver.find_element_by_name('account').clear()
driver.find_element_by_name('account').send_keys('订阅号账号')
driver.find_element_by_name('password').clear()
driver.find_element_by_name('password').send_keys('订阅号密码')# 自动输入密码后点击记住密码
time.sleep(5)
driver.find_element_by_xpath("./*//a[@class='btn_login']").click()
# 扫码
time.sleep(20)
driver.get('https://mp.weixin.qq.com')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt', 'w+', encoding='utf-8') as f:f.write(cookie_str)print('cookie write ok ...')

二、获取文章数据(文章列表写入数据库)

# -*- coding: utf-8 -*-import time, datetime
import json
import requests
import re
import random
import MySQLdb#设置要爬取的公众号列表
gzlist=['ckxxwx']
# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )# 数据的开始日期 - 结束日期
start_data = '20190630';
end_data = '20190430'# 使用cursor()方法获取操作游标
cursor = db.cursor()# 获取阅读数和点赞数
def getMoreInfo(link, query):pass_ticket = "VllmJYTSgRotAAiQn17Tw1v35AduDOg%252BLCq%252B07qi4FKcStfL%252Fkc44G0LuIvr99HO"if query == 'ckxxwx':appmsg_token = "1016_%2F%2Bs3kaOp2TJJQ4EKMVfI0O8RhzRxMs3lLy54hhisceyyXmLHXf_x5xZPaT_pbAJgmwxL19F0XRMWtvYH"phoneCookie = "rewardsn=; wxuin=811344139; devicetype=Windows10; version=62060833; lang=zh_CN; pass_ticket=VllmJYTSgRotAAiQn17Tw1v35AduDOg+LCq+07qi4FKcStfL/kc44G0LuIvr99HO; wap_sid2=CIvC8IIDElxlWlVuYlBacDF0TW9sUW16WmNIaDl0cVhxYzZnSHljWlB3TmxfdjlDWmItNVpXeURScG1RNEpuNzFUZFNSZWVZcjE5SHZST2tLZnBSdDUxLWhHRDNQX2dEQUFBfjCasIvpBTgNQAE=; wxtokenkey=777"mid = link.split("&")[1].split("=")[1]idx = link.split("&")[2].split("=")[1]sn = link.split("&")[3].split("=")[1]_biz = link.split("&")[0].split("_biz=")[1]# 目标urlurl = "http://mp.weixin.qq.com/mp/getappmsgext"# 添加Cookie避免登陆操作,这里的"User-Agent"最好为手机浏览器的标识headers = {"Cookie": phoneCookie,"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.1021.400 QQBrowser/9.0.2524.400"}# 添加data,`req_id`、`pass_ticket`分别对应文章的信息,从fiddler复制即可。data = {"is_only_read": "1","is_temp_url": "0","appmsg_type": "9",'reward_uin_count': '0'}params = {"__biz": _biz,"mid": mid,"sn": sn,"idx": idx,"key": '777',"pass_ticket": pass_ticket,"appmsg_token": appmsg_token,"uin": '777',"wxtoken": "777"}# 使用post方法进行提交content = requests.post(url, headers=headers, data=data, params=params).json()# 提取其中的阅读数和点赞数if 'appmsgstat' in content:readNum = content["appmsgstat"]["read_num"]likeNum = content["appmsgstat"]["like_num"]else:print('请求参数过期!')# 歇10s,防止被封time.sleep(10)return readNum, likeNum#爬取微信公众号文章,并存在本地文本中
def get_content(query):#query为要爬取的公众号名称#公众号主页url = 'https://mp.weixin.qq.com'#设置headersheader = {"HOST": "mp.weixin.qq.com","User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"}#读取上一步获取到的cookieswith open('cookie.txt', 'r', encoding='utf-8') as f:cookie = f.read()cookies = json.loads(cookie)#登录之后的微信公众号首页url变化为:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,从这里获取token信息response = requests.get(url=url, cookies=cookies)token = re.findall(r'token=(\d+)', str(response.url))[0]time.sleep(2)#搜索微信公众号的接口地址search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'#搜索微信公众号接口需要传入的参数,有三个变量:微信公众号token、随机数random、搜索的微信公众号名字query_id = {'action': 'search_biz','token' : token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'query': query,'begin': '0','count': '5'}#打开搜索微信公众号接口地址,需要传入相关参数信息如:cookies、params、headerssearch_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)#取搜索结果中的第一个公众号lists = search_response.json().get('list')[0]#获取这个公众号的fakeid,后面爬取公众号文章需要此字段fakeid = lists.get('fakeid')#微信公众号文章接口地址appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'#搜索文章需要传入几个参数:登录的公众号token、要爬取文章的公众号fakeid、随机数randomquery_id_data = {'token': token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'action': 'list_ex','begin': '0',#不同页,此参数变化,变化规则为每页加5'count': '5','query': '','fakeid': fakeid,'type': '9'}#打开搜索的微信公众号文章列表页appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)#获取文章总数if appmsg_response.json().get('base_resp').get('ret') == 200013:print('搜索公众号文章操作频繁,!!!')max_num = appmsg_response.json().get('app_msg_cnt')#每页至少有5条,获取文章总的页数,爬取时需要分页爬num = int(int(max_num) / 5)#起始页begin参数,往后每页加5begin = 0  # 根据内容自定义while num + 1 > 0 :query_id_data = {'token': token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'action': 'list_ex','begin': '{}'.format(str(begin)),'count': '5','query': '','fakeid': fakeid,'type': '9'}print('正在翻页:--------------',begin)time.sleep(5)#获取每一页文章的标题和链接地址,并写入本地文本中query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)fakeid_list = query_fakeid_response.json().get('app_msg_list')for item in fakeid_list:content_link=item.get('link')content_title=item.get('title')update_time=item.get('update_time')timeArray = time.localtime(update_time)DataTime = time.strftime("%Y%m%d", timeArray)print(DataTime)Yearsmonth = time.strftime("%Y%m", timeArray)if DataTime <= start_data:if DataTime <= end_data:mark = '1'print('END....')break  # 退出# 阅读数 点赞数readNum, likeNum = getMoreInfo(item['link'], query)print(readNum, likeNum, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))mark = '0'# SQL 插入语句sql = """INSERT INTO `wechat_urls` (`title`, `url`, `data_date`, `gzname`, `read_num`, `like_num`) VALUES ('""" + content_title + """', '""" + content_link+ """', '""" + DataTime+ """', '""" + query+ """', '""" + str(readNum)+ """', '""" + str(likeNum)+ """');"""try:# 执行sql语句print(sql)cursor.execute(sql)# 提交到数据库执行db.commit()except:# Rollback in case there is any errordb.rollback()elif DataTime >= start_data:mark = '2'print('END....')break  # 退出time.sleep(5)if mark == '0':num -= 1begin = int(begin)begin += 5time.sleep(3)elif mark == '1':break  # 退出elif mark == '2':num -= 1begin = int(begin)begin += 1time.sleep(20)# 关闭数据库连接# db.close()if __name__=='__main__':try:#登录之后,通过微信公众号后台提供的微信公众号文章接口爬取文章for query in gzlist:#爬取微信公众号文章,并存在本地文本中print("开始爬取公众号:"+query)get_content(query)print("爬取完成")except Exception as e:print(str(e))

console日志

三、读取URL列表, 文章数据写入数据库

from urllib.request import urlopen
import MySQLdb
import requests
from pyquery import PyQuery as pq
import time, datetime# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "123456", "wechat_reptile_data", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()# 写入数据
def insert_contents(title, url, data_date, gzname, read_num, like_num):# 抓取页码内容,返回响应对象response = requests.get(url)response.encoding = 'utf-8'# 将html构建为Xpath模式doc = pq(response.text)js_content = doc('#js_content').text()# SQL 插入语句sql = """INSERT INTO `wechat_reptile_data`.`wechat_datas` (`title`, `content`, `gzh`, `data_date`, `read_num`, `like_num`) VALUES ('""" + title + """', '""" + js_content + """', '""" + gzname + """', '""" + data_date + """', '""" + str(read_num) + """', '""" + str(like_num) + """');"""try:# 执行sql语句print('===>>>', data_date+' : '+gzname)cursor.execute(sql)# 提交到数据库执行db.commit()except:# Rollback in case there is any errordb.rollback()time.sleep(1)# 更新数据
def update_contents(title, url, data_date, gzname):# SQL 更新语句sql = """UPDATE wechat_urls SET state = '1' WHERE title = '"""+title+"""' AND data_date = '"""+data_date+"""' AND gzname = '"""+gzname+"""'"""try:# 执行SQL语句cursor.execute(sql)# 提交到数据库执行db.commit()except:# 发生错误时回滚db.rollback()time.sleep(1)# SQL 查询语句
sql = "select * from wechat_urls where state='0';"
try:# 执行SQL语句cursor.execute(sql)# 获取所有记录列表results = cursor.fetchall()for row in results:title = row[0]url = row[1]data_date = row[2]gzname = row[3]read_num = row[4]like_num = row[5]insert_contents(title, url, data_date, gzname, read_num, like_num)update_contents(title, url, data_date, gzname)
except:print("Error: unable to fecth data")

代码是东拼西凑写出来的还没来得及优化

看见一年前发布的这个文章,有部分同学比较感兴趣,我就找了找源码
源码我发布到了CSDN的下载站
Reptile_Wechat_Data.rar
源码包内包含了全部的源码、Sql文件、配置文件
代码、数据结构一直没有优化
参考就好

Python爬取微信公众号文章、点赞数相关推荐

  1. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  2. python爬取微信公众号文章(包含文章内容和图片)

    之前虽然做过网页爬取,但微信爬取一直没做过,因为我一直不知道网页可以进微信公众平台,只用过微信客户端进微信公众号.既然可以通过网页进微信公众平台,那么爬取微信公众号文章就流程上就没太多难度了. 自己在 ...

  3. python 微信公众号发文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  4. 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  5. python爬虫爬取微信_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

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

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  7. python爬取正确但不出文件_使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...

    前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...

  8. python爬取微信公众号文章

    爬取微信公众号文章 获取微信公众号的url 获取每一篇文章的url ​ 选择一个公众号进入,选择一个目录进入后点复制链接,然后去浏览器打开.按F12打开检查的模式,在Console中输入$x('标签路 ...

  9. python 爬取微信公众号文章(selenium+webdriver)

    """通过搜狗搜索中的微信搜索入口爬取微信公众号文章(selenium) """ import re import os import js ...

最新文章

  1. 王者荣耀活动精选 Blink 第二弹来袭!
  2. 【408预推免复习】操作系统之文件管理
  3. CentOs7下systemd管理知识要点
  4. 20175213 2018-2019-2 《Java程序设计》第9周学习总结
  5. 【dfs】虫食算(ybtoj dfs-1-3)
  6. 生产环境linux下安装两个及两个以上tomcat实践
  7. 2、Fiddler工作原理
  8. monty python读音-Monty Python
  9. 关于Adapter模式
  10. python3.x中如何使用base64、base32、base16编码解码
  11. 苹果怎么用计算机解锁,苹果ios10密码解锁设置图文教程 怎么用密码解锁
  12. 【Pytorch】touch.optim
  13. 【计算机网络】Web服务器的配置
  14. 505错误:Invalid bound statement (not found): com.pc.dao.BookMapper.queryAllBook错误解决
  15. PDF convert(多个pdf合并的脚本)
  16. 数字图像处理——第三章 灰度变换与空间滤波
  17. 《安富莱嵌入式周报》第251期:2022.01.31--2022.02.06
  18. 传真存储转发工作过程
  19. 超赞的实用前端社区精选?
  20. PXI标准– PXI规范更新总结

热门文章

  1. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效
  2. 【你好,windows】Windows 10 X64 19H2 18363.1556 终结版2021.5.16
  3. 逆幂律模型_思维模型18 - 幂律分布是什么?
  4. 行列式的子式、主子式、顺序主子式、余子式、代数余子式
  5. 1.【Windows图标点击无反应修复
  6. Python小白机器学习教程:Sklearn精讲
  7. Fenix:Mozilla推出的新型移动浏览器
  8. 【线代】 线性方程组的解
  9. 网页弹窗插件layer.js的使用
  10. 谷歌浏览器出现应用程序无法启动,提示应用程序的并行配置不正确