用 PyQt5 写一个傻瓜式的一键数据采集软件
优采云 发布时间: 2022-05-06 06:09用 PyQt5 写一个傻瓜式的一键数据采集软件
数据采集越来越成为了互联网从业者的刚需。
从内部报表,到外部市场动态,大大小小的信息和数据都需要进行收集。爬虫无疑是常规数据采集的方法中最快速有效的那一个。但是,写爬虫,得有一定的编程基础,这谁受得了。市面上也还有一些自助式的数据采集工具,比如:优采云、优采云等等。的确是降低了数据采集和门槛和方便了数据采集的操作。但是这些工具,或多或少都还需要人为地去进行规则的定义和选取。在州的先生「前爬虫职业生涯」中,遇到很多业务人员,就是一个需求:你直接把数据给我就行了。答曰不行,则说:你给个工具给我,让我点一下数据就出来了。其实,我们可以使用 PyQt5 对爬虫程序进行封装和打包,实现傻瓜式、一键点击式的采集软件。这特别适合于人群为普通业务人员,对数据实时性不高,但是又需要需要登录操作的网站。下面,我们就以采集微信公众号后台的数据,作为一个例子,介绍使用 PyQt5 来开发一个一键傻瓜式的数据采集工具。核心采集代码在这里,我们仅仅以采集微信公众号后台的「账号整体情况」数据作为演示:
我们使用 requests 库进行 HTTP 的请求,使用 BeautifulSoup 进行 HTML 文档的解析和数据提取。其核心采集代码如下所示:
<p> def check_status(self):
try:
print("获取到的Cookie:", self.cookie)
print("获取到的Token:",self.token)
# 获取当前登录店铺和用户名
url = 'https://mp.weixin.qq.com/cgi-bin/home?t=home/index&token={token}&lang=zh_CN'.format(token=self.token)
wbdata = requests.get(url, headers=self.header, cookies=self.cookie).text
soup = BeautifulSoup(wbdata,'lxml')
nickname = soup.select_one("a.weui-desktop-account__nickname").get_text()
total_cnt = soup.select("em.weui-desktop-data-overview__desc")[2].get_text()
self.nickname = nickname
except Exception as e:
self.nickname = None
logger.error("获取用户信息出错:{}".format(repr(e)))
return (self.nickname, self.cookie)</p>
构建图形界面因为微信公众号需要登录才能使用,所以我们使用 PyQt5 的 QtWebEngineWidgets 小部件在程序中内嵌一个浏览器,以实现在程序中直接进行登录操作。
可以看到,在这里我们的图形程序主界面分为了两个选项卡,这通过 QTabWidget 选项卡部件来实现。在第一个选项卡,我们放置了一个 QtWebEngineWidgets 的 QWebEngineView 部件,用来展示网页和进行登录操作。在第二个选项卡,我们则放置了按钮部件和文本输入框部件,用来控制数据采集和展示数据采集的进度与结果。
采集流程与控制在程序的图形界面构建好之后,我们需要对程序的功能进行处理。这些功能包括:网页的 Cookie 是我们获取登录状态的关键,在这里通过QtWebEngineWidgets 的 QWebEngineProfile 部件来实现一个浏览器配置文件。QWebEngineProfile 拥有一个 Cookie存储器,每次请求都会将Cookie写入 QWebEngineProfile 中,我们将从这里面读取最新的 Cookie。执行数据的采集通过按钮「检查登录状态」来进行,将按钮的点击信号绑定在一个槽函数上,槽函数内通过调用 QThread,在子线程内执行数据采集的核心代码。而结果的输出,我们是通过文本输出框来实现的。
<p> # 在控制台中写入信息
def outputWritten(self, text=None):
cursor = self.label_1.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.label_1.setTextCursor(cursor)
self.label_1.ensureCursorVisible()</p>
这样,在按钮的槽函数内,调用这个 outputWritten 方法,就可以在文本框内输出采集信息。最终结果最后,我们实现的效果是:打开程序,在「登录页面」选项卡扫码登录微信公众号后台;然后切换到「操作页面」,点击「检查登录状态」按钮,程序就会自动采集数据,最后输出到文本输入框。未登录状态下的效果:
登录状态下的效果:
按照同样的逻辑,我们可以实现采集网页内其他的数据,比如文章列表的数据、关注列表的用户数据等等,或者是其他的网站数据。
是否想让它作为一个「Python 图形界面开发实战的视频教程」来呈现?下方点击「在看」,给它一个登堂的机会,给我一个鼓励吧!