Python GUI 爬虫卡顿问题

0 投票
2 回答
508 浏览
提问于 2025-04-15 22:15

我之前用Python写了一个抓取网页的程序,在命令行下运行得很好。现在我给这个程序做了一个图形界面(GUI),但遇到了一个问题。当我想在界面上更新一些文字,比如显示“正在获取第12个链接,共50个”时,界面上并没有显示出来,因为抓取的函数正在获取100多个链接。同时,当我从一个抓取函数切换到一个应该更新界面的函数,再切换到另一个抓取函数时,更新界面的函数似乎被跳过了,直接运行下一个抓取函数。举个例子:

scrapeLinksA() #takes 20 seconds
updateInfo("LinksA done")
scrapeLinksB() #takes another 20 seconds

在上面的例子中,updateInfo这个函数根本没有被执行,除非我用键盘中断程序。

我在想,解决这个问题可能需要用到线程,但我不太确定。我该怎么做才能解决这个问题呢?

我使用的工具有:

  • PyQt4
  • urllib2
  • BeautifulSoup

2 个回答

2

我建议使用 QNetworkAccessManager 来实现一种不阻塞的方式下载网页。这是一种不同的方法,所以你可能需要重写你应用程序的处理部分。与其等着网页下载完成再去解析,不如使用多个小函数,通过信号连接在一起,当某些事件发生时(比如“网页下载完成”)就会执行这些函数。

2

Lukáš Lalinský 的回答非常不错。

还有一种选择是使用 PyQt 线程

如果问题只是出在“更新”这部分(而不是需要异步处理),可以尝试在以下代码之间放入这个调用:

QCoreApplication.processEvents()

scrapeLinksAscrapeLinksB 之间插入这个调用,看看是否有帮助(这会暂时中断主事件循环,以检查是否有其他待处理的请求,比如绘图请求等)。

如果这样做还是不行,请提供 updateInfo 的源代码。

撰写回答