Рубрики
кодирование

Можно ли автоматически проверять статус Instagram F4F (follow)?

привет.

Я также пробую разные вещи, впервые изучая ползание.

На этот раз я хотел бы применить его к Instagram, одной из самых популярных социальных сетей в последнее время.

Чтобы сделать это интересным, я пытаюсь сделать следующее, используя немного человеческой психологии.

как насчет этого? ты не хочешь попробовать 🙂

Иногда люди перестают следить за мной. ТТ

Теперь давайте сделаем это шаг за шагом.

Импортируйте необходимые модули

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup

Модуль webdriver пакета selenium запускает веб-браузер и позволяет выполнять действия в соответствии с командами скрипта, а модуль BeautifulSoup в пакете bs4 имеет функцию, позволяющую легко извлекать желаемое содержимое из данных HTML DOM.

Если пакеты selenium и bs4 не существуют, установите их, введя следующее в командном окне.

pip install bs4
pip install selenium

А веб-драйвер Chrome можно скачать по ссылке ниже.

https://sites.google.com/a/chromium.org/chromedriver/downloads

Остальные модули являются базовыми, так что вы можете сразу их импортировать и использовать.

войти в инстаграм

Теперь откройте браузер Chrome и попробуйте войти, указав адрес Instagram.

Давайте возьмем ввод прямо из командного окна.

Например, предположим, что вы вводите следующее в командное окно.

python crawling_instagram.py sangminem 123456

где sys.argv[0] становится crawling_instagram.py , sys.argv[1] становится sangminem , а sys.argv[2] становится 123456 .

Давайте воспользуемся этим, чтобы написать код для входа в Instagram, как показано ниже.

browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+sys.argv[1])
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()

Я открыл веб-браузер Chrome с помощью chromedriver и подключился, объединив адрес Instagram и имя пользователя.

Я нажал кнопку подписчика, используя browser.execute_script, чтобы открыть окно входа в систему.

(Если щелкнуть, когда вы не вошли в систему, отобразится окно входа в систему.)

После этого ставлю 2 секунды ожидания на случай, если загрузка будет дольше.

Затем тип ввода находит части имени пользователя и пароля, а метод send_keys используется для ввода имени пользователя и пароля.

И я нашел кнопку входа в форму с xpath и вызвал метод отправки.

Вы можете получить xpath, щелкнув правой кнопкой мыши элемент, который хотите найти, на вкладке «Элементы» разработчика, которая появляется при нажатии F12 в Chrome, и выбрав «Копировать» > «Копировать xpath».

Подождите 5 секунд до следующего входа в систему.

Это код, который я написал, чтобы позже снова нажать кнопку Do, используя xpath.

Поскольку эту часть следует просто пропустить, подробное объяснение будет опущено.

Получить список подписчиков

Теперь, когда вход завершен, давайте реализуем логику для получения количества подписчиков.

time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))

Подождав 2 секунды еще раз, чтобы предотвратить сбой, я снова щелкнул кнопку следящего устройства.

И это та часть, которая ждет 1 секунду и всерьез получает имя пользователя подписчика.

Поскольку нам нужно сначала получить всех подписчиков, мы реализовали логику многократного опускания прокрутки, чтобы загрузить всех через оператор while.

Если старая высота прокрутки и новая высота прокрутки отличаются, это означает, что нужно загрузить больше, поэтому этот синтаксис повторяется до тех пор, пока старая высота прокрутки и новая высота прокрутки не станут одинаковыми.

Имя класса, которое является значением аргумента метода querySelectorAll, представляет собой значения, непосредственно просматриваемые и импортируемые со вкладки «Элементы режима разработчика».

После загрузки импортируйте html-данные через модуль BeautifulSoup, проверьте теги и классы с именами пользователей, извлеките их все и поместите в массив.

Я получил длину массива методом печати и напечатал количество подписчиков на экране.

Получите следующий список

Далее, давайте получим количество подписчиков.

browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))

Нажмите кнопку закрытия, используя xpath, чтобы закрыть окно подписчика.

Затем я подождал полсекунды и нажал следующую кнопку.

А затем я снова подождал 1 секунду и получил имя пользователя, за которым я следил.

Шаблон для получения имени пользователя для подписчика почти аналогичен, поэтому я не буду вдаваться в это снова.

Получите только тех, на кого вы подписаны

Наконец, давайте сравним список имен подписчиков со списком имен пользователей, чтобы найти тех, кто не является подписчиком.

result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

Основываясь на следующем имени пользователя, мы проверяли список всех имен пользователей-последователей одно за другим, подсчитывали, есть ли они, и неоднократно выполняли логику для выхода.

Если подсчет равен 0, это означает, что я подписан, но не в списке подписчиков, поэтому я не сделал F4F и добавил его в массив результатов.

Наконец, вывод результирующего массива достигает желаемой цели.

Именно так.

Я следил, а ты нет? ㅠ

Для справки, я слежу только за своими знакомыми, поэтому не так много людей, которые не подписаны на меня.

Он просто служил своей цели.

Полный доступ к исходному коду

Если кто хочет, поделитесь.

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup
username = sys.argv[1]
browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+username)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()
time.sleep(5)
if len(sys.argv) > 3:
    username = sys.argv[3]
print('Account: ' + username)
browser.get('https://www.instagram.com/'+username)
time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('.jSC57')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('.jSC57')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))
browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))
result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

Увидимся в следующий раз с другой темой. 🙂

(Внимание) Название класса может время от времени меняться, поэтому, если программа не работает, возможно, вам придется самостоятельно разобраться со структурой тега Instagram, чтобы исправить это.

Добавить комментарий

Ваш адрес email не будет опубликован.

ru_RUРусский