Не может ударить, как с Selenium Python Instagram бот - PullRequest
0 голосов
/ 07 февраля 2020

y'all!

Я учусь Python, изменяя чужие скрипты, мой первый мини-проект - это бот в Instagram, который комментирует и любит посты на основе хэштегов, используя Selenium webdrive для Chrome. Это сценарий Гари Ви, но мне не нравится работать (комментирование отлично работает!). Я запускаю его с Pyhton 3.8.

Сценарий:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import random
import sys
import time

class GaryVee:
    username = 'xxxxxx'
    password = 'yyyyyy'

    hashtags = [
        'zzzzzz'
    ]

    comments = [
        'tttttttt'
    ]

    links = []

    price = 0.0

    def __init__(self):
        self.browser = webdriver.Chrome()
        self.login()
        self.hustle()

    def login(self):
        self.browser.get('https://www.instagram.com/accounts/login/?source=auth_switcher')
        time.sleep(2)

        username_field = self.browser.find_element_by_xpath("//input[@name='username']")
        username_field.clear()
        username_field.send_keys(self.username)
        time.sleep(1)

        password_field = self.browser.find_element_by_xpath("//input[@name='password']")
        password_field.clear()
        password_field.send_keys(self.password)
        time.sleep(1)

        login_button = self.browser.find_element_by_xpath("//button[@type='submit']")
        login_button.click()
        time.sleep(2)

    def hustle(self):
        self.getTopPosts()
        self.execute()
        self.finalize()

    def getTopPosts(self):
        for hashtag in self.hashtags:
            self.browser.get('https://www.instagram.com/explore/tags/' + hashtag +'/')
            time.sleep(2)

            links = self.browser.find_elements_by_tag_name('a')
            condition = lambda link: '.com/p/' in link.get_attribute('href')
            valid_links = list(filter(condition, links))

            for i in range(0, 9):
                link = valid_links[i].get_attribute('href')
                if link not in self.links:
                    self.links.append(link)

    def execute(self):
        for link in self.links:
            self.browser.get(link)
            time.sleep(1)

            self.browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(1)

            self.comment()
            time.sleep(2)

            self.like()

            #self.price += 0.02
            #sleeptime = random.randint(18, 28)
            #time.sleep(sleeptime)

    def comment(self):
        comment_input = lambda: self.browser.find_element_by_tag_name('textarea')
        comment_input().click()
        comment_input().clear()

        comment = random.choice(self.comments)
        for letter in comment:
            comment_input().send_keys(letter)
            delay = random.randint(1, 7) / 30
            time.sleep(delay)

        comment_input().send_keys(Keys.RETURN)

    def like(self):
        like_button = lambda: self.browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/article/div[2]/section[1]/span[1]/button/span')
        like_button().click()

    def finalize(self):
        print('You gave $' + str(self.price) + ' back to the community.')
        self.browser.close()
        sys.exit()

garyVee = GaryVee()

Это то, что я получаю в командной строке:

DevTools listening on ws://127.0.0.1:51688/devtools/browser/c78e1107-b44d-4758-8028-06b0e9c8f809
Traceback (most recent call last):
  File "D:\Dropbox\Python\instagram-bot.py", line 104, in <module>
    garyVee = GaryVee()
  File "D:\Dropbox\Python\instagram-bot.py", line 26, in __init__
    self.hustle()
  File "D:\Dropbox\Python\instagram-bot.py", line 48, in hustle
    self.execute()
  File "D:\Dropbox\Python\instagram-bot.py", line 76, in execute
    self.like()
  File "D:\Dropbox\Python\instagram-bot.py", line 97, in like
    like_button().click()
  File "D:\Dropbox\Python\instagram-bot.py", line 96, in <lambda>
    like_button = lambda: self.browser.find_element_by_xpath('/html/body/div[3]/div[2]/div/article/div[2]/section[1]/span[1]/button/span')
  File "C:\Users\User\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\User\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\User\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\User\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[3]/div[2]/div/article/div[2]/section[1]/span[1]/button/span"}
  (Session info: chrome=80.0.3987.87)

Я думаю, я должен изменить функция find_element (или ее параметр) в подобном (self), но я не могу понять, что там есть, даже после многих примеров, которые я нашел в Интернете ...

Любая помощь будет действительно оценил!

Спасибо, Арнон

...