Python żąda błędu POST, problem z sesją?
Próbuję naśladować następujące działania przeglądarki za pomocą Pythona requests:
- Wyląduj dalej https://www.bundesanzeiger.de/pub/en/to_nlp_start
- Kliknij „Więcej opcji wyszukiwania”
- Kliknij pole „również historicised danych” (odpowiada POST param:
isHistorical: true) - Kliknij przycisk „Wyszukaj krótkie pozycje netto”
- Kliknij przycisk „Als CSV herunterladen”, aby pobrać plik csv
Oto kod, który muszę zasymulować:
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)
Jednak mimo że srdaje mi status_code 200, to naprawdę błąd, gdy sprawdzam sr.url, co pokazujehttps://www.bundesanzeiger.de/pub/en/error-404?9
Kopiąc nieco głębiej zauważyłem, że request_urlpowyżej rozwiązuje się coś takiego
https://www.bundesanzeiger.de/pub/en/nlp;wwwsid=EFEB15CD4ADC8932A91BA88B561A50E9.web07-pub?0-1.-nlp~filter~form~panel-form
ale kiedy sprawdzam adres URL żądania w Chrome, to w rzeczywistości
https://www.bundesanzeiger.de/pub/en/nlp?87-1.-nlp~filter~form~panel-form`
87Tutaj wydaje się zmieniać, co sugeruje, że to jakiś identyfikator sesji, ale kiedy robię to przy użyciu requestsnie wydaje się, aby prawidłowo rozwiązać.
Masz jakiś pomysł, czego tu brakuje?
Odpowiedzi
Możesz wypróbować ten skrypt, aby pobrać plik 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') )
Wydruki:
"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.
Jeśli sprawdzisz https://www.bundesanzeiger.de/robots.txt, ta witryna nie lubi być indeksowana. Witryna może blokować dostęp do domyślnego klienta użytkownika używanego przez boty. To może pomóc: żądania w Pythonie a plik robots.txt