#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
Я проверил через свой браузер, что сертификат действителен. Поскольку в целом не рекомендуется отключать проверку сертификатов, хотя в данном случае это кажется относительно безопасным, мы можем добавить отсутствующий сертификат следующим образом:
- Следующий URL-адрес содержит инструкции по загрузке SSL-сертификатов с веб-сайта с использованием различных браузеров. Вам нужно создать
.pem
файл. Для этого вам нужно использовать Firefox. Существуют также различные варианты. Когда вы попадете на страницу сертификата, выберитеLet's Encrypt Authority X3
, а затем нажмите наPEM (chain)
ссылку для скачивания. Это создаст файлlatex2png-com-chain.pem
в каталоге по вашему выбору. - Везде, где указан источник
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 и запросов
Ниже приведен полный код, который:
- Использует Selenium для очистки текущей формулы latex по умолчанию и ввода выбранной вами формулы.
- Ожидает создания нового файла PNG.
- Возвращает URL-адрес нового файла PNG.
- Использует
requests
пакет для загрузки файла PNGlatex.png
в текущий каталог.
Этот код предназначен для управления Chrome, но вы можете загрузить драйверы для любого браузера по вашему выбору.
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. Я уже знаю шаги и все, но я не знаю, как подключить данные формы. Когда я проверяю сеть, параметры представлены в текстовом формате, а не в формате словаря.