[PYTHON] Obtenez des signets Twitter sur CentOS en utilisant Selenium

Puisque Twitter ne fournit pas d'API autour des signets, j'ai essayé d'obtenir tous les signets en utilisant Selenium.

environnement


CentOS Linux release 7.7.1908
Python 3.6.8

Préparation

Installez ce dont vous avez besoin

google-chrome Installez en vous référant à cet article. ChromeDriver Faites attention à la version à installer. Si vous le mettez négligemment, cela ne fonctionnera pas correctement. Consultez le site ChromeDriver et pip install avec la version spécifiée.

Exemple


# google-chrome --version
Google Chrome 78.0.3904.108

# pip install chromedriver-binary==78.0.3904.105
# pip show chromedriver-binary
Name: chromedriver-binary
Version: 78.0.3904.105.0

# chromedriver-path
/usr/lib/python3.6/site-packages/chromedriver_binary (Nécessaire plus tard)

Selenium

# pip install selenium

Contrôle de fonctionnement

J'ai ajouté beaucoup d'options, mais --headless et --no-sandbox peuvent suffire. Dans mon environnement, j'ai une exception sans --headless. executable_path spécifie le résultat du chromedriver-path ci-dessus. J'ai enregistré une capture d'écran pour confirmation.

test.py


import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-infobars')
options.add_argument('--disable-extensions')
options.add_argument('--disable-gpu')
options.add_argument('--headless')

driver = webdriver.Chrome(chrome_options=options, executable_path='/usr/lib/python3.6/site-packages/chromedriver_binary/chromedriver')

driver.get('https://www.google.com/')
time.sleep(3.0)
driver.save_screenshot('screenshot.png')

driver.close()
driver.quit()

acquisition de signets

Processus de connexion

option.add_argument('--user-data-dir='+os.path.abspath('profile'))

Si vous spécifiez le profil à utiliser avec l'option ci-dessus, le cookie y est enregistré, vous n'avez donc pas à vous connecter à chaque fois que le programme est exécuté. Dans cet état, exécutez la connexion Twitter une seule fois dans cet article. Même si vous pensez que vous vous êtes connecté avec succès, cela peut s'arrêter à la page de confirmation de votre adresse e-mail, donc je pense que c'est une bonne idée d'utiliser le mode interactif pour vérifier l'écran et l'URL.

Processus d'acquisition

Les éléments du Tweet sont ajoutés / supprimés de manière dynamique en fonction du défilement dans la chronologie et les signets Twitter. Dans le programme suivant Récupérez l'url du tweet chargé → Faites défiler de sorte que le tweet du bas soit en haut de la page → Attendez que la page charge le tweet L'URL de tous les tweets est obtenue en répétant.

def get_list():
    driver.get('https://twitter.com/i/bookmarks')
    time.sleep(10.0)

    status_urls = []
    container_xpath = '//*[@id="react-root"]/div/div/div/main/div/div/div/div[1]/div/div[2]/section/div/div/div'
    container = driver.find_element_by_xpath(container_xpath) #Élément vertical contenant plusieurs tweets
    end_count = 0
    while True:
        divs = container.find_elements_by_xpath('./div')
        for div in divs:
            if len(div.find_elements_by_tag_name('img')) == 0:
                end_count += 1
                break
            status_url = div.find_element_by_xpath('./div/article/div/div[2]/div[2]/div[1]/div[1]/a').get_attribute('href')
            status_urls.append(status_url)
        if end_count > 8:
            break
        driver.execute_script('arguments[0].scrollIntoView();', divs[-1])  # must check length
        print(len(status_urls))
        time.sleep(15.0)

    return list(set(status_urls))  #Comme la duplication se produit dans la méthode d'acquisition, elle est rendue unique en la définissant une fois.

Lorsque vous revenez à la limite du signet, le tweet n'est pas stocké dans l'élément du bas, vous pouvez donc juger si vous avez défilé jusqu'à la fin par div.find_elements_by_tag_name ('img'). Peu importe le temps que cela prend, je veux donc tous les obtenir, c'est donc un code redondant en dormant et en spécifiant le nombre de fois.

Résumé

Si vous trouvez quelque chose qui ne va pas, veuillez commenter.

Le site que j'ai utilisé comme référence

Jusqu'à l'exécution de Selenium + Python sur CentOS7-Qiita Si vous souhaitez garder le site connecté lors de la prochaine exécution sur Selenium Bot pour répondre depuis la connexion Twitter avec Python Selenium --Qiita

Recommended Posts

Obtenez des signets Twitter sur CentOS en utilisant Selenium
Recevez uniquement des tweets d'images sur Twitter
Installer Python sur CentOS à l'aide de Pyenv
Obtenez des données de Twitter avec Tweepy
Installez Python sur CentOS en utilisant pyenv
Obtenez des informations sur les retards sur Twitter et tweet
Programme pour obtenir les images préférées de Twitter
Obtenez des images d'utilisateurs spécifiques sur Twitter
twitter avec python3
Essayez d'utiliser Selenium
Obtenir les données utilisateur Twitter
Paramètres initiaux pour l'utilisation de Python3.8 et pip sur CentOS8
Suivi automatique sur Twitter avec python et sélénium! (RPA)
Solution si heroku plante lors de l'utilisation de sélénium
Publiez sur votre compte en utilisant l'API sur Twitter
Obtenez et automatisez le contrôle ASP Datepicker à l'aide de Python et Selenium
Installez Faiss sur CentOS 7
Nombre de personnages sur Twitter
Installez numba sur CentOS 7.2
Démarrez CentOS 8 à l'aide de VirtualBox
Installez mecab-python sur CentOS
Installez Python 2.7.3 sur CentOS 5.4
Rechercher sur Twitter avec Python
Installation sur la boîte virtuelle CentOS8
Installez awscli sur centos7
Installer Chainer sur CentOS 6.7
Remarques sur l'utilisation d'Alembic
Configuration du couple sur CentOS 6
Obtenez uniquement la version Python (telle que 2.7.5) sur le shell CentOS 7
Obtenez une traduction en anglais à l'aide de python google translation selenium (Remarque)