Проблемы с зависанием Python GUI Scraper - PullRequest
0 голосов
/ 02 мая 2010

Некоторое время назад я написал скребок, использующий python, и он отлично работал в командной строке. Я сделал графический интерфейс для приложения сейчас, но у меня проблемы с одной проблемой. Когда я пытаюсь обновить текст внутри графического интерфейса (например, «извлечение URL 12/50»), я не вижу, как функция внутри скребка захватывает более 100 ссылок. Кроме того, при переходе от одной функции очистки к функции, которая должна обновлять графический интерфейс, к другой функции, функция обновления графического интерфейса, похоже, пропускается при выполнении следующей функции очистки. Примером может быть:

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

в приведенном выше примере updateInfo никогда не выполняется, если я не завершу программу с KeyboardInterrupt.

Я думаю, что мое решение является многопоточным, но я не уверен. Что я могу сделать, чтобы это исправить?

Я использую:

  • PyQt4
  • urllib2
  • BeautifulSoup

Ответы [ 2 ]

2 голосов
/ 02 мая 2010

Lukáš Lalinský ответит очень хорошо.

Другой возможностью было бы использование PyQt threads .

Если проблема заключается только в части «обновления»(а не необходимость асинхронной обработки), попробуйте поместить этот вызов:

QCoreApplication.processEvents()

между scrapeLinksA и scrapeLinksB, чтобы посмотреть, помогает ли это (он временно прерывает основной цикл событий, чтобы увидеть, есть лидругие (запросы на рисование, например, ожидающие рассмотрения).

Если это не так, сообщите нам источник updateInfo.

2 голосов
/ 02 мая 2010

Я бы предложил использовать QNetworkAccessManager для неблокирующего способа загрузки сайтов. Это другой подход, поэтому вы, вероятно, перепишете часть обработки вашего приложения. Вместо того, чтобы ждать загрузки страницы, чтобы вы могли ее проанализировать, у вас есть несколько небольших функций, связанных через сигналы, и они выполняются, когда происходят некоторые события (например, «страница загружена»).

...