python公众号文章_Python 抓取微信公众号文章
起因是刷微信的时候看到一篇文章,Python 抓取微信公众号文章保存成pdf,很容易搜到,就不贴出来了
先用chrome登陆微信公众号后台,先获取一下自己的cookie,复制下来就行,解析一下转换成 Json 格式写入文本
import json
# 自己公众号的 Cookie 字符串
cookie_str = "粘贴到这里"
cookie = {}
for cookies in cookie_str.split("; "):
cookie_item = cookies.split("=")
cookie[cookie_item[0]] = cookie_item[1]
# 将cookies写入到本地文件
with open('cookies.txt', "w") as file:
file.write(json.dumps(cookie))
然后在新建图文消息的地方插入超链接,搜索想要的微信公众号名称后选一篇文章,F12可以看到一些信息,begin 是从第几篇文章开始,count 是一次查出几篇,fakeId 对应这个公号的唯一 Id,token 是通过 Cookie 信息来获取的。
核心代码如下
# gzh_download.py
#-*- coding = utf-8 -*-
# 引入模块
import requests
import json
import re
import random
import time
import pdfkit
# 打开 cookie.txt
with open("cookies.txt", "r") as file:
cookie = file.read()
cookies = json.loads(cookie)
url = "https://mp.weixin.qq.com"
#请求公号平台
response = requests.get(url, cookies=cookies)
# 从url中获取token
token = re.findall(r'token=(\d+)', str(response.url))[0]
# 设置请求访问头信息
headers = {
"Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token=" + token + "&lang=zh_CN",
"Host": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
}
path_wk = r'E:\迅雷下载\Compressed\wkhtmltox-0.12.5-1.mxe-cross-win64\wkhtmltox\bin\wkhtmltoimage.exe' #安装位置
config = pdfkit.configuration(wkhtmltopdf = path_wk)
#pdfkit.from_url(url, r'D:\are you coding\pdf\taobao.pdf', configuration=config)
# 循环遍历前10页的文章,每页有5篇
for j in range(1, 10, 1):
begin = (j-1)*5
# 请求当前页获取文章列表
requestUrl = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin="+str(begin)+"&count=5&fakeid=填刚刚的fakeid&type=9&query=&token=" + token + "&lang=zh_CN&f=json&ajax=1"
search_response = requests.get(requestUrl, cookies=cookies, headers=headers)
# 获取到返回列表 Json 信息
re_text = search_response.json()
list = re_text.get("app_msg_list")
# 遍历当前页的文章列表
for i in list:
# 将文章链接转换 pdf 下载到当前目录
print(i["link"], i["title"])
text = i["link"] + "<=====>" + i["title"]
with open('article_link.txt','wb') as f:
f.write(text)
# pdfkit.from_url(i["link"], i["title"] + ".pdf", configuration=config)
# 过快请求可能会被微信问候,这里进行10秒等待
time.sleep(10)
这段代码是直接粘过来的,稍微做了点改动,将 URL 转成 PDF 时使用的是 pdfkit 的模块,使用这个需要先安装 wkhtmltopdf,官网https://wkhtmltopdf.org/downloads.html直接下载相应版本,由于我下载的便携版,所以写入pdf的时候增加了configuration=config
这样执行下来会有个问题,微信公众号的图片无法写入pdf文件中,于是我就先把每篇文章的链接保存下来,防止每次运行都爬一次,被ban。
不显示图片,无奈了,很多图片还是很重要的,毕竟是为了学习[狗头]
搜索一下,我发现可以用的解决方法有两个,一是使用wechatsogou(基于搜狗微信搜索的微信公众号爬虫接口),使用这个模块中一个接口来处理
# 该方法根据文章url对html进行处理,使图片显示
content_info = ws_api.get_article_content(url)
# 得到html代码(代码不完整,需要加入head、body等标签)
html_code = content_info['content_html']
感觉用这个的话还得重新爬一边,就没多研究这个,收藏以后研究
来自这个网站
https://www.lagou.com/lgeduarticle/37166.html
还有一种方法就是把所有的图片下载到本地,然后用wkhtmltopdf生成pdf,就没有问题了,本着拿来即用的态度,找到一篇
来自这个博客
https://blog.csdn.net/weixin_41267342/article/details/96729138
稍作改动,配合自己之前生成的链接文本
# -*- coding:utf-8 -*-
import json
import re
import time
from bs4 import BeautifulSoup
import requests
import os
# 保存页面到本地
def save_html(url_content,htmlDir,file_name):
f = open(htmlDir+"\\"+file_name+'.html', 'wb')
f.write(url_content.content) # save to page.html
f.close()
return url_content
# 修改文件,将图片路径改为本地的路径
def update_file(old, new,htmlDir):
with open(htmlDir+"\\"+file_name+'.html', encoding='utf-8') as f, open(htmlDir+"\\"+file_name+'_bak.html', 'w',
encoding='utf-8') as fw: # 打开两个文件,原始文件用来读,另一个文件将修改的内容写入
for line in f: # 遍历每行,取出来的是字符串,因此可以用replace 方法替换
new_line = line.replace(old, new) # 逐行替换
new_line = new_line.replace("data-src", "src")
fw.write(new_line) # 写入新文件
os.remove(htmlDir+"\\"+file_name+'.html') # 删除原始文件
time.sleep(10)
os.rename(htmlDir+"\\"+file_name+'_bak.html', htmlDir+"\\"+file_name+'.html') # 修改新文件名, old -> new
print('当前保存文件为:'+file_name+'.html')
# 保存图片到本地
def save_file_to_local(htmlDir,targetDir,search_response,domain):
obj = BeautifulSoup(save_html(search_response,htmlDir,file_name).content, 'lxml') # 后面是指定使用lxml解析,lxml解析速度比较快,容错高。
imgs = obj.find_all('img')
# 将页面上图片的链接加入list
urls = []
for img in imgs:
if 'data-src' in str(img):
urls.append(img['data-src'])
elif 'src=""' in str(img):
pass
elif "src" not in str(img):
pass
else:
urls.append(img['src'])
# 遍历所有图片链接,将图片保存到本地指定文件夹,图片名字用0,1,2...
i = 0
for each_url in urls: # 看下文章的图片有哪些格式,一一处理
if each_url.startswith('//'):
new_url = 'https:' + each_url
r_pic = requests.get(new_url)
elif each_url.startswith('/') and each_url.endswith('gif'):
new_url = domain + each_url
r_pic = requests.get(new_url)
elif each_url.endswith('png') or each_url.endswith('jpg') or each_url.endswith('gif') or each_url.endswith('jpeg'):
r_pic = requests.get(each_url)
t = os.path.join(targetDir, str(i) + '.jpeg') # 指定目录
print('当前保存图片为:' + t)
fw = open(t, 'wb') # 指定绝对路径
fw.write(r_pic.content) # 保存图片到本地指定目录
i += 1
update_file(each_url, t, htmlDir) # 将老的链接(有可能是相对链接)修改为本地的链接,这样本地打开整个html就能访问图片
fw.close()
#下载html页面和图片
def save(search_response,file_name):
htmlDir = os.path.join(os.path.dirname(os.path.abspath(__file__)), file_name)
targetDir = os.path.join(os.path.dirname(os.path.abspath(__file__)),file_name+'\imgs1') # 图片保存的路径,eg,向前文件夹为'D:\Coding', 即图片保存在'D:\Coding\imgs1\'
if not os.path.isdir(targetDir): # 不存在创建路径
os.makedirs(targetDir)
domain = 'https://mp.weixin.qq.com/s'
save_html(search_response, htmlDir,file_name)
save_file_to_local(htmlDir, targetDir, search_response, domain)
# 获得登录所需cookies
with open("cookies.txt", "r") as file:
cookie = file.read()
cookies = json.loads(cookie)
url = "https://mp.weixin.qq.com"
response = requests.get(url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
print(token)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&token="+token+"&lang=zh_CN",
"Host": "mp.weixin.qq.com",
}
f = open("article_link.txt", encoding='utf-8') # 返回一个文件对象
line = f.readline() # 调用文件的 readline()方法
for line in open("article_link.txt", encoding='UTF-8'):
new_line = line.strip()
line_list = new_line.split("<=====>")
file_name = line_list[1]
#dir_name = line_list[1]
requestUrl = line_list[0]
search_response = requests.get(requestUrl, cookies=cookies, headers=headers)
save(search_response, file_name)
print(file_name+"----------------下载完毕:"+requestUrl)
time.sleep(2)
file.close()
通过这个程序,就把所有的链接的图片下载到当前目录,并把html里的图片路径转换成了本地「绝对」路径,为什么绝对要加引号呢,因为绝对路径,意味着移动一下就不能用了,尴尬。不过还好不影响我现在用wkhtmltopdf生成pdf文档,python也安装了pdfkit,不过我突然有种错觉,似乎写个bat更简单,果然,学习一下bat,几行就搞定了,这么多字了,这部分下篇再写。
还有替换绝对路径,也放在下篇吧,简单的正则替换。
回到刚刚下载html,真正执行的时候,还有个很大的问题,太慢了,单线程的,睡了一觉,玩了半天才下载了不到40篇,想到我之前也学习过多线程的脚本,但是记忆有点模糊,重新拾起似乎还要复习一会,而且也容易被ban吧,毕竟用的是公众号的cookie,不太安全,遂采用手工多线程,开四个程序慢慢跑-----就是把链接文本拆分一下,保存成4个文档,再稍微改一下主程序,开四个窗口跑[再次狗头],后面再优化一下这个脚本。
题图:Pexels 上的 Bryan Gomes 拍摄的照片
python公众号文章_Python 抓取微信公众号文章相关推荐
- python公众号文章_Python抓取微信公众号文章
公众号 灏泽异谈 文章列表链接 使用charles分析公众号请求 如图 image.png 找有用信息 完整URL请求地址 完整的请求头(headers)信息,Headers里面包括了cookie.U ...
- python简答题及答案查询公众号和软件_Python 抓取微信公众号账号信息的方法
搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息 爬虫 ...
- python爬取公众号文章_python爬取微信公众号历史文章
前几天,朋友有一个爬取某些指定微信公众号的历史文章的需求,刚好自己闲的没事,也就试了一试.不算完美解决问题了吧,但是自己也无能为力了,毕竟腾讯那么牛,斗不过斗不过. 一.思路 看了一些别人的文章,综合 ...
- python 公众号文章发布_Python 抓取微信公众号文章
版权声明:此文章转载自 Yushneng PyHub 如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com 微信公众号的文章链接有些是具有时效性的,过一段时间会变 ...
- Python大佬利用新接口抓取微信公众号的所有文章
各位小伙儿伴儿,一定深受过采集微信公众号之苦吧!特别是!!!!!!公共号历史信息!!!这丫除了通过中间代理采集APP.还真没什么招数能拿到数据啊! 直到············ 很多人学习python ...
- Python实现抓取微信公众号文章
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 前言 对于抓取微信公众号文章主要通过代理ip抓包进行的操作,总会出现一些问题,以下问题导致无法抓包. ...
- python爬取公众号历史文章_pythons爬虫:抓取微信公众号 历史文章(selenium+phantomjs)...
原标题:pythons爬虫:抓取微信公众号 历史文章(selenium+phantomjs) 大数据挖掘DT数据分析 公众号: datadw 本文爬虫代码可以通过回复本公众号关键字"公众号& ...
- Python 抓取微信公众号账号信息
搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息 爬虫 ...
- Python项目实战:抓取微信公众号账号信息
搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息( 爬虫 ...
最新文章
- android检测本地是否安装,在本地测试模块的安装
- MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器
- 三年级计算机课教案文档,小学三年级信息技术第十三课文件和文件夹教学设计...
- tomcat 的安全规范
- 华为鸿蒙系统新机发布时间,华为鸿蒙OS发布会定档,或将有多款新机亮相
- Oracle APEX 系列文章7:Oracle APEX 18.1 新特性
- 判断当前时间是否在某个时间范围内
- 让UpdatePanel支持文件上传(4):数据传输与解析机制
- 微软加入反 Flash 阵营,新版 Edge 默认屏蔽 Flash
- Android常见音频通路(十四)
- 创业公司如何构建数据指标体系?
- 解决xftp6 要继续使用此程序,您必须应用最新的更新或使用新版本
- 最小二乘支持向量机(LSSVM)学习记录
- 三日济州岛,何以韩国人眼光?-让自己慢下来(43)
- logo一键制作器源码
- 高中数学立体几何证明套路高考试题(附答案)
- linux系统下网络吞吐量/CPU占用率/流量控制的测试
- 150. 逆波兰表达式求值(中等 栈 数组)
- Excel多列筛选同一个数据
- 【徕卡全站仪Geocom开发】开发日志#01
热门文章
- UltralSo制作u盘映像,出现“设备忙,请关闭其他应用程序”的处理方法。
- 新浪微博热搜榜“背后的男人”讲述热搜背后的秘密
- 工业动画制作过程介绍(一)——静态简笔图画的制作
- 强制退出当前ubuntu命令
- php: 远程操作浏览器cookie存储入门
- 商业需求响应管理系统行业调研报告 - 市场现状分析与发展前景预测
- android 九宫格封装,Android 实现九宫格、点击图片放大全屏浏览等
- cas虚拟服务器,适用于CAS虚拟化平台的CloudOS3.0云主机镜像的制作
- Allegro不规则带通孔焊盘的制作
- 受用一生的高效 PyCharm 使用技巧