Как заполнить текстовое поле на веб-сайте запросами python

#python #http #request #latex

#python #http #запрос #Латекс

Вопрос:

Я пытаюсь преобразовать уравнение latex в изображение на python. Я пробовал определенные конвертеры, но они не сработали. Я нашел этот веб-сайт https://latex2png.com / это преобразует строку latex для меня, но я не уверен, как заполнить текстовое поле с помощью python. Я знаю, что запросы используют http, но я не знаю, какие формы нужно заполнять. Кто-нибудь знает, как это сделать?

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

Ответ №1:

Обновить

Я понял, как это сделать, просто используя requests , что проще и быстрее:

 import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import requests


FORMULA = '\sum _ {i = 1} ^ { m } \operatorname{log} p ( x ; \theta)'

data = {
    "auth" : { "user" : "guest", "password" : "guest"},
    "latex" : FORMULA,
    "resolution" : 600,
    "color" : "000000"
}
resp = requests.post('https://latex2png.com/api/convert', json=data, allow_redirects=True, verify=False)
results = resp.json()
if results['result-code'] == 0:
    url = 'https://latex2png.com'   results['url']
    resp = requests.get(url, allow_redirects=True, verify=False)
    png = resp.content
    with open('latex.png', 'wb') as f:
        f.write(png)
    print('Image saved.')
else:
    print(results['result-message'])
  

Примечание

Без использования verfy=False я получаю следующее исключение:

 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
  

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

  1. Следующий URL-адрес содержит инструкции по загрузке SSL-сертификатов с веб-сайта с использованием различных браузеров. Вам нужно создать .pem файл. Для этого вам нужно использовать Firefox. Существуют также различные варианты. Когда вы попадете на страницу сертификата, выберите Let's Encrypt Authority X3 , а затем нажмите на PEM (chain) ссылку для скачивания. Это создаст файл latex2png-com-chain.pem в каталоге по вашему выбору.
  2. Везде, где указан источник verify=False , замените его на verify='/path-to/latex2png-com-chain.pem'

Если это доставляет много хлопот, это содержимое latex2pmg-com-chain.pem :

 -----BEGIN CERTIFICATE-----
MIIFUjCCBDqgAwIBAgISBDNrXu0HGJnfae4oRF0HS1MwMA0GCSqGSIb3DQEBCwUAMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQDExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA5MjkxNTA2MTdaFw0yMDEyMjgxNTA2MTdaMBgxFjAUBgNVBAMTDWxhdGV4MnBuZy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUqji1n3TXwlCdLtEM lhMVvyTk5DP3zM8oS3t/3AdB2qUA1bCj1hYXLzmrF1a7s8xzvyeAqTz9IPMuwfaoVNeDTLpl KfwjuD99TrrRm6lNUcjrxeN55s7t3TM4T4Oomnn7ve ldc 9BnnZsQSqvdgwZY6VjgqvB6Pimw1c8hFTq zUz1uJHIrSpE55sMJTqnfYSWzelvmzIgcSn mSZLYOlr5z3gN5x3aOgYtTx aYi4Ns3TEXNR/eqnxzOpMI9P6hZ5UGs0Vi/j6sQQc1nEhhc8ddpxLeGNF0Qj217RzgWQWHiTuc1u 7//q/WQWNrRt4R5lJ9AQoEzRO 7HadHAgMBAAGjggJiMIICXjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKaJmoHjTE93A7alZiUawAnqaAEkMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wGAYDVR0RBBEwD4INbGF0ZXgycG5nLmNvbTBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AF6nc/nfVsDntTZIfdBJ4DJ6kZoMhKESEoQYdZaBcUVYAAABdNqdVBoAAAQDAEcwRQIgfP9e7demogIXl0FNaqqil6RMyz60bQEfsAM1jDEtZvgCIQCnvcQ1tC25GX2hRlzrSQZJ M9Aj/ptzgPKEUeYrtg3mQB2ALIeBcyLos2KIE6HZvkruYolIGdr2vpw57JJUy3vi5BeAAABdNqdU/YAAAQDAEcwRQIgZCI1hyuxD2bnVYhE/AMh7klRGDvuKN2MlSO/K1mKzvACIQCmPglG7ZMWTGSRsUY56KpZG7HcdFonh ao0vzo0nXEsTANBgkqhkiG9w0BAQsFAAOCAQEAWmNzDoCno1ueQCcMy8usDHUbIdr2gifu5z2LpzDiTdx7gvx2RcojtlgAoxuaTlocwPQSfW21eaq5aDAQ46JaldvGzdsqgPJlIJ91MRyWccHX AMxxf05PiEKAe4MgLUJSb6 mwmZ0WEaBxZLcKp4vmYHBfOTvja3sOzQSydLSvyQE685f0U PaoB3uWX2uDpobkwzLF7c7wGEY0mHsmIRBAB5kAyP0MLb2W5pV M2vuYxVemVq2ah4tYSxc3cSjNS9r5N A9i69ukIzNzArSXzyhDqbkexL9w2aik3F0gt8G/WgouhjEwBGDAO3YUiYRdvI7khpQTx1/re2Tpm/MXQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0NlowSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMTGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EFq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8SMx yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT Xhq w3Brvaw2VFn3EK6BlspkENnWAa6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIGCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNvbTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9kc3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAwVAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcCARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwuY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsFAAOCAQEA3TPXEfNjWDjdGBX7CVW dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJouM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg VyOeph4EYpr/1wXKtx8/wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwuX4Po1QYz 3dszkDqMp4fklxBwXRsW10KXzPMTZ sOPAveyxindmjkW8lGy QsRlGPfZ G6Z6h7mjem0Y iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M X Q7UNKEkROb3N6KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd 3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt /yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4 U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62 FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or Dxz9LwwmglSBd49lZRNI DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX 5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----
  

Использование Selenium и запросов

Ниже приведен полный код, который:

  1. Использует Selenium для очистки текущей формулы latex по умолчанию и ввода выбранной вами формулы.
  2. Ожидает создания нового файла PNG.
  3. Возвращает URL-адрес нового файла PNG.
  4. Использует requests пакет для загрузки файла PNG latex.png в текущий каталог.

Этот код предназначен для управления Chrome, но вы можете загрузить драйверы для любого браузера по вашему выбору.

Скачать ChromeDrver

Установите Selenium

 from selenium import webdriver
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from selenium.webdriver.common.keys import Keys
import requests
import time

FORMULA = '\sum _ {i = 1} ^ { m } \operatorname{log} p ( x ; \theta)'

options = webdriver.ChromeOptions()
options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

try:
    driver.implicitly_wait(3) # wait up to 3 seconds before calls to find elements time out
    driver.get('https://latex2png.com/')
    # current png url:
    url_old = driver.find_element_by_xpath('/html/body/div[4]/div[5]/img').get_attribute('src')
    text_area = driver.find_element_by_id('form_latex')
    text_area.send_keys(Keys.CONTROL, 'a');
    text_area.send_keys(FORMULA)
    driver.find_element_by_id('convert_button').click()
    t0 = time.time()
    while True:
        # wait for new png to be generated:
        url = driver.find_element_by_xpath('/html/body/div[4]/div[5]/img').get_attribute('src')
        if url != url_old:
            break
        time.sleep(.1)
        t1 = time.time()
        if t1 - t0 > 10:
            raise Exception('Timeout waiting for new png to be generated.')
    resp = requests.get(url, allow_redirects=True, verify=False)
    png = resp.content
    with open('latex.png', 'wb') as f:
        f.write(png)
    print('Image saved.')
finally:
    driver.quit()
  

Комментарии:

1. Вау, это отлично работает! Как работает решение запросов? Я довольно новичок в запросах. Что делает json = data? Почему мы используем это вместо data= data или params =data?

2. Также я должен быть обеспокоен предупреждением «InsecureRequestWarning: на хост отправляется непроверенный запрос HTTPS», который меня бросает? Есть ли способ проверить соединение?

3. Сервер ожидает, что данные будут закодированы в виде строки в JSON формате. Смотрите smtpeter.com/en/documentation/json-vs-post для сравнения. Смотрите json.org/json-en.html для описания JSON .

4. У меня есть новая, улучшенная заметка.

Ответ №2:

На самом деле вы не хотите заполнять поля «человеческим» способом. То, что вы ищете, — это отправка POST-запроса на сервер. Самый простой способ узнать, какой запрос вам нужен: зайдите на сайт, откройте вкладку сеть в вашем браузере, заполните поля и нажмите кнопку. Проверьте, какие аргументы добавляются в POST-запрос. Проверьте, какой тип ответа вы получаете, и извлеките из него свой png-файл. Затем просто воссоздайте запрос POST в своем коде python, используя запросы.

Если вы хотите заполнить поля (см., как бот заполняет их), вы можете использовать selenium.

Комментарии:

1. Я уже знаю шаги и все, но я не знаю, как подключить данные формы. Когда я проверяю сеть, параметры представлены в текстовом формате, а не в формате словаря.