Python парсинг, создание полезной нагрузки cnmv.es и рендеринг javascript - PullRequest
1 голос
/ 04 августа 2020

Я отправляю запрос https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx с полезной нагрузкой и поисковым текстом aaa, но получаю javascript ответ. Так что мне нужен рендер javascript, но я не хочу использовать Selenium. Также я не уверен, что моя полезная нагрузка хороша.

    url = 'https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx'
    search_text = 'aaa'
    r = requests.get('https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx')
    soup = BeautifulSoup(r.content, 'html.parser')

    VIEWSTATE  = soup.find(id="__VIEWSTATE")['value'] + '%3D&'
    VIEWSTATEGENERATOR = '__VIEWSTATEGENERATOR=' + soup.find(id="__VIEWSTATEGENERATOR")['value']

    EVENTVALIDATION = '&__EVENTVALIDATION' + soup.find(id="__EVENTVALIDATION")['value']
    SEARCH = "&ctl00%24wBusqueda%24txtBusqueda=&ctl00%24ContentPrincipal%24txtBusqueda={0}&ctl00%24ContentPrincipal%24btnBuscar=Search".format(search_text)
    

    payload = '__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=' + VIEWSTATE + VIEWSTATEGENERATOR + EVENTVALIDATION + SEARCH


    headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'Origin': 'https://www.cnmv.es',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx',
    'Accept-Language': 'en-US,en;q=0.9',
    }

    response = requests.request("POST", url, headers=headers, data = payload)

    print(response.text.encode('utf8'))

1 Ответ

1 голос
/ 04 августа 2020

Я не тестировал ваш payload, но я не знаю, почему вы добавляете %3D к __VIEWSTATE

Я использую словарь, который requests автоматически преобразуется в строку, а я не Не нужно добавлять & вручную. И мне не нужно использовать %24 вместо $ в ctl00$wBusqueda$txtBusqueda, et c.

payload = {
    '__EVENTTARGET': '',
    '__EVENTARGUMENT': '',
    '__VIEWSTATE': soup.find(id="__VIEWSTATE")['value'],
    '__VIEWSTATEGENERATOR': soup.find(id="__VIEWSTATEGENERATOR")['value'],
    '__EVENTVALIDATION': soup.find(id="__EVENTVALIDATION")['value'],
    'ctl00$wBusqueda$txtBusqueda': '',
    'ctl00$ContentPrincipal$txtBusqueda': search_text,
    'ctl00$ContentPrincipal$btnBuscar': 'Buscar',
}        

BTW: Код работает без заголовков, но Я оставляю их в комментариях.

import requests
from bs4 import BeautifulSoup

url = 'https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx'
search_text = 'aaa'

r = requests.get('https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx')
soup = BeautifulSoup(r.content, 'html.parser')

payload = {
    '__EVENTTARGET': '',
    '__EVENTARGUMENT': '',
    '__VIEWSTATE': soup.find(id="__VIEWSTATE")['value'],
    '__VIEWSTATEGENERATOR': soup.find(id="__VIEWSTATEGENERATOR")['value'],
    '__EVENTVALIDATION': soup.find(id="__EVENTVALIDATION")['value'],
    'ctl00$wBusqueda$txtBusqueda': '',
    'ctl00$ContentPrincipal$txtBusqueda': search_text,
    'ctl00$ContentPrincipal$btnBuscar': 'Buscar',
}        

headers = {
#    'Connection': 'keep-alive',
#    'Cache-Control': 'max-age=0',
#    'Upgrade-Insecure-Requests': '1',
#    'Origin': 'https://www.cnmv.es',
#    'Content-Type': 'application/x-www-form-urlencoded',
#    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
#    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
#    'Sec-Fetch-Site': 'same-origin',
#    'Sec-Fetch-Mode': 'navigate',
#    'Sec-Fetch-User': '?1',
#    'Sec-Fetch-Dest': 'document',
#    'Referer': 'https://www.cnmv.es/portal/Consultas/BusquedaPorEntidad.aspx',
#    'Accept-Language': 'en-US,en;q=0.9',
}

r = requests.post(url, headers=headers, data=payload)
#print(response.text)

soup = BeautifulSoup(r.content, 'html.parser')
for item in soup.find_all('option'):
    print(item['value'], '|', item.text)

Результат:

CLP3846 | AAA TRADE LTD
V85543155 | DWS DINERO GOBIERNOS AAA, FI
V85263911 | EUROVALOR DEUDA PUBLICA EUROPEA AAA, FI
9686 | WWW.AAARATEDBOND.COM
...