Очистка всех комментариев под постом в Instagram - PullRequest
0 голосов
/ 20 января 2020

мои предыдущие вопросы были закрыты, но предлагаемый ответ мне не помогает. У комментариев в Instagram очень специфичное c поведение! Я знаю, как программно прокрутить сайт вниз, но с комментариями в Instagram это немного по-другому! Я был бы признателен, если бы мой вопрос не был закрыт сразу, потому что это действительно не помогает. Woule ba благодарен за помощь и не закрывает меня! Спасибо.

Вот и снова: я пытаюсь создать скребок, сохраняющий комментарии под постом в Instagram. Мне удается войти в инстаграм через мой код, чтобы я мог получить доступ ко всем комментариям в сообщении, но я, кажется, не могу прокрутить достаточно много раз, чтобы просмотреть все комментарии, чтобы очистить их все. Я получаю только около 20 комментариев каждый раз.

Может кто-нибудь помочь мне? Я использую селеновый вебдрайвер.

Спасибо за вашу помощь заранее! Будет здорово.

Это моя функция сохранения комментариев:

import time
from selenium.webdriver.firefox.options import Options
from selenium.webdriver import Firefox
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

class Instagram_comments():
    def __init__(self):
        self.firefox_options = Options()
        self.browser = Firefox(options=self.firefox_options)

    def get_comments(self, url):
        self.browser.get(url)
        time.sleep(3)


        while True:
        try:
            self.load_more_comments = self.browser.find_element_by_class_name(
                    'glyphsSpriteCircle_add__outline__24__grey_9')
            self.action = ActionChains(self.browser)
            self.action.move_to_element(self.load_more_comments)
            self.load_more_comments.click()
            time.sleep(4)
            self.body_elem = self.browser.find_element_by_class_name('Mr508')
            for _ in range(100):
                self.body_elem.send_keys(Keys.END)
                time.sleep(3)
        except Exception as e:
            pass

        time.sleep(5)
        self.comment = self.browser.find_elements_by_class_name('gElp9 ')
        for c in self.comment:
            self.container = c.find_element_by_class_name('C4VMK')
            self.name = self.container.find_element_by_class_name('_6lAjh').text
            self.content = self.container.find_element_by_tag_name('span').text
            self.content = self.content.replace('\n', ' ').strip().rstrip()
            self.time_of_post = self.browser.find_element_by_xpath('//a/time').get_attribute("datetime")
            self.comment_details = {'profile name': self.name, 'comment': self.content, 'time': self.time_of_post}
            print(self.comment_details)
            time.sleep(5)

    return self.comment_details

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Этот чанк работал для меня несколько раз:

def scroll():

SCROLL_PAUSE_TIME = 1

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)
    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
        print('page height:', new_height)
    last_height = new_height
scroll()

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

Вот как мой код выглядел для твиттера:

account_names = []
account_tags = []
account_link = []

def scroll():

SCROLL_PAUSE_TIME = 1
global account_name

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # Wait to load page     
    time.sleep(SCROLL_PAUSE_TIME)       
    account_name = driver.find_elements_by_xpath('//*[@id="react-root"]/div/div/div/main/div/div/div/div/div/div[2]/div/div/section/div/div/div/div/div/div/div/div[2]/div[1]/div[1]/a/div/div[1]/div[1]/span/span')
    for act_name in account_name:
        global acctname
        acctname = act_name.text
        account_names.append(acctname)

    account_handle = driver.find_elements_by_xpath('//*[@id="react-root"]/div/div/div/main/div/div/div/div/div/div[2]/div/div/section/div/div/div/div/div/div/div/div[2]/div[1]/div[1]/a/div/div[2]/div/span')
    for act_handle in account_handle:
        global account_tags
        acct_handles = act_handle.text
        account_tags.append(acct_handles)

    soup = BeautifulSoup(driver.page_source, 'lxml')
    account_links = soup.find_all('a', href=True, class_='css-4rbku5 css-18t94o4 css-1dbjc4n r-1loqt21 r-1wbh5a2 r-dnmrzs r-1ny4l3l')
    for acct_links in account_links:
        global act_link
        act_link = acct_links['href']
        account_link.append(act_link)


    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

scroll()

Просто примечание: как прокомментировал другой пользователь, Instagram очень трудно очистить из-за динамического c html переменные, так что было бы правильно сказать, что никто, включая меня, слишком заинтересован в написании этого для Instagram.

0 голосов
/ 18 февраля 2020

Первая функция возвращает True, если элемент найден

Вторая функция используется для прокрутки вниз до последнего комментария, а затем BeautifulSoup используется для очистки всех комментариев

def check_exists_by_xpath(self,xpath):
    try:
        self.driver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True

def get_comments():
        while self.check_exists_by_xpath("//div/ul/li/div/button"):
            load_more_comments_element = self.driver.find_element_by_xpath("//div/ul/li/div/button")
            load_more_comments_element.click()
            sleep(1)

        sleep(2)
        soup = BeautifulSoup(self.driver.page_source,'lxml')
        comms = soup.find_all('div',attrs={'class':'C4VMK'})
        print(len(comms))
        soup_2 = BeautifulSoup(str(comms),'lxml')                            
        spans = soup_2.find_all('span')
        comments = [i.text.strip() for i in spans if i != '']
        print(comments)

Надеюсь, это поможет - знайте, я тоже все еще учусь.

...