Python 巨蟒硒。并行中频环路
Python 巨蟒硒。并行中频环路,python,python-3.x,selenium,loops,web-scraping,Python,Python 3.x,Selenium,Loops,Web Scraping,is_cust循环不断重复运行,打开同一个元素,而代码的其余部分继续移动到下一个div。这里出了什么问题?xPath是而且可能是原因 使用cssSelector尝试此代码: import csv import time from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys from selenium import webdriver from cs
is_cust
循环不断重复运行,打开同一个元素,而代码的其余部分继续移动到下一个div
。这里出了什么问题?xPath是而且可能是原因
使用cssSelector尝试此代码:
import csv
import time
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from csv import reader
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException
chrome_options = Options()
scroll = 5
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
header_added = False
header_added1 = False
url = "url"
driver = webdriver.Chrome(executable_path='C:/chromedriver.exe', options=chrome_options)
driver.maximize_window()
driver.get(url)
time.sleep(3)
search_city = input("Enter the city :")
res_n = input("Enter the Restaurant's name :")
search = driver.find_element_by_xpath('//input[@name="location"]').send_keys(search_city)
time.sleep(2)
driver.find_element_by_xpath('//*[@id="root"]/div[1]/div[1]/div/div[1]/div[1]/div/div[2]/div/div[3]/div[1]/span[2]').click()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[1]/div[1]/header/div/div/ul/li[5]/div/a/span[1]').click()
time.sleep(1)
search_res = driver.find_element_by_class_name('_2BJMh').send_keys(res_n.lower())
time.sleep(5)
driver.find_element_by_class_name('_2BJMh').send_keys(Keys.RETURN)
time.sleep(5)
try:
driver.find_element_by_class_name('_3FR5S').click()
time.sleep(5)
except:
print("restaurant not open")
driver.quit()
html = driver.find_element_by_tag_name('html')
def get_items():
global header_added
global item_dvs
cats = driver.find_elements_by_class_name('D_TFT')
cats[1].click()
time.sleep(3)
item_dvs = driver.find_elements_by_class_name('_2wg_t')
for div in item_dvs:
name = div.find_element_by_class_name('styles_itemNameText__3bcKX')
print(name.text)
price = div.find_element_by_class_name('rupee')
print(price.text)
if div.find_elements_by_class_name('styles_itemDesc__MTsVd'):
desc = div.find_element_by_class_name('styles_itemDesc__MTsVd').text
else:
desc = None
if div.find_element_by_css_selector('div._1C1Fl._23qjy'):
element = div.find_element_by_css_selector('div._1C1Fl._23qjy')
print("found")
driver.execute_script("arguments[0].scrollIntoView();", element)
add = div.find_element_by_css_selector('._1RPOp')
driver.execute_script("arguments[0].click();", add)
time.sleep(1)
add_ons = driver.find_element_by_class_name('_3UzO2').text
print(add_ons)
driver.find_element_by_css_selector('#modal-placeholder > div:nth-child(3) > div > div._1Kr-y._3EeZR > div > div._1EZLh > div > button').click()
else:
add_ons = None
dict1 = {'Item Name': name.text, "Price": price.text, "Add Ons :": add_ons, "Description": desc}
with open(f'{search_city}_{res_n}.csv', 'a+', encoding='utf-8-sig') as f:
w = csv.DictWriter(f, dict1.keys())
if not header_added:
w.writeheader()
header_added = True
w.writerow(dict1)
get_items()
更新
从更新的代码来看,您使用了大量硬编码睡眠。我建议将WebDriverWait
与预期条件一起使用
更多信息请点击此处:
所需进口:
for div in item_dvs:
#Do Something
try:
is_cust = div.find_element_by_css_selector('._1C1Fl._23qjy')
print("found")
except NoSuchElementException:
continue
driver.execute_script("arguments[0].scrollIntoView();", is_cust)
add = div.find_element_by_css_selector('._1RPOp')
driver.execute_script("arguments[0].click();", add)
time.sleep(1)
# Not sure why for this one you had driver instead of div. Suspect div should be
add_ons = div.find_element_by_class_name('_26cJ9').text
div.find_element_by_css_selector('#modal-placeholder > div:nth-child(3) > div > div._1Kr-y._3EeZR > div > div._1EZLh > div > button').click()
创建驱动程序后要添加的代码:
等待时间=5
wait=WebDriverWait(驱动程序,等待时间)
不要像这样使用睡眠:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
使用:
不要收集元素两次。。使用*
查找元素,然后验证长度:
wait.until(EC.presence_of_element_located((By.CLASS_NAME, '_2BJMh'))).send_keys(res_n.lower())
我从不使用xPath,但它们是双向的。。。这可能是这里的原因。如果您使用的是cssSelector,那么您的
div.find\u element\u by\u css\u选择器
将仅检索父div的子级。如果/else语句错误,您的。您的is_cust
将返回元素或引发异常。这是不可能的,怎么会呢?解决方案是什么?您使用父元素来查找嵌套元素(div.find…),但从我所读到的内容来看,xPath并不太关心它。我提供了答案,但如果没有html代码,就很难给您提供准确的解释/解决方案。注意到的一点是,您正在混合(驱动程序和div)来搜索元素。为什么?您会看到单击。这是一个不同的窗口。这就是为什么驱动程序。此外,我还尝试了css
。同样的结果。我将重新运行它,只是为了确保它能正常工作!。。唉,只有少数几位演员。看来你已经找到问题的症结所在了。不知道为什么剩下的部分都没用了。让我检查一下。很好。。快到了!当它不起作用时,你能提供更多信息吗。如果打开一个新窗口/弹出窗口,您可能需要引入WebDriverWait
,以允许在DOM中加载元素。您是否能够共享html/站点。如果是这样的话,请提供如何检索item\u dvs
No,就像您提到的那样。当它找不到元素时,不会转到其他元素。抛出一个错误。
wait.until(EC.presence_of_element_located((By.CLASS_NAME, '_2BJMh'))).send_keys(res_n.lower())
descs = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'styles_itemDesc__MTsVd')))
if len(descs) > 0:
desc = descs[0].text
else:
desc = None