Yapmak İstediğim Şey: Çekmek istediğim tweetler bir tag’a ait olacak. Bu tag de son 1 saatte atılan tweetleri çekmek istiyorum. Bunlar üzerinde sentiment analizi yapacağım.
Ancak takıldığım nokta Tweetlerin dinamik olmasından kaynaklıyor. Xpath veya name veya id ile bu tweetleri çekemiyor olmam. Her tweet’in xpath, css_selector, JS_path’i farklı. İnternetten arattığımda bulduğum bazı tag_name ve css_selector kodları var ancak bunlar işe yaramıyor(aşağıdaki kodlarda göreceksiniz) ve:
selenium.common.exceptions.InvalidSessionIdException: Message: invalid session id
hatasını alıyorum.
Kodlar:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
import tweetname
path = r"C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(path)
# get the website
driver.get("https://twitter.com/i/flow/login")
sleep(5)
# username
username = driver.find_element_by_name("username")
username.send_keys(tweetname.name)
next_button = driver.find_element_by_xpath("//*[@id='layers']/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div/span/span")
next_button.click()
sleep(2)
#password
password = driver.find_element_by_name("password")
password.send_keys(tweetname.password)
click_login = driver.find_element_by_xpath("//*[@id='layers']/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div")
click_login.click()
sleep(5)
# Search on Twitter
search_bar = driver.find_element_by_xpath("//*[@id='react-root']/div/div/div[2]/main/div/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/form/div[1]/div/div/label/div[2]/div/input")
search_bar.send_keys("XXX")
search_bar.send_keys(Keys.RETURN)
sleep(5)
# Find the latest tweets
latest_bar = driver.find_element_by_xpath("//*[@id='react-root']/div/div/div[2]/main/div/div/div/div[1]/div/div[1]/div[2]/nav/div/div[2]/div/div[2]/a/div")
latest_bar.click()
sleep(2)
body = driver.find_element_by_tag_name('body')
tweets = []
for i in range(3000):
body.send_keys(Keys.PAGE_DOWN)
sleep(0.3)
if i == 10:
sleep(2)
driver.close()
elements = driver.find_elements_by_css_selector(".TweetTextSize.js-tweet-text.tweet-text")
for element in elements:
tweets.append(element.text)
print(tweets)
Ve. Bu kodlarda anlamsız bir kısım var:
if i == 10:
sleep(2)
driver.close()
Böyle bir şey yazdım çünkü: Son 1 saatte atılan tweetleri almak istiyorum. Son 1 saatte atılan tweetler tamamlanınca program kendini kapayacak. Ancak yukarıda anlattığım gibi, dinamik tweet problemi burada da var. Her paylaşan kişinin tarih bilgisi de kendine has. Hepsinin xpath’i farklı. Bunu yapamadığım için programı bu şekilde durduruyum bari dedim.
Sorunun neyi, hangi elementi çekeceğimi adam akıllı anlayamadığımdan kaynaklandığı düşünüyorum. Yardım eder misiniz lütfen?