#python #web-scraping #python-requests #python-imaging-library #python-3.8
#python #веб-очистка #python-запросы #python-imaging-library #python-3.8
Вопрос:
Я пытаюсь получить данные, используя веб-очистку запросов с этого веб-сайтаhttps://enlinea.sunedu.gob.pe/verificainscripcion , параметр — это документ в примере 06950413, а captcha, также скрытый параметр с именем _token, я получил с помощью xpath, поэтому в случае captcha я получаю изображение с помощью xpath, а также загружаю изображение в папку imagenes, после этого я жду captcha с помощью input (), пока я набираю буквы captcha в строке ввода. captcha.txt затем я ввожу капчу, я нажимаю enter, чтобы продолжить, но я получил ошибку captcha json в ответе. это мой код:
from time import sleep
import requests
from lxml import html
from PIL import Image # pip install Pillow
import io
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36",
"Host": "enlinea.sunedu.gob.pe",
"Origin": "https://enlinea.sunedu.gob.pe",
"Referer": "https://enlinea.sunedu.gob.pe/verificainscripcion",
}
session = requests.Session()
login_form_url = 'https://enlinea.sunedu.gob.pe/verificainscripcion'
login_form_res = session.get(login_form_url, headers=headers)
sleep(5)
parser = html.fromstring(login_form_res.text)
special_token = parser.xpath('//input[@name="_token"]/@value')
print('token:', special_token[0])
span_image = parser.xpath('//div[@class="pull-right"]/span[@id="captchaImgPriv"]/img')[0].get("src")
print(span_image)
image_content = requests.get(span_image).content
image_file = io.BytesIO(image_content)
image = Image.open(image_file).convert('RGB')
file_path = './imagenes/captcha.jpg'
with open(file_path, 'wb') as f:
image.save(f, "JPEG", quality=85)
input()
login_url = 'https://enlinea.sunedu.gob.pe/consulta'
login_data = {
"doc": "06950413",
"opcion": 'PUB',
"_token": special_token[0],
"icono": '',
"captcha": open('captcha.txt').readline().strip()
}
print(login_data)
rep = session.post(
login_url,
data=login_data,
headers=headers
)
print(rep.text)
Ответ №1:
Проблема заключалась в том, что вы не использовали сеанс при создании запроса изображения captcha. Запрос изображения выдает файл cookie, который должен быть отправлен обратно с формой :
Следующий скрипт использует beautifulsoup вместо xpath / lxml, загружает captcha, показывает captcha, ожидает ввода пользователем и получает данные :
import requests
from bs4 import BeautifulSoup
from PIL import Image
import io
import json
host = "https://enlinea.sunedu.gob.pe"
doc = "06950413"
s = requests.Session()
r = s.get(f"{host}/verificainscripcion")
soup = BeautifulSoup(r.text, "html.parser")
payload = dict([
(t["name"],t.get("value",""))
for t in soup.find("form", {"id": "consultaForm"}).find_all("input")
])
payload["doc"] = doc
image_content = s.get(f'{host}/simplecaptcha').content
image_file = io.BytesIO(image_content)
image = Image.open(image_file).convert('RGB')
image.show()
captcha = input("please enter captcha : ")
payload["captcha"] = captcha
print(payload)
r = s.post("https://enlinea.sunedu.gob.pe/consulta", data = payload)
data = json.loads(r.text)
print(data)
вывод :
please enter captcha : YLthP
{'doc': '06950413', 'opcion': 'PUB', '_token': 'gfgUTJrqPcmM9lyFHqW0u5aOdoF4gNSJm60kUNRu', 'icono': '', 'nombre': '', 'captcha': 'YLthP'}
[{"ID":"1519729","NOMBRE":"OSORIO DELGADILLO, FLOR DE MARIA","DOC_IDENT":"DNI 06950413","GRADO":"<b>BACHILLER EN EDUCACION ","TITULO_REV":"<b>BACHILLER EN EDUCACION","GRADO_REV":null,"DIPL_FEC":"26/06/1987","RESO_FEC":"-","ESSUNEDU":"0","UNIV":"UNIVERSIDAD INCA GARCILASO DE LA VEGA ASOCIACIu00d3N CIVIL","PAIS":"PERU","COMENTARIO":"-","TIPO":"N","TIPO_GRADO":"B","DIPL_TIP_EMI":null,"TIPO_INSCRI":null,"NUM_DIPL_REVA":null,"NUM_ORD_PAG":null,"V_ORIGEN":null,"NRO_RESOLUCION_NULIDAD":null,"FLG_RESOLUCION_NULIDAD":null,"FECHA_RESOLUCION_NULIDAD":null,"MODALIDAD_ESTUDIO":"-"}]
Комментарии:
1. Большое спасибо Бертрану Мартелю, однако у меня возникла небольшая проблема с {now.strftime («%s») [:-3]}’) Ошибка значения: недопустимая строка формата. Итак, я понял, что удаление из ?date =, это был отвлекающий фактор, я так думаю. Я имею в виду изменение, подобное этому image_content = s.get(f'{host}/simplecaptcha’).содержимое сработало. Спасибо.
2. @GSandro_Strongs странно, что это должно быть проблема с форматом strftime, но вы правы, я думаю, что
date
параметр предназначен для кэширования и не полезен в контексте очистки. Я обновил ответ