Повторяющиеся снимки экрана при использовании ActionChains для навигации между элементами - PullRequest
0 голосов
/ 14 июня 2019

В настоящее время я работаю над простым скребком страниц с использованием Selenium. Она прокручивает страницу определенное количество раз, чтобы загрузить ее, а затем перемещается по каждому сообщению, чтобы проанализировать там информацию.

Я пытаюсь сделать скриншот каждого поста.

Я использую ActionChain, чтобы перейти к элементу, сделать паузу, а затем сделать скриншот всего окна браузера.

Насколько я понимаю, move_to_element должен перемещать курсор в центр элемента.

По какой-то причине моя программа делает два скриншота одного и того же поста, а затем пропускает каждый второй пост, поскольку функция скриншотов является частью цикла, проходящего через посты. В зависимости от элемента, который находится в фокусе, иногда случайно включается следующий пост, но иногда он вообще не отображается в окне браузера.

Мой вывод csv содержит все сообщения, включая те, которые не включены в скриншоты, поэтому я знаю, что они не просто пропускаются полностью.

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

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

    def collect_posts(self, page):
        self.load_page()  # scrolls to the bottom of the page

        post_num = 0

        with open("test.csv", "a+", newline='', encoding="utf-8") as save_file:
            writer = csv.writer(save_file)
            posts = self.browser.find_elements_by_class_name(
                "userContentWrapper")

            for post in posts:
                post_num += 1
                self.get_screenshot(post, post_num)
                analysis = self.parse_post(post, page_name)

                # Write row to csv
                writer.writerow(analysis)

    def get_screenshot(self, post, post_num):
        # Set up action chain for moving to elements to take screenshots
        action = ActionChains(self.browser).move_to_element(post)
        action = action.pause(self.delay).perform()

        filename = self.dump[:-4]  # name the subdirectory after the filename
        os.makedirs(f"Screenshots\\{filename}", exist_ok=True)

        # Take a screenshot
        screenshot = self.browser.save_screenshot(
            f'{self.path}\\Screenshots\\{filename}\\test-{post_num}.png')
        if not screenshot:
            print("Something is wrong, could not save screenshot")

Подкаталог успешно создан, и в конце программы существует такое же количество снимков экрана, что и общее количество собранных сообщений. Однако каждый пост с четным номером является дубликатом предыдущего поста, и в файле CSV нет скриншота поста с таким номером.

Большое спасибо за любую помощь или предложения, которые вы можете мне дать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...