Pypetteer и Asyncio: очистить страницу, выполнить действие, очистить новую страницу - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь написать инструмент для очистки веб-страниц для определенного URL-адреса, используя pypetteer и asyncio (имейте в виду, что я использую обе библиотеки впервые, поэтому я мог пропустить что-то действительно тривиальное). Я пробовал использовать только запросы, но веб-сайт меняет свои таблицы исключительно на JavaScript, без какого-либо влияния на URL-адрес.

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

from math import ceil
import numpy as np
import asyncio
import pandas as pd
import pickle as pkl
from pyppeteer import launch
from tqdm import trange

URL = "https://studiegids.uva.nl/xmlpages/page/2020-2021-en/search-course"

async def get_page(browser, url, selector):
    """Return a page after waiting for the given selector"""
    page = await browser.newPage()
    await page.goto(url)
    await page.waitForSelector(selector)
    return page


async def get_table(browser, page_count):
    """Return the table from the given page number as a pandas dataframe"""
    page = await get_page(browser, URL, "table")
    tables = list()
    for _ in trange(page_count):
        current_html = await page.querySelectorEval(
                "table", "(element) => element.outerHTML")
        current_tables = pd.read_html(current_html)
        tables.append(current_tables)
        linkHandlers = await page.xpath("//a[contains(text(), 'next')]")
        await linkHandlers[-1].click()
    # await page.screenshot({'path': 'a.png', 'fullPage': True})
    return tables


async def get_results():
    browser = await launch(args=["--no-sandbox", "--disable-dev-shm-usage"])
    page_num = 10  # For testing
    return await get_table(browser, page_num)


page_tables = asyncio.get_event_loop().run_until_complete(get_results())

Я ожидал, что это даст мне таблицы на первых 10 страницах. Однако я получаю 10 копий таблицы на начальной странице. Когда я выполняю те же шаги для l oop ниже вручную (без l oop),

for _ in trange(page_count):
    current_html = await page.querySelectorEval(
            "table", "(element) => element.outerHTML")
    current_tables = pd.read_html(current_html)
    tables.append(current_tables)
    linkHandlers = await page.xpath("//a[contains(text(), 'next')]")
    await linkHandlers[-1].click()

, я могу получать разные страницы, что я подтвердил со скриншотами. Кто-нибудь может увидеть, где что-то не так?

Заранее спасибо!

Edit:

Добавлен URL-адрес в код.

Edit2:

Рабочий код выглядит следующим образом (он работает в интерактивном сеансе i python, выполняется построчно):

browser = await launch(args=["--no-sandbox", "--disable-dev-shm-usage"])
page = await get_page(browser, URL, "table") # a function I created, can be seen above

current_html1 = await page.querySelectorEval("table","(element) => element.outerHTML")
current_tables1 = pd.read_html(current_html)

linkHandlers = await page.xpath("//a[contains(text(), 'next')]")
await linkHandlers[-1].click()

current_html2 = await page.querySelectorEval("table","(element) => element.outerHTML")
current_tables2 = pd.read_html(current_html)

linkHandlers = await page.xpath("//a[contains(text(), 'next')]")
await linkHandlers[-1].click()

current_html3 = await page.querySelectorEval("table","(element) => element.outerHTML")
current_tables3 = pd.read_html(current_html)

Результирующий список таблиц отличается, каждая дает мне разные таблицы страниц.

...