微信公众号历史文章抓取
微信公众号历史文章抓取
- 目录结构
WechatSpider
│ README.md
│ chromedriver.exe
│ main.py
│ gzhspider.py
│ requirements.txt
- gzhspider.py 文件
import json
import time
import pathlib
import requests
from queue import Queue
from threading import Thread
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Optionsclass Spider:def __init__(self, url, sleep=3):self.headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","cookie": None,"sec-fetch-dest": "document","sec-fetch-mode": "navigate","sec-fetch-site": "none","sec-fetch-user": "?1","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}self.cookie = Noneself.url = urlself.root = url.split("?").pop(0)self.queue = Queue()self.SLEEP = sleepdef __init_headers(self):ch_options = Options()ch_options.add_argument("--headless") # => 为Chrome配置无头模式web = webdriver.Chrome(options=ch_options)web.get(self.url)for request in web.requests:for t in request.headers.items():if "cookie" in t and self.root in str(request.headers.items()):self.headers["cookie"] = dict(request.headers.items())['cookie']print(">>请求头初始化完成...")return Trueif self.headers["cookie"] is None:print("获取请求头部文件失败")return Falsedef __get_params(self):url = self.url.split('profile_ext?').pop()url = url.split("&")d = {}for i in url:li = i.split("=")key = li.pop(0)d[key] = "=".join(li)params = {'action': 'getmsg','__biz': d['__biz'],'f': 'json','offset': '0','count': '10','is_ok': '1','scene': d['scene'],'uin': d['uin'],'key': d['key'],'pass_ticket': d['pass_ticket'],'wxtoken': '','appmsg_token': '','x5': '0'}return paramsdef __crawling(self):page = 0params = self.__get_params()print(">>循环抓取中...")while True:offset = page * 10params['offset'] = offseturl = self.url.replace("https", "http")res = requests.get(url=url + "?", headers=self.headers, params=params)data = res.json()if res.status_code == 200 and "general_msg_list" in data:if data['msg_count'] == 0:self.queue.put(None)breakdata = data['general_msg_list'] # json字符串data = json.loads(data)['list'] # data目前是列表 里面是字典# nex_data = []nex_data = [x['app_msg_ext_info'] for x in data] # 遍历data生成列表[dict, dict,...]self.queue.put(nex_data) # 数组放进队列# print(nex_data)page += 1print(">>成功抓取" + str(page) + "页!!!")else:print("数据抓取失败")print(data)self.queue.put(None)breaktime.sleep(self.SLEEP)# self.queue.put(None)# breakdef __save(self, filename="test", dir_path="./"):if not dir_path.endswith("/"):dir_path = dir_path + "/"suffix = ".csv"pathlib_dir_path = pathlib.Path(dir_path)pathlib_filename = pathlib.Path(filename)pathlib_dir_path.mkdir(parents=True, exist_ok=True) # 创建目录# 标题栏# title = ["序号", "标题", "url", "\n"]# with open(file_ab_name, "a+", encoding='utf-8') as f:# f.writelines(",".join(title))count = 1file_ab_name = dir_path + filename + suffixwhile True:nex_data = self.queue.get()if nex_data is None: # 跳出循环break# 做格式化处理with open(file_ab_name, "a+", encoding='utf-8') as f:for i in range(len(nex_data)):line_id = '{}'.format(str(i + 1))title = '"{}"'.format(nex_data[i]['title'])url = '"{}"'.format(nex_data[i]['content_url'])data_line = [line_id, title, url, '\n']f.writelines(",".join(data_line))def start(self, save_path, filename):if self.__init_headers():th_craw = Thread(target=self.__crawling)th_save = Thread(target=self.__save, args=(filename, save_path))th_craw.start()th_save.start()th_craw.join()th_save.join()print("爬取完成_ok_ok")print("程序退出..")
- main.py 文件
from gzhspider import Spider# 【***************************请先修改配置参数再运行***************************】
# 推荐使用python3.9.12版本。
# 公众号主页URL
HOME_URL = "xxxxxxxxxxxxxxx"# 文件保存目录
SAVE_PATH = "./"# 保存文件名(不需要加后缀)
FILE_NAME = "test1"# 请求间隔(单位:秒)
SLEEP = 3if __name__ == '__main__':spider = Spider(HOME_URL, SLEEP)spider.start(SAVE_PATH, FILE_NAME)
- requirements.txt 文件
requests==2.28.1
selenium==4.7.2
selenium_wire==5.1.0
- README.md 文件
## 推荐python版本 3.9.12
1.安装目录内 ChromeSetup.exe(依赖Chrome浏览器108.0.5359)
2.安装依赖库 requests 和 selenium-wire推荐使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt安装依赖(必须在本文将同目录下运行)
3.修改main.py内参数(可设置保存路径和文件名, HOME_URL必传)
4.命令行运行 main.py文件 : python main.py
- chromedriver.exe 文件
爬虫执行依赖,需要与自己的chrome浏览器版本对应(需要安装chrome浏览器才能使用本爬虫程序)
下载地址:http://chromedriver.storage.googleapis.com/index.html
微信公众号历史文章抓取相关推荐
- 如何抓取微信公众号历史文章?使用订阅号实现微信公众号历史文章爬虫
微信订阅号已经改版了,这篇文章已经过时了,不过可以提供还算有价值的参考. 微信公众号已经成为生活的一部分了,虽然里面有很多作者只是为了蹭热点,撩读者的 G 点,自己从中获得一些收益:但 ...
- python爬取公众号历史文章_pythons爬虫:抓取微信公众号 历史文章(selenium+phantomjs)...
原标题:pythons爬虫:抓取微信公众号 历史文章(selenium+phantomjs) 大数据挖掘DT数据分析 公众号: datadw 本文爬虫代码可以通过回复本公众号关键字"公众号& ...
- Python爬取微信公众号历史文章进行数据分析,发现2017年运营总结,可以这样写!...
作者:刘晓明,互联网公司运维技术负责人,拥有10年的互联网开发和运维经验.一直致力于运维工具的开发和运维专家服务的推进,赋能开发,提高效能. 广告时间:最后给自己代个盐~~欢迎大家有空时翻下我牌子(知 ...
- 【Python爬虫】微信公众号历史文章和文章评论API分析
上一篇文章爬取微信公众号文章信息准备工作介绍了微信公众号历史文章和文章评论API的组成情况,历史文章API格式:https://mp.weixin.qq.com/mp/profile_ext?acti ...
- 订阅号微信公众号历史文章爬虫php,一步步教你怎么打造微信公众号历史文章爬虫...
原标题:一步步教你怎么打造微信公众号历史文章爬虫 开篇语: 邓爷爷曾说过:不管黑猫白猫,逮到耗子就是好猫.不管我是凑的还是笨办法堆出来的,确实把批量导出微信公众号所有历史文章的这个功能给做出来了,而且 ...
- 获取微信公众号历史文章列表页链接
通用公式:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=这里替换你的biz== Tips:红字内容为下面找到的biz值,切 ...
- 记一次微信公众号后台数据抓取
记一次微信公众号后台数据抓取 缘起 思路 缘起 自己参与的公众号做年末总结,需要进行数据爬取,但是微信自带的api只能进行最多一个月的数据对照,不太方便,于是决定自己写一个脚本.原本想用py爬虫,但是 ...
- python下载微信公众号文章_python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。...
需求: 想阅读微信公众号历史文章,但是每次找回看得地方不方便. 思路: 1.使用selenium打开微信公众号历史文章,并滚动刷新到最底部,获取到所有历史文章urls. 2.对urls进行遍历访问,并 ...
- python爱好者社区公众号历史文章合集_如何优雅的抓取微信公众号历史文章
这是几天前在公众号上发的文章,主要讨论现在微信公众号文章抓取的一般思路以及优缺点,我不会讲技术细节,但我会分享别人已经开源的项目,你可以参考代码开了解其中的细节. 背景 微信公众号历史记录只可以通过客 ...
最新文章
- 为打击网络喷子 Instagram禁评论攻击
- 【Egret】WebSocket 的使用说明
- Unity_UIWidgets学习笔记03_组件_Container
- Matlab实用程序--图形应用-轮廓图
- 集群镜像:实现高效的分布式应用交付
- Sencha Touch 打包javaScript 和 css
- python 作用域嵌套_python嵌套作用域问题
- 今天携程出事了:让我们来学习下http的响应码
- 适应关键业务环境的加湿系统
- sql server中case的简单示例
- 理解 static (深入了解JAVA虚拟机)
- 【转】JMeter学习(十八)JMeter测试Java(二)
- 黑马程序员_Java基础(环境搭建、进制转换、运算符)
- Redis 实战场景
- 圆柱体积怎么算立方公式_圆柱体积公式怎么算
- 鸡尾酒会公式\帕金森定律(Parkinson's Law)
- 模拟人生4 Mac(经营模拟游戏)全DLC可无限金币版
- 【jQwidgets】简单封装示例
- 阿里云上的Docker容器镜像仓库
- 能耗监测系统是干嘛的?
热门文章
- 用python画lgx的图_2020Python练习14——装饰器
- Android手机软件开发 课程 教学 大纲
- 天数最少的年份_为何每年二月天数最少且每月有长有短?只因凯撒大帝一句话...
- java翻牌游戏_js实现翻牌小游戏
- java applet 输出多行_java – 在Applet中列出输入和输出音频设备
- Springboot毕设项目基于springboot的“E车易购”平台的设计与实现ic8ga(java+VUE+Mybatis+Maven+Mysql)
- 深度学习:LeNet-5实现服装分类(PyTorch)
- JSP获取客户端信息
- java jredis hset_SpringBoot中 集成 redisTemplate 对 Redis 的操作(四)HSet
- C#模拟PrtScn实现截屏