Qui è il codice che sto usando per la ricerca di amazon dal mio tornado web app. Al momento ho solo una di queste classi (e uno webdriver) creata un'istanza. Mi potrebbe essere utile un pool di loro in futuro (sì lo so che c'è selenum griglia, ma non è la mia domanda). La mia domanda è, perché è l' __init__ a quanto pare non è in esecuzione? Perché c'è un attributeError per l'accesso alle auto.coda di var che è chiaramente definito in __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")))
È qui l'errore:
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'