说明
本脚本仅用于个人学习目的,爬取的文章均用于自我学习,切勿用于非法用途。为了防止非法用途以及Python没怎么学明白,写得比较烂,就不放完整代码了。自行研究打码内容,也比较简单。
代码
本脚本运行前提需要本人登录微信公众平台,并填写相关Cookie信息和token信息后方可正常运行。
# * coding:utf-8 *
import requests
import os
import json
from urllib import parse
"""
By NULL 2021-08-07
1. 写该脚本的原因是由于许多优质量的公众号发布的文章当时没来得及看,然后后面又找不到,所以为了解决该问题,计划编写一个脚本用于获取公众号的文章。
2. 将获取到的文章保存到本地留存,以便于后续查看。
3. 最初以为需要登录才能获取,现在发现不用登录。2021-08-08发现还是要登录。
4. 2021-08-15 只能保存静态文字资源,图片资源无法保存并加载......
思路:创建一个类,该类具有如下方法:
a) 搜索公众号。
b) 获取公众号下所有文章。
5. token记得得换,不然要出问题。
6. 判断是否是培训类以及招聘类无营养文章,后续看情况添加。
"""
query = "xxx" # 公众号名称
token = "111" # 账号token
page = "5" # 批量获取的文章页数,以页为单位,一页有5篇文章,所以5页即25篇文章。
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
"Referer": "马赛克"+token+"马赛克",
"Cookie": "aaa"
}
def get_wechat_name():
search_name = "马赛克"
print("正在搜索的微信公众号名称为:"+query)
search_result = requests.get(url=search_name, headers=headers)
search_target = json.loads(search_result.text)
if "马赛克" in search_target:
print(search_target)
print("出错,请检查!")
else:
search_all_list = search_target["马赛克"][0]
search_fackeid = search_all_list["马赛克"]
if search_all_list["马赛克"] == query:
print("公众号搜索完毕,开始获取文章列表")
for begin in range(0, int(page), 5):
print("====== start ====")
get_text_list = "马赛克"+str(begin)+"马赛克"+search_fackeid+"马赛克"+token+"马赛克"
get_text_url = requests.get(url=get_text_list, headers=headers)
get_text_result = json.loads(get_text_url.text)
if "马赛克" in get_text_result:
get_target_urls = get_text_result["马赛克"]
# print(get_target_urls)
for get_target_url in get_target_urls:
title = get_target_url["title"]
# 替换的原因是由于Windows文件命名不允许有某些特殊字符,而部分文章刚好存在这些字符,需要替换,不然要出错。
file_name = title.replace("|", "-").replace("/", "-").replace("\\", "-").replace(":", "-").replace("?", "-").replace("*", "-").replace("\"", "-").replace("'", "-")
# print(title + ":" + get_target_url["马赛克"])
print("\t"+title)
count_path = os.getcwd()+"\\收集\\"
os.chdir(count_path)
check_dir = os.path.exists(query)
if not check_dir:
os.mkdir(query)
os.chdir(count_path+query)
else:
os.chdir(count_path+query)
get_text = requests.get(url=get_target_url["马赛克"], headers=headers)
save_result = get_text.text.replace("data-src", "src")
target_text = open(file_name+".html", "w+", encoding="utf-8")
target_text.write(save_result)
target_text.close()
else:
print("出错,请检查,具体我也不会解决,可能是超出上限了。")
print(get_text_result)
break
print("所有指定范围内的文章获取完毕,请确认!")
else:
print("公众号不存在,请确认!")
def get_content():
query1 = "这是测试"
count_path = os.getcwd() + "\\收集\\" #这里有bug,需要设置上面的count_path为绝对路径。
title = "测试文章1"
os.chdir(count_path)
os.mkdir(query1)
os.chdir(count_path+query1)
link = "马赛克"
target_content = requests.get(url=link, headers=headers)
content = open(title+".html", "w+", encoding="utf-8")
content.write(target_content.text)
get_wechat_name()
运行后将文章以html格式保存,效果如下:
注:爬取的文章发布者也是全部打包分享了的,所以不存在非法行为。
第二版
需要修改count_path路径为一个存在的目录。
python
# * coding:utf-8 *
import requests
import os
import json
from urllib import parse
import sys
"""
By Hidu 2021-08-07
1. 写该脚本的原因是由于许多优质量的公众号发布的文章当时没来得及看,然后后面又找不到,所以为了解决该问题,计划编写一个脚本用于获取公众号的文章。
2. 将获取到的文章保存到本地留存,以便于后续查看。
3. 最初以为需要登录才能获取,现在发现不用登录。2021-08-08发现还是要登录。
4. 2021-08-15 只能保存静态资源,网络资源无法保存并加载,如图片等......
思路:创建一个类,该类具有如下方法:
a) 搜索公众号。
b) 获取公众号下所有文章。
5. token记得得换,不然要出问题。
6. 判断是否是培训和广告类文章,后续看情况添加。
"""
"""
https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query=%E9%98%BF%E9%87%8C%E4%BA%91%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94&token=945142362&lang=zh_CN&f=json&ajax=1
用于查找微信公众号
https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI5MzY2MzM0Mw==&type=9&query=&token=1107353416&lang=zh_CN&f=json&ajax=1
用于查找微信公众号文章列表
"""
def get_wechat_name():
search_name = "https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query="+parse.quote(query)+"&token="+token+"&lang=zh_CN&f=json&ajax=1"
print("正在搜索的微信公众号名称为:"+query)
search_result = requests.get(url=search_name, headers=headers)
search_target = json.loads(search_result.text)
if "err_msg" in search_target:
print(search_target)
print("出错,请检查!")
else:
search_all_list = search_target["list"][0]
search_fackeid = search_all_list["fakeid"]
if search_all_list["nickname"] == query:
print("公众号搜索完毕,开始获取文章列表")
# 文章可以一次获取一篇,能不能更改为某个范围内的文章?答案:可以,后面再改。
for begin in range(0, int(page), 5):
# print("\t====== start ====")
# 下面这一步获取公众号文章列表,一页有5篇文章,输入数字表示从第几篇文章开始搜索。例如:5 表示从第5篇开始获取,获取5篇文章。下一次获取文章从第10篇开始,获取5篇文章,以此类推。
get_text_list = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin="+str(begin)+"&count=5&fakeid="+search_fackeid+"&type=9&query=&token="+token+"&lang=zh_CN&f=json&ajax=1"
get_text_url = requests.get(url=get_text_list, headers=headers)
get_text_result = json.loads(get_text_url.text)
# print(get_text_result)
if "app_msg_list" in get_text_result:
get_target_urls = get_text_result["app_msg_list"]
# print(get_target_urls)
for get_target_url in get_target_urls:
# print(get_target_url)
# 下面这一步是获取范围内的标题信息。
title = get_target_url["title"]
# 替换的原因是由于Windows文件命名不允许有某些特殊字符,而部分文章刚好存在这些字符,需要替换,不然要出错。
file_name = title.replace("|", "-").replace("/", "-").replace("\\", "-").replace(":", "-").replace("?", "-").replace("*", "-").replace("\"", "-").replace("'", "-")
# print(title + ":" + get_target_url["link"])
print("\t"+title)
os.chdir(count_path)
check_dir = os.path.exists(query)
if not check_dir:
os.mkdir(query)
os.chdir(count_path+query)
else:
os.chdir(count_path+query)
get_text = requests.get(url=get_target_url["link"], headers=headers)
save_result = get_text.text.replace("data-src", "src")
target_text = open(file_name+".html", "w+", encoding="utf-8")
target_text.write(save_result)
target_text.close()
# break
else:
print("出错,请检查,具体我也不会解决,可能是超出上限了。")
print(get_text_result)
break
print("所有指定范围内的文章获取完毕,请确认!")
else:
print("公众号不存在,请确认!")
if name == "__main__":
if len(sys.argv) == 4:
token = sys.argv[1]
query = sys.argv[2]
page = sys.argv[3]
Cookie = open("cookie.txt","r",encoding="utf-8")
# page = "2" # 批量获取的文章,以页为单位,一页有5篇文章。
count_path = "D:\\安全大杂烩\\文章记录\\公众号收集\\" # 文件保存的路径,这里有bug,需要更改(已修改)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 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",
"Cookie": Cookie.read()
}
get_wechat_name()
# print("ok")
else:
print("使用:\n Wechat.py [token] [微信公众号名称] [页数(5的倍数)]")
结尾
该脚本存在一些缺陷,由于文章内部的图片是保存的src形式,所以若是原文章删除的情况,则只能看到文字信息而看不到图片信息;仅用于记录当时写这个脚本的想法,仅供参考。
还有就是脚本可能优化不了了,令人头大。