Очистите несколько URL с помощью QWebPage

используя Qt 's QWebPage для рендеринга страницы, которая использует javascript для динамического обновления своего контента, поэтому библиотека, которая просто загружает статическую версию страницы (например, urllib2), выиграла 'т работа.

Моя проблема в том, что когда я рендерил вторую страницу, примерно в 99% случаев программа просто зависала. В других случаях он будет работать три раза до сбоя. Я'Мы также получили несколько ошибок, но это все очень случайно.

Я предполагаю, что объект, который яя использую для визуализации isn 'не удаляется должным образом, поэтому попытка его повторного использования может вызвать некоторые проблемы для меня. Я'Я осмотрелся повсюду, и, похоже, никто не сталкивался с такой же проблемой.

Вот'это код, который ям с помощью. Программа скачивает веб-страницы с steam'аСообщество рынка, поэтому я могу создать базу данных всех предметов. Мне нужно позвонитьgetItemsFromPage функционировать несколько раз, чтобы получить все элементы, так как они разбиты на страницы (показаны результаты 1-10 из X количества).

import csv
import re
import sys
from string import replace
from bs4 import BeautifulSoup
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *

class Item:
    __slots__ = ("name", "count", "price", "game")

    def __repr__(self):
        return self.name + "(" + str(self.count) + ")"

    def __str__(self):
        return self.name + ", " + str(self.count) + ", $" + str(self.price)

class Render(QWebPage):  
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def _loadFinished(self, result):
        self.frame = self.mainFrame()
        self.app.quit()
        self.deleteLater()

def getItemsFromPage(appid, page=1):

    r = Render("http://steamcommunity.com/market/search?q=appid:" + str(appid) + "#p" + str(page))

    soup = BeautifulSoup(str(r.frame.toHtml().toUtf8()))

    itemLst = soup.find_all("div", "market_listing_row market_recent_listing_row")

    items = []

    for k in itemLst:
        i = Item()

        i.name = k.find("span", "market_listing_item_name").string
        i.count = int(replace(k.find("span", "market_listing_num_listings_qty").string, ",", ""))
        i.price = float(re.search(r'\$([0-9]+\.[0-9]+)', str(k)).group(1))
        i.game = appid

        items.append(i)

    return items

if __name__ == "__main__":

    print "Updating market items to dota2.csv ..."

    i = 1

    with open("dota2.csv", "w") as f:
        writer = csv.writer(f)

        r = None

        while True:
            print "Page " + str(i)

            items = getItemsFromPage(570)

            if len(items) == 0:
                print "No items found, stopping..."
                break

            for k in items:
                writer.writerow((k.name, k.count, k.price, k.game))

            i += 1

    print "Done."

призваниеgetItemsFromPage однажды работает нормально. Последующие звонки вызывают у меня проблемы. Вывод программы обычно

Updating market items to dota2.csv ...
Page 1
Page 2

и тогда это терпит крах. Это должно продолжаться более 700 страниц.

Ответы на вопрос(1)

Ваш ответ на вопрос