在不久前,我撰写了一篇名为《我是如何利用扣子AI工作流打造个人自媒体情报搜集系统》的公众号文章。这篇文章一经发布,便引起了广泛的关注和讨论。许多读者对文章中介绍的情报搜集方法表示了浓厚的兴趣,并纷纷向我咨询更多细节和操作方法。我尽力回复了每一位读者的疑问,分享了我的经验和技巧。
当前系统的不足
尽管之前的文章和系统得到了积极的反馈,但我也意识到其中存在的不足。最主要的问题是内容长度的限制,这限制了信息的完整性和深度。此外,由于系统是基于现有的工具和平台快速搭建的,它在稳定性和扩展性方面也存在一定的局限。
决定开发一个更完善的独立应用
鉴于上述问题,我决定开发一个更为完善的独立应用。这个新系统将充分利用大模型的能力,提供更强大的数据处理和分析功能。通过结合Streamlit和Selenium,我将构建一个用户界面友好、操作自动化、数据管理高效的情报搜集系统。这不仅能解决内容长度限制的问题,还能提供更灵活、更强大的功能,以满足个人自媒体工作的需求。
用到的技术
Streamlit:快速构建数据应用界面的Python库
Streamlit是一个开源的Python库,它允许开发者快速构建和共享用于数据科学和机器学习的Web应用程序。通过简单的Python脚本,开发者可以创建交互式的数据可视化界面,而无需深入了解Web开发技术。Streamlit的核心优势在于其简洁性和易用性,使得即使是非专业的开发者也能轻松上手。
Selenium:自动化测试工具
Selenium是一个广泛使用的自动化测试工具,它主要用于模拟用户在浏览器中的操作,如点击、输入和页面导航等。通过Selenium,开发者可以编写脚本来自动化执行各种网页操作,这对于需要频繁执行重复性任务的场景尤其有用。在本系统中,Selenium用于自动化登录微信公众号并抓取文章,极大地提高了效率和准确性。
思路解析
使用Streamlit创建用户界面
Streamlit提供了一个简单直观的界面来构建应用程序。在本系统中,我们利用Streamlit创建了一个用户界面,用户可以通过这个界面轻松地触发文章抓取操作。界面上包括了按钮和文本显示区域,用户只需点击按钮即可开始抓取过程,并在文本区域查看抓取状态和结果。
利用Selenium自动化登录微信公众号并抓取文章
Selenium在本系统中扮演了关键角色。我们编写了一个Selenium脚本,用于自动化登录微信公众号。这个脚本首先生成一个登录二维码,用户通过扫描二维码进行登录授权。一旦授权成功,脚本将自动抓取公众号的文章,并将这些文章存储到数据库中。
通过数据库管理抓取的文章数据
抓取的文章数据被存储在SQLite和MySQL数据库中。SQLite用于临时存储和快速查询,而MySQL用于长期存储和复杂查询。我们设计了一套数据管理策略,确保每篇文章的唯一性,并定期更新数据库以保持数据的时效性。通过这种方式,我们可以确保系统中的数据始终是最新和最准确的。
自己写的这个工具,可以轻松显示足够多的情报条目,而不会出发大模型的token限制,更有想象力的是,后期,如果我要扩展更多的功能,那么,独立应用的优势就会变得非常明显,这是coze这类的平台所无法比拟的。
代码实现解析
Streamlit应用构建
在构建我们的个人公众号情报搜集系统时,Streamlit的应用构建起到了至关重要的作用。通过Streamlit,我们能够快速创建一个直观且用户友好的界面,使得用户可以轻松地进行交互操作。
展示如何使用Streamlit创建应用界面
首先,我们通过以下代码初始化Streamlit应用并设置标题:
import streamlit as st
st.title("公众号情报")
这段代码设置了应用的标题为“公众号情报”,为用户提供了一个清晰的界面入口。
解析crew()
和fragment()
函数的实现细节
在Streamlit应用中,我们定义了两个关键函数crew()
和fragment()
,它们分别负责处理公众号文章的抓取和展示。
crew()
函数通过一个按钮触发,执行文章抓取的操作:
@st.experimental_fragment
def crew():
mp_his = Mp_his()
if st.button("抓取公众号文章"):
try:
mp_his.get_mp_qrcode()
st.write("请扫描二维码,并授权登录\n\n")
mp_his.get_his()
except Exception as e:
st.write(f"出现错误:{e}")
st.write("抓取完成")
在这个函数中,当用户点击“抓取公众号文章”按钮时,系统会调用Mp_his
类的get_mp_qrcode()
方法生成登录二维码,并提示用户进行扫描。一旦用户授权登录,get_his()
方法将被调用,自动抓取公众号文章。
fragment()
函数则负责展示已抓取的文章:
@st.experimental_fragment
def fragment():
articles = get_articles_from_mysql()
if st.button("获取对标公众号文章"):
for article in articles:
st.write(f"""
- **[{article[1]}]({article[4]})**
作者:{article[2]}
发布时间:{article[3]}
摘要:{article[5]}
""")
用户点击“获取对标公众号文章”按钮后,该函数会从MySQL数据库中获取文章数据,并以列表的形式展示每篇文章的标题、作者、发布时间及摘要。
通过这两个函数,Streamlit应用提供了一个简单而强大的界面,使得用户可以轻松地进行文章的抓取和查看。
Selenium自动化操作
详细解释Mp_his
类的初始化和功能
Mp_his
类是本系统中用于自动化操作的核心类。在初始化过程中,我们设置了Chrome浏览器的无头模式,并配置了必要的选项:
class Mp_his:
def __init__(self):
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument("--incognito")
self.driver = webdriver.Chrome(options=options)
self.vars = {}
这里,--headless
和--disable-gpu
选项确保浏览器在后台运行,不会显示图形界面,提高了自动化操作的效率。
分析get_mp_qrcode()
和get_his()
方法的实现逻辑
get_mp_qrcode()
方法负责生成并保存登录二维码:
def get_mp_qrcode(self):
self.driver.get("http://mp.weixin.qq.com/")
self.vars["window_handles"] = self.driver.window_handles
qrcode = self.driver.find_element(By.CLASS_NAME, "login__type__container__scan__qrcode")
qrcode.screenshot("./mp_qrcode.png")
subprocess.run(command)
该方法首先访问微信公众号登录页面,然后定位到二维码元素并截图保存为本地文件。接着,通过subprocess.run()
调用外部命令将二维码上传到云存储,以便用户可以扫描。
get_his()
方法则是抓取文章的核心逻辑:
def get_his(self):
WebDriverWait(self.driver, 60).until(expected_conditions.presence_of_element_located(
(By.CSS_SELECTOR, ".new-creation__menu-item:nth-child(2) svg")))
self.driver.find_element(
By.CSS_SELECTOR, ".new-creation__menu-item:nth-child(2) svg").click()
self.vars["win670"] = self.wait_for_window(2000)
self.driver.switch_to.window(self.vars["win670"])
self.driver.find_element(By.ID, "js_editor_insertlink").click()
# 从mp.csv中读取公众号名称
with open('mp.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
...这部分是实用selenium抓取文章并写入数据库的过程,代码较长,省略
print(f"{title} 写入成功")
try:
self.driver.find_element(By.LINK_TEXT, "下一页").click()
except:
break
数据库操作
描述如何使用SQLite和MySQL进行数据存储和查询
在我们的个人公众号情报搜集系统中,数据库扮演着至关重要的角色。我们采用了SQLite和MySQL两种数据库技术,以满足不同的数据存储和查询需求。
SQLite的使用
SQLite是一种轻量级的数据库,非常适合用于存储和查询小规模的数据。在我们的系统中,SQLite主要用于临时存储抓取的文章数据,以便快速进行本地查询和处理。以下是如何在Python中使用SQLite的示例代码:
import sqlite3
# 连接到SQLite数据库
# 如果文件不存在,会自动在当前目录创建一个数据库文件
conn = sqlite3.connect('mp1.db')
# 创建一个游标对象
cursor = conn.cursor()
# 执行SQL语句
cursor.execute("SELECT * FROM mp_articles WHERE link = ?", (link,))
# 获取查询结果
result = cursor.fetchone()
# 关闭连接
conn.close()
在这段代码中,我们首先连接到SQLite数据库,然后执行一个查询语句来检查特定链接的文章是否已存在于数据库中。
MySQL的使用
对于需要长期存储和处理大量数据的情况,我们选择了MySQL。MySQL是一个功能强大的关系型数据库,支持复杂的查询和数据管理。以下是如何在Python中使用MySQL的示例代码:
import mysql.connector
# 连接到MySQL数据库
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="mydatabase"
)
# 创建一个游标对象
mycursor = mydb.cursor()
# 执行SQL语句
mycursor.execute("INSERT INTO mp_articles (title, author, publish_date, link, summary) VALUES (%s, %s, %s, %s, %s)", (title, author, publish_date, link, summary))
# 提交事务
mydb.commit()
# 输出受影响的行数
print(mycursor.rowcount, "记录插入成功")
在这段代码中,我们连接到MySQL数据库,并执行一个插入语句来将新抓取的文章数据添加到数据库中。
解释如何处理数据唯一性和更新策略
为了确保数据的唯一性,我们在插入新数据之前会先检查数据库中是否已存在相同的数据。如果存在,则不会重复插入。此外,我们还实施了定期更新策略,以确保数据库中的数据是最新的。
# 检查数据库中是否存在该文章
def check_exist(self, link):
conn = sqlite3.connect("mp1.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM mp_articles WHERE link = ?", (link,))
result = cursor.fetchone()
conn.close()
return result
在这段代码中,我们定义了一个check_exist
函数,用于检查特定链接的文章是否已在数据库中。如果返回结果不为空,则表示文章已存在。
通过这种数据管理和更新策略,我们的系统能够有效地维护数据的准确性和时效性,为用户提供可靠的信息支持。
总结
系统的优势和可能的改进方向
我们的个人公众号情报搜集系统结合了Streamlit和Selenium的强大功能,为用户提供了一个高效、自动化的数据抓取和管理平台。系统的优势主要体现在以下几个方面:
- 自动化操作:通过Selenium实现自动化登录和文章抓取,大大减少了手动操作的时间和错误率。
- 数据管理:使用SQLite和MySQL进行数据存储,确保了数据的唯一性和时效性,同时支持复杂查询和数据分析。
- 用户友好界面:Streamlit提供的交互式界面使得用户可以轻松地进行操作,无需深入了解技术细节。
尽管系统已经非常强大,但仍有改进的空间。例如,可以增加更多的数据分析功能,如文章趋势分析、关键词提取等,以进一步增强系统的数据处理能力。此外,优化Selenium的抓取策略,提高抓取效率和稳定性,也是未来改进的方向。
强调系统的实用性和对个人自媒体工作的支持
本系统特别适合个人自媒体工作者,尤其是那些需要定期从公众号获取信息并进行分析的用户。通过自动化抓取和数据管理,用户可以节省大量时间,专注于内容创作和策略规划。系统的实用性和高效性,使其成为个人自媒体工作者的强大助手。
通过这篇文章,我们详细介绍了如何利用Streamlit和Selenium构建一个个人公众号情报搜集系统,并展示了系统的实现细节和操作流程。希望这能为有类似需求的读者提供宝贵的参考和启发。
我是加加,十年编程老兵,全栈技术领航者,现专注大模型与AI独立开发。
我不仅是技术的探索者,更是梦想的引路人。
加入我的AI独立开发社群,让我们一起驾驭AI,解锁独立开发的无限潜力,共创技术新纪元。
我在前行的路上,等你一起飞跃。