Вот некоторый асинхронный код для предоставления очереди для поиска amazon с помощью selenium, почему я получаю ошибку атрибута? __Инициализация__ не выполняется?

0

Вопрос

Вот код, который я использую для поиска amazon в моем веб-приложении tornado. На данный момент у меня создан только один из этих классов (и один веб-драйвер). Возможно, в будущем мне понадобится их пул (да, я знаю, что есть сетка selenum, но это не мой вопрос). Мой вопрос в том, почему __init__, по-видимому, не работает? Почему существует ошибка атрибута для доступа к var self.queue, которая четко определена в __init__?

import asyncio
import uuid
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.common.exceptions import NoSuchElementException


class Searcher:
    def __init___(self):
        self.driver = webdriver.Firefox(executable_path="/home/felix/project/geckodriver")
        self.wait = WebDriverWait(self.driver, 10)
        self.driver.get("https://amazon.com/")
        self.queue = []

    async def _search(self, query):
        self.driver.find_element(By.ID, "twotabsearchtextbox").send_keys("pixel" + Keys.RETURN)
        self.wait.until(presence_of_element_located((By.XPATH,
                "//div[contains(@class, 'sg-col-inner')]/div[contains(@class, 'a-section')]"
                "/div[contains(@class, 'a-section')]")))
        el = self.driver.find_elements(By.XPATH,
                "//div[contains(@class, 'a-section')]/div[h2][not(contains(.,'Sponsored'))]"
                "[contains(@class, 'a-section')]/..")
        out=[]
        for e in range(len(el)):
            try:
                out+=[{"price": el[e].find_element(By.XPATH, ".//span[contains(@class, 'a-price-whole')]").text + "." +
                el[e].find_element(By.XPATH, ".//span[contains(@class, 'a-price-fraction')]").text,
                "title": el[e].find_element(By.XPATH, ".//h2").text}]
            except NoSuchElementException:
                pass
        return out

    def search(self, query):
        _id = uuid.uuid4()
        self.queue.append(_id)
        async def help(self):
            while 1:
                if _id == self.queue[0]:
                    return await self._search(query)
                await asyncio.sleep(0.5)
        res = help(self)
        self.queue.pop()
        return res

a = Searcher()
print(asyncio.run(a.search("test")))

Вот в чем ошибка:

Traceback (most recent call last):
  File "/home/felix/project/search.py", line 49, in <module>
    print(asyncio.run(a.search("test")))
  File "/home/felix/project/search.py", line 38, in search
    self.queue.append(_id)
AttributeError: 'Searcher' object has no attribute 'queue'
attributeerror class init python
2021-11-24 06:01:11
1

Лучший ответ

0

Как восхитительно... Я назвал __init__ функцию __init___.

Я исправил другие ошибки, переработал их, и вот рабочий код

import asyncio
import uuid
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.common.exceptions import NoSuchElementException


class Searcher:
    def __init__(self):
        self.driver = webdriver.Firefox(executable_path="/home/felix/amcoin/geckodriver")
        self.wait = WebDriverWait(self.driver, 10)
        self.driver.get("https://amazon.com/")
        self.queue = []

    async def _search(self, query):
        self.driver.find_element(By.ID, "twotabsearchtextbox").send_keys(query + Keys.RETURN)
        self.wait.until(presence_of_element_located((By.XPATH,
                "//div[contains(@class, 'sg-col-inner')]/div[contains(@class, 'a-section')]"
                "/div[contains(@class, 'a-section')]")))
        el = self.driver.find_elements(By.XPATH,
                "//div[contains(@class, 'a-section')]/div[h2][not(contains(.,'Sponsored'))]"
                "[contains(@class, 'a-section')]/..")
        out=[]
        for e in range(len(el)):
            try:
                out+=[{"price": el[e].find_element(By.XPATH, ".//span[contains(@class, 'a-price-whole')]").text + "." +
                el[e].find_element(By.XPATH, ".//span[contains(@class, 'a-price-fraction')]").text,
                "title": el[e].find_element(By.XPATH, ".//h2").text}]
            except NoSuchElementException:
                pass
        return out

    async def search(self, query):
        _id = uuid.uuid4()
        self.queue.append(_id)
        while 1:
            if _id == self.queue[0]:
                res = await self._search(query)
                self.queue.pop()
                return res
            await asyncio.sleep(0.5)

a = Searcher()
print(asyncio.run(a.search("test")))
2021-11-24 06:21:16

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................