Как смоделировать нажатие кнопки в запросе? - PullRequest
0 голосов
/ 22 февраля 2020

Пожалуйста, не закрывайте этот вопрос - это не дубликат. Мне нужно нажать кнопку, используя Python запросов, а не Selenium, так как здесь

Я пытаюсь очистить Reverso Context примеры перевода страницы . И у меня есть проблема: я могу получить только 20 примеров, а затем мне нужно нажать кнопку «Показать больше примеров» много раз, пока она существует на странице , чтобы получить полный список результатов. Это можно сделать просто с помощью веб-браузера, но как я могу это сделать с помощью Python библиотеки запросов?

Я посмотрел на код кнопки HTML, но не смог найти атрибут onclick посмотреть на прилагаемый к нему скрипт JS, и я не понимаю, какой запрос мне нужно отправить:

<button id="load-more-examples" class="button load-more " data-default-size="14px">Display more examples</button>

А вот мой Python код:

from bs4 import BeautifulSoup
import requests
import re


with requests.Session() as session:  # Create a Session
    # Log in
    login_url = 'https://account.reverso.net/login/context.reverso.net/it?utm_source=contextweb&utm_medium=usertopmenu&utm_campaign=login'
    session.post(login_url, "Email=reverso.scraping@yahoo.com&Password=sample",
           headers={"User-Agent": "Mozilla/5.0", "content-type": "application/x-www-form-urlencoded"})

    # Get the HTML
    html_text = session.get("https://context.reverso.net/translation/russian-english/cat", headers={"User-Agent": "Mozilla/5.0"}).content

    # And scrape it
    for word_pair in BeautifulSoup(html_text).find_all("div", id=re.compile("^OPENSUBTITLES")):
        print(word_pair.find("div", class_="src ltr").text.strip(), "=", word_pair.find("div", class_="trg ltr").text.strip())

Примечание: вам необходимо войти в систему , в противном случае он покажет только первые 10 примеров и не покажет кнопку. Вы можете использовать эти настоящие данные аутентификации:
E-mail: reverso. scraping@yahoo.com
Пароль: образец

1 Ответ

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

Вот решение, которое получает все примеры предложений, используя requests, и удаляет все теги HTML из них, используя BeautifulSoup:

from bs4 import BeautifulSoup
import requests
import json


headers = {
    "Connection": "keep-alive",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "X-Requested-With": "XMLHttpRequest",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
    "Content-Type": "application/json; charset=UTF-8",
    "Content-Length": "96",
    "Origin": "https://context.reverso.net",
    "Sec-Fetch-Site": "same-origin",
    "Sec-Fetch-Mode": "cors",
    "Referer": "https://context.reverso.net/^%^D0^%^BF^%^D0^%^B5^%^D1^%^80^%^D0^%^B5^%^D0^%^B2^%^D0^%^BE^%^D0^%^B4/^%^D0^%^B0^%^D0^%^BD^%^D0^%^B3^%^D0^%^BB^%^D0^%^B8^%^D0^%^B9^%^D1^%^81^%^D0^%^BA^%^D0^%^B8^%^D0^%^B9-^%^D1^%^80^%^D1^%^83^%^D1^%^81^%^D1^%^81^%^D0^%^BA^%^D0^%^B8^%^D0^%^B9/cat",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
}

data = {
    "source_text": "cat",
    "target_text": "",
    "source_lang": "en",
    "target_lang": "ru",
    "npage": 1,
    "mode": 0
}

npages = requests.post("https://context.reverso.net/bst-query-service", headers=headers, data=json.dumps(data)).json()["npages"]
for npage in range(1, npages + 1):
    data["npage"] = npage
    page = requests.post("https://context.reverso.net/bst-query-service", headers=headers, data=json.dumps(data)).json()["list"]
    for word in page:
        print(BeautifulSoup(word["s_text"]).text, "=", BeautifulSoup(word["t_text"]).text)

Сначала я получил запрос от Google Chrome DevTools:

  1. Нажмите F12 , чтобы ввести его, и выберите вкладку Сеть
  2. Нажмите кнопку «Показать больше примеров»
  3. Найден последний запрос ("bst-query-service")
  4. Щелкните по нему правой кнопкой мыши и выберите Копировать> Копировать как cURL (cmd)

Затем я открыл этот онлайн-инструмент , вставил скопированный cURL в текстовое поле слева и скопировал вывод справа (для этого используйте горячую клавишу Ctrl- C, в противном случае может не работать).

После этого я вставил его в IDE и:

  1. Удалил диктат cookies - здесь не нужно
  2. Внимание: переписал строку data как словарь Python и обернул ее json.dumps(data), в противном случае он вернул запрос с пустым списком слов. * 10 37 *
  3. Добавлен скрипт, который: получает количество раз для извлечения слов («страниц») и создает for l oop, который получает слова такое количество раз и печатает их без HTML тегов (используя BeautifulSoup)
...