Python - Selenium - WebDriverWait kullanarak html'de metin içeren webscrape tablosu
Aşağıdaki web sitesinin 500 veya daha fazla çalışanıyla tüm Şirket Adlarını web'de görüntülemeye çalışıyorum:
https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1
İlk sitenin Şirket Adlarını kazımak için bir kod yazdım ve komut dosyası "Sonraki Site Düğmesi" ni tıklayacak ve adları yeniden kazıyacak. İsimler bir listeye kaydedilecek ve bu, listede belirli sayıda isim bulunana kadar gerçekleşecektir. Ardından listeyi bir veri çerçevesine aktaracak ve bir xsl dosyasına aktaracaktır. Maalesef şu anda bunu yapmıyor. İşte Kod
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import pandas as pd
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
company_list = []
driver = webdriver.Chrome('/Users/rieder/Anaconda3/chromedriver_win32/chromedriver.exe')
driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1')
driver.find_element_by_id("cookiesNotificationConfirm").click();
while len(company_list) < 20:
company_name = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='zebraTable zebraTable--companies']//following::tr[2]/td[@class='zebraTable__td zebraTable__td--companyName']/a"))).get_attribute("innerHTML")
for p in range(len(company_name)):
company_list.append(company_name)
driver.find_element_by_xpath("//*[@id='content']/section[3]/div/div/form/div/div[2]/div[2]/div[2]/div/button[2]").click();
print(company_list)
df = pd.DataFrame(company_list,columns =['Unternehmensname'])
df.to_excel("output.xlsx")
time.sleep(5)
Ve Çıktım şöyle görünüyor:
['\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ']
Sanırım bunun nedeni .get_attribute () yalnızca bir öznitelik alıyor, ancak bu noktada tüm öznitelikleri nasıl elde edeceğimi bilmiyorum.
inb4 Teşekkürler
Yanıtlar
Evet kullanarak bir .get_attribute()seferde yalnızca bir özellik elde edebilirsiniz. Tüm öznitelikleri almak için aşağıdaki javascript kodunu yapabilirsiniz:
driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', ele)
İşte ele, web elementiniz.
Tüm şirket adını yazdırmak için aşağıdaki yaklaşımı kullanabilirsiniz:
company_names = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//td[@class='zebraTable__td zebraTable__td--companyName']")))
for cn in company_names:
print(cn.text)
Not: Tüm şirket isimlerini ilk sayfaya yazdıracaktır. Tüm sayfadan isim almak istiyorsanız, her sayfada bir sonraki sayfa simgesine tıklamanız ve bir döngüde yukarıdaki koda tıklamanız gerekir.
find_elements_by_css_selectorBirden fazla web öğesini bulmak için yöntemi kullanabilirsiniz (gösterilen tüm şirket adları.
Her şeyi yazmayacağım, ancak while döngüsünün başlangıcı şöyle görünmeli:
companies = driver.find_elements_by_css_selector(".zebraTable__td--companyName")
Daha sonra companieslisteden geçmeli ve her liste üyesi için öznitelikler almalısınız.
İlk 100 şirket adıyla bir excel listesi oluşturan aşağıdaki kodla çalıştı:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import pandas as pd
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
company_list = []
driver = webdriver.Chrome('/Users/rieder/Anaconda3/chromedriver_win32/chromedriver.exe')
driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1')
driver.find_element_by_id("cookiesNotificationConfirm").click();
while len(company_list) < 100:
company_names = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//td[@class='zebraTable__td zebraTable__td--companyName']")))
for cn in company_names:
company_list.append(cn.text)
driver.find_element_by_xpath("//*[@id='content']/section[3]/div/div/form/div/div[2]/div[2]/div[2]/div/button[2]").click();
df = pd.DataFrame(company_list, columns =['Unternehmensname'])
df.to_excel("output.xlsx")
time.sleep(5)
çok teşekkürler beyler