因工作需要写了一个微信公众号文章的爬虫程序,贴一下分享给需要的朋友。

首先是抓取文章的url链接,在反复研究之后找到的一个最简单的方法,不需要抓包工具。首先需要自己注册一个微信公众号,有微信即可绑定注册,很简单。打开浏览器搜索‘微信公众号’,按流程注册登录。注册完之后如图:

点击左下角‘素材管理’,然后‘新建图文消息’。再在新打开的页面里,最上方找到‘超链接’选项,点击。

在弹出的框中点击‘选择其他公众号’,然后就是输入你要爬取的公众号名称。

好了,到这里傻瓜式进程结束!正式进入爬虫阶段。。。

这里以‘揭阳星空网’公众号为例,这也是公司要求抓取的公众号之一。左边显示的就是公众号最新发布的一些文章,右边箭头指的就是这些文章相关的url,url、cookie、ua这些就不说了,懂一点爬虫的都应该懂。

点开preview,这是一个json格式的url,在这里就能找到我们需要的数据,包括标题,链接,封面图面以及发布时间。(发布时间是时间戳,要转换为常见时间格式。)

emmmm。。然后开始码,先获取此页所有的url和标题

只做演示所以就只抓这一页的数据,如果要抓多页只需要修改url里的begin参数,begin=0是第一页,begin=5是第二页,以此类推!!!

我们随手打开一篇文章,大家如果有去研究就可以发现,不管是什么公众号什么文章,内容都是放在这个id=‘js_content’的div标签里的,因此我们只需要拿到这里面的内容就可以获取所有的文本和图片。(在这里扩展一下,有些文章里包含视频文件,视频文件大致分为两种,一种是腾讯视频的外部链接,一种应该是小编自行上传的视频文件。如果是自行上传的文件在这个页面也是可以拿到的,但是如果是腾讯视频的链接就是拿不到的,需要做另外处理!这个写不写看后面吧!!)

拿到所有的文章url之后就可以进行遍历获取响应了。

这里的title用了比较多的replace替换,原因在于这个title后面要作为输出word文件的标题,而标题是没办法包含这些特殊字符的,如果不替换掉会报错到令你崩溃。别问一定要这么写吗?反正我是只想到这个方法,一个一个替换!有更好的方法欢迎补充!

这里Document()是第三方库docx的方法,用来做word文档写入操作的。add_heading就是写入标题啦!

代码有点乱,将就看吧!还没时间整理

这里我用的是bs4获取,主要是因为bs4有一个比xpath,re都有优势的地方,那就是可以拿到子节点进行遍历。在拿到js_content的标签之后,就可以直接用soup.children遍历soup的子节点。对bs4不了解的自行百度吧!然后就是一个一个节点去循环遍历了,一般公众号的文字都是放在p标签里,有少部分会放在section标签里,所以是要判断if child.p or child.section,如果存在该标签,那么就current.add_paragraph(text=child.text),把文本写入word文档,再判断是否存在img标签,存在就匹配出img的url,进行下载,然后就是current.add_picture(pic)写入图片。视频没办法放入word,只能另外处理,还有一些表格啥的也是一样处理方法。遍历完之后就是current.save(你的存储位置)

写入完成效果是这样的

打开是这样的

虽然也保存了样式,不过放入word文档并不美观就是了。还做了去广告处理,这里没贴出来,有朋友需要再贴,反正思路就是找到特殊性。

原本以为到这里就结束了,没想到后面产品经理找我说,还要采文章的点赞数,在看数,阅读数。心里一万头草拟马在奔腾。然后默默回了一句‘好’。

然而在微信公众号平台打开的文章并没有这些参数,无奈只能在微信端试试看了,PC端微信文章打开是有这些数据的,但拿不到相关的参数,只能用抓包工具了,打开fidder,设置只抓微信的包。然后PC端打开一篇文章,在抓到的url里挨个点击寻找。然后。。。然后就找到了!

这里其实挺操蛋的,因为直接拿这里面的url去发送请求是拿不到数据的,这是一个post请求,也就意味着有一些data参数必须要传递上,多次尝试之后,直接贴代码!

没错,这些都是必须要携带的参数,大部分参数都是固定不变的,只有pass_ticket,appmsg_token,key这三个是变化的,因此每次请求可能都要手动更换这三个参数,最操蛋的就是key,基本上是二三十分钟更换一次,如果对数据采集量要求不大应该是足够用了。而且貌似破解不了(反正我破解不了,有大神请带带我)。带上这些必要参数就可以发送post请求拿到json格式的数据啦,然后就是转字典取值了,下面的代码就不贴了。搞完入库!

2020.08.18最新优化全代码,亲测可用!(参数自行输入)

import json
import re
import time
import pymysql
import requests
from lxml import etree
import urllib3urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)class Gzh_wz(object):def __init__(self):self.conn = pymysql.connect(xxx)self.cursor = self.conn.cursor()with open('标题.txt', 'r', encoding='utf-8')as r:titles = r.read().replace('\ufeff', '')self.title_l = titles.split('\n')self.cookie = input('cookie:')self.pass_ticket = input('pass_ticket:')self.url_dict = {'揭阳蓝城生活': 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI0MTA2MDMwMA==&type=9&query=&token=abcd&lang=zh_CN&f=json&ajax=1','揭东生活圈': 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI0MzA1ODc0NQ==&type=9&query=&token=abcd&lang=zh_CN&f=json&ajax=1'}self.headers = {'cookie': self.cookie,'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36','referer': 'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token=370616041&lang=zh_CN',}self.app_url = "http://mp.weixin.qq.com/mp/getappmsgext"phoneCookie = "rewardsn=; wxtokenkey=777; wxuin=1797234910; devicetype=Windows10x64; version=62090529; lang=zh_CN; pass_ticket=hjymD+nRjMwS6tz25jYr1rByJW9Yzu8L6Y+I6VDM8EK8bM7Ltcee1dTvMsr6A2I1; wap_sid2=CN7B/tgGElxnWXktSExLc0EyTVFVNGJMTjJ5eVhwSWNDQk5tRHhSd21NaGZNMUoxaWJRdzBlcUJxZG1XUEtuQ1JTekt4dXctS3hLaVFWU0xqdWQxNVJleFAxTGZ4akVFQUFBfjDi67T5BTgNQAE="self.app_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.901.400 QQBrowser/9.0.2524.400"}self.data = {"is_only_read": "1","is_temp_url": "0","appmsg_type": "9",'reward_uin_count': '0'}def get_link(self):for name, url in self.url_dict.items():print(name)self.url = url.replace('abcd', '1897236457')res = requests.get(self.url, headers=self.headers, verify=False).textres_dict = json.loads(res)details = res_dict['app_msg_list']self.appmsg_token = input('appmsg_token:')if self.appmsg_token == '1':continueself.key = input('key:')for detail in details:self.title = detail['title']self.detail_url = detail['link']self.get_response(detail)self.conn.close()def get_response(self, detail):self.detail_res = requests.get(self.detail_url, headers=self.headers, verify=False).textcon = ''.join(re.findall(r'<div class="rich_media_content " id="js_content".*?</div>', self.detail_res, re.DOTALL))video = re.search(r'video', con)if video:return Nonecon = con.replace('\n', '').replace('style="visibility: hidden;"', '').replace('data-src', 'src')rep = re.search(r'<img.*?>', con, re.DOTALL)if rep:rep = rep.group()rep1 = '点击上方蓝色字体,关注我们'rep2 = '给我点【在看】你也越好看'self.content = con.replace(str(rep), '').replace(rep1, '').replace(rep2, '')publish = detail['create_time']self.cover_img = detail['cover']times = int(publish)timess = time.localtime(times)self.publish_time = time.strftime("%Y-%m-%d %H:%M:%S", timess)self.create_time = str(time.strftime("%Y-%m-%d %H:%M:%S"))create_time_date = self.create_time.split(' ')[0]re_time = re.findall(create_time_date, str(self.publish_time))if re_time:print('--' * 50)print(self.publish_time)else:return Noneif self.title in self.title_l:return Noneelse:self.title_l.append(self.title)with open('标题.txt', 'a', encoding='utf-8')as w:w.write('\n')w.write(self.title)self.tt_dict = {x.split('=')[0]: x.split('=')[1] for x in self.detail_url.split('&')}print(self.tt_dict)if self.tt_dict['idx'] == '1':self.is_headline = '1'else:self.is_headline = '0'detail_ret = etree.HTML(self.detail_res)fro = detail_ret.xpath('//span[contains(text(), "来源:")]')self.gzh_name = ''.join(detail_ret.xpath('//a[@id="js_name"]/text()')).strip()self.author = ' 'if fro:self.is_original = '0'else:self.is_original = '1'self.get_nums()return Nonedef get_nums(self):mid = self.detail_url.split("&")[1].split("=")[1]idx = self.detail_url.split("&")[2].split("=")[1]sn = self.detail_url.split("&")[3].split("=")[1]_biz = self.detail_url.split("&")[0].split("_biz=")[1]params = {"__biz": _biz,"mid": mid,"sn": sn,"idx": idx,"key": self.key,"pass_ticket": self.pass_ticket,"appmsg_token": self.appmsg_token,"uin": "MTc5NzIzNDkxMA==","wxtoken": "777",}con2 = requests.post(self.app_url, headers=self.app_headers, data=self.data, params=params, verify=False).json()try:self.pageview = con2["appmsgstat"]["read_num"]except:self.pageview = 0try:self.look_count = con2["appmsgstat"]["like_num"]except:self.look_count = 0try:self.like_count = con2["appmsgstat"]['old_like_num']except:self.like_count = 0print(self.like_count)print(self.look_count)print(self.pageview)self.deposit_mysql()return Nonedef deposit_mysql(self):sql = "insert into gzh_article(id, gzh_name, author, title, is_original, publish_time, is_headline, content, pageview, look_count, org_url, cover_img, like_count, create_time, import_time) values(null,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, null)"self.cursor.execute(sql, (self.gzh_name, self.author, self.title, self.is_original, self.publish_time, self.is_headline, self.content,self.pageview, self.look_count, self.detail_url, self.cover_img, self.like_count, self.create_time))self.conn.commit()time.sleep(1)return Noneif __name__ == '__main__':gzh = Gzh_wz()gzh.get_link()

python爬虫抓取微信公众号文章(含全文图以及点赞数、在看数、阅读数)相关推荐

  1. Python实现抓取微信公众号文章

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 前言 对于抓取微信公众号文章主要通过代理ip抓包进行的操作,总会出现一些问题,以下问题导致无法抓包. ...

  2. Python轻松抓取微信公众号文章

    今天继续向 Python 头条添加数据信息,完成了微信公号的爬虫,接下来会继续通过搜狗的知乎搜索抓取知乎上与 Python 相关的文章.问答.微信公众号的文章链接有些是具有时效性的,过一段时间会变成参 ...

  3. python公众号文章_Python 抓取微信公众号文章

    起因是刷微信的时候看到一篇文章,Python 抓取微信公众号文章保存成pdf,很容易搜到,就不贴出来了 先用chrome登陆微信公众号后台,先获取一下自己的cookie,复制下来就行,解析一下转换成 ...

  4. Python2.7爬虫——爬取微信公众号文章

    今天跟着这篇博客抓取微信公众号文章练习了一下爬虫,运行成功.想和大家分享一下过程中出现的问题和解决方法. 运行环境 windows 7 + Pycharm2018 + Python 2.7 目录 目录 ...

  5. 记一次批量定时抓取微信公众号文章的实现

    记一次批量定时抓取微信公众号文章的实现 抓取前的说明和准备 数据的抓取 批量抓取 定时抓取 对爬虫防抓取机制的一些解决办法 最后 抓取前的说明和准备 本次抓取的选择的语言是java,本文章不会将整个工 ...

  6. python爬虫爬取微信公众号小程序信息

    python爬虫爬取微信公众号小程序信息 爬取内容 某汽车维修信息提供的维修店名称,地点以及电话(手机)号码 爬取步骤 啥也别管,先抓包看看,在这里,博主使用的抓包软件是charles 抓包:将网络传 ...

  7. java 微信文章评论点赞_使用fiddler抓取微信公众号文章的阅读数、点赞数、评论数...

    1 设置fiddler支持https 打开fiddler,在菜单栏中依次选择 [Tools]->[Options]->[HTTPS],勾上如下图的选项: 单击Actions,选择Expor ...

  8. python 公众号文章发布_Python 抓取微信公众号文章

    版权声明:此文章转载自 Yushneng PyHub 如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com 微信公众号的文章链接有些是具有时效性的,过一段时间会变 ...

  9. 使用fiddler自动化抓取微信公众号文章的点赞与阅读数

    本文章为lonter首创,只发布在csdn平台,严禁转载 这几天接到任务,需要开发一个微信榜单的功能,因此需要采集微信公众号文章的阅读数,点赞数和评论数,榜单内的微信公众号有一百多个,每个月出一次榜单 ...

最新文章

  1. 二叉树:二叉搜索树实现 逆序数问题
  2. mongodb分享(二)
  3. 自然语言处理(2)-信息论基础
  4. 大四课程设计之基于RFID技术的考勤管理系统(二)读取COM口数据
  5. python二维分布图怎么画_python3怎样画二维点图
  6. 非线性优化库Ceres问题记录
  7. 存储如何做远程服务器数据备份_如何选择存储用的服务器?
  8. php mysql 输出csv_php使用指定编码导出mysql数据到csv文件的方法
  9. 【QT学习】搭建环境+hello world
  10. 在endnote中制作GB/T7714《文后参考文献著录规则》的输出格式 及 编辑Output Styles中特殊符号说明
  11. 用Python实现随机森林回归
  12. latex 数学公式_推荐一款编写数学公式的国产神器:AxMath,可与LATEX双向转换
  13. Python图像变换及手绘效果
  14. githup用户名密码怎么看_水星无线路由器的密码忘了如何解决【解决方法】
  15. 滴滴打车CTO张博:生死战役,技术和时间赛跑
  16. 不良意志品质及其克服
  17. Android Alarm定时任务基础
  18. matlab如何导出表格图表,如何将matlab绘制的图表导入到Word中 | 我爱分享网
  19. windows核心编程 第四章 进程
  20. 数论 II(组合数学)

热门文章

  1. sky光遇弹琴脚本_【光遇科研所】神奇的默契,用动作传递心声
  2. Spring Cloud Alibaba 版本对照详情
  3. win10 uwp 装机必备应用 含源代码
  4. c语言核桃的数量--程序设计,C/C++知识点之核桃的数量(最小公倍数)
  5. BUSMASTER LDF编辑工具制作LDF文件
  6. 投影机检测不到计算机信号,将投影机连接到计算机后,没有信号,如何排除原因?...
  7. Python3 判断参数是否全为Ture, all() 函数详解
  8. 单片机声光电子琴程序流程图_单片机声光电子琴,含原理图,源代码(c代码),成品图...
  9. 基于Matlab OpenCV的随机性形状生成算法
  10. C# 复制Excel工作表(同一个工作簿内进行复制,跨工作簿复制)