python richiede un errore POST, problema di sessione?
Sto cercando di imitare le seguenti azioni del browser tramite Python requests:
- Atterrare su https://www.bundesanzeiger.de/pub/en/to_nlp_start
- Fai clic su "Altre opzioni di ricerca"
- Clicca casella di controllo "anche trovare i dati storicizzati" (corrisponde a POST param:
isHistorical: true) - Fare clic sul pulsante "Cerca posizioni corte nette"
- Fare clic sul pulsante "Als CSV herunterladen" per scaricare il file csv
Questo è il codice che devo simulare:
import requests
import re
s = requests.Session()
r = s.get("https://www.bundesanzeiger.de/pub/en/to_nlp_start", verify=False, allow_redirects=True)
matches = re.search(
r'form class="search-form" id=".*" method="post" action="\.(?P<appendtxt>.*)"',
r.text
)
request_url = f"https://www.bundesanzeiger.de/pub/en{matches.group('appendtxt')}"
sr = session.post(request_url, data={'isHistorical': 'true', 'nlp-search-button': 'Search net short positions'}, allow_redirects=True)
Tuttavia, anche se srmi dà uno status_code 200, è davvero un errore quando controllo sr.url, il che mostrahttps://www.bundesanzeiger.de/pub/en/error-404?9
Scavando un po 'più a fondo, ho notato che request_urlsopra si risolve in qualcosa di simile
https://www.bundesanzeiger.de/pub/en/nlp;wwwsid=EFEB15CD4ADC8932A91BA88B561A50E9.web07-pub?0-1.-nlp~filter~form~panel-form
ma quando controllo l'URL della richiesta in Chrome, in realtà è
https://www.bundesanzeiger.de/pub/en/nlp?87-1.-nlp~filter~form~panel-form`
Il 87qui sembra cambiare, suggerendo che si tratta di un ID di sessione, ma quando lo sto usando requestsnon sembra risolversi correttamente.
Qualche idea su cosa mi manchi qui?
Risposte
Puoi provare questo script per scaricare il file CSV:
import requests
from bs4 import BeautifulSoup
url = 'https://www.bundesanzeiger.de/pub/en/to_nlp_start'
data = {
'fulltext': '',
'positionsinhaber': '',
'ermittent': '',
'isin': '',
'positionVon': '',
'positionBis': '',
'datumVon': '',
'datumBis': '',
'isHistorical': 'true',
'nlp-search-button': 'Search+net+short+positions'
}
headers = {
'Referer': 'https://www.bundesanzeiger.de/'
}
with requests.session() as s:
soup = BeautifulSoup(s.get(url).content, 'html.parser')
action = soup.find('form', action=lambda t: 'nlp~filter~form~panel-for' in t)['action']
u = 'https://www.bundesanzeiger.de/pub/en' + action.strip('.')
soup = BeautifulSoup( s.post(u, data=data, headers=headers).content, 'html.parser' )
a = soup.select_one('a[title="Download as CSV"]')['href']
a = 'https://www.bundesanzeiger.de/pub/en' + a.strip('.')
print( s.get(a, headers=headers).content.decode('utf-8-sig') )
Stampe:
"Positionsinhaber","Emittent","ISIN","Position","Datum"
"Citadel Advisors LLC","LEONI AG","DE0005408884","0,62","2020-08-21"
"AQR Capital Management, LLC","Evotec SE","DE0005664809","1,10","2020-08-21"
"BlackRock Investment Management (UK) Limited","thyssenkrupp AG","DE0007500001","1,50","2020-08-21"
"BlackRock Investment Management (UK) Limited","Deutsche Lufthansa Aktiengesellschaft","DE0008232125","0,75","2020-08-21"
"Citadel Europe LLP","TAG Immobilien AG","DE0008303504","0,70","2020-08-21"
"Davidson Kempner European Partners, LLP","TAG Immobilien AG","DE0008303504","0,36","2020-08-21"
"Maplelane Capital, LLC","VARTA AKTIENGESELLSCHAFT","DE000A0TGJ55","1,15","2020-08-21"
...and so on.
Se controlli https://www.bundesanzeiger.de/robots.txt, a questo sito web non piace essere indicizzato. Il sito web potrebbe negare l'accesso all'agente utente predefinito utilizzato dai bot. Questo potrebbe aiutare: richieste Python e robots.txt