Selenium -Twitter, Tweet Çekememe

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?

Merhaba,

Hocam hatanızdan yola çıkarak söylüyorum. Aldığınız bu hatayı sizin anlamsız dediğiniz kısım yapıyor. Yani siz driver’ı kapatıyorsunuz ve döngüyü kırmıyosunuz. Kırmadığınız için driver.find_elemts_by_css olarak devam eden fonksiyonunuz sizin istediğiniz css selectoru arayacak bir browser veya tab bulamıyor çünkü siz driver.close() diyerek kapatmışsınız.

Çözüm olarak çalıştırdığınız driver.close() fonksiyonu ile driverı kapattıktan sonra o for döngüsünü break edebilirsiniz. Eğer browserı kapatmak gibi bir amacınız yok ise if i == 10 yerine tweetin atıldığı tarihi alarak son 1 saat içerisinde mi kontrol edebilirsiniz. Bu kontrol ardından eğer şart sağlanıyor driver.close() ve break yapabilirsiniz.

Kolay gelsin