python demande une erreur POST, problème de session?

Aug 25 2020

J'essaie d'imiter les actions suivantes du navigateur via Python requests:

  1. Se poser sur https://www.bundesanzeiger.de/pub/en/to_nlp_start
  2. Cliquez sur "Plus d'options de recherche"
  3. Cliquez sur case à cocher « Trouvez aussi des données historisée » (correspond à POST param: isHistorical: true)
  4. Cliquez sur le bouton "Rechercher des positions courtes nettes"
  5. 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

1 AndrejKesely Aug 25 2020 at 02:28

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.
idkhowtocode Aug 24 2020 at 23:56

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