python demande une erreur POST, problème de session?
J'essaie d'imiter les actions suivantes du navigateur via Python requests:
- Se poser sur https://www.bundesanzeiger.de/pub/en/to_nlp_start
- Cliquez sur "Plus d'options de recherche"
- Cliquez sur case à cocher « Trouvez aussi des données historisée » (correspond à POST param:
isHistorical: true) - Cliquez sur le bouton "Rechercher des positions courtes nettes"
- Cliquez sur le bouton "Als CSV herunterladen" pour télécharger le fichier csv
Voici le code que j'ai pour simuler ceci:
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)
Cependant, même si cela srme donne un status_code 200, c'est vraiment une erreur lorsque je vérifie sr.url, ce qui montrehttps://www.bundesanzeiger.de/pub/en/error-404?9
En creusant un peu plus profondément, j'ai remarqué que request_urlci - dessus se résout à quelque chose comme
https://www.bundesanzeiger.de/pub/en/nlp;wwwsid=EFEB15CD4ADC8932A91BA88B561A50E9.web07-pub?0-1.-nlp~filter~form~panel-form
mais lorsque je vérifie l'URL de la requête dans Chrome, c'est en fait
https://www.bundesanzeiger.de/pub/en/nlp?87-1.-nlp~filter~form~panel-form`
L' 87ici semble changer, suggérant qu'il s'agit d'un ID de session, mais lorsque je le fais, requestsil ne semble pas se résoudre correctement.
Une idée de ce qui me manque ici?
Réponses
Vous pouvez essayer ce script pour télécharger le fichier 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') )
Impressions:
"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.
Si vous cochez https://www.bundesanzeiger.de/robots.txt, ce site n'aime pas être indexé. Le site Web pourrait refuser l'accès à l'agent utilisateur par défaut utilisé par les bots. Cela pourrait aider: requêtes Python vs robots.txt