python POST hatası istiyor, oturum sorunu?
Aşağıdaki tarayıcı eylemlerini python'lar aracılığıyla taklit etmeye çalışıyorum requests:
- Arazi https://www.bundesanzeiger.de/pub/en/to_nlp_start
- "Daha fazla arama seçeneği" ni tıklayın
- (POST param karşılık gelir: checkbox "Ayrıca tarihselleştirilmiş verileri bulmak" Click
isHistorical: true) - "Net kısa pozisyonları ara" düğmesine tıklayın
- Csv dosyasını indirmek için "Als CSV herunterladen" düğmesine tıklayın
Bunu simüle etmem gereken kod bu:
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)
Ancak, olsa bile srgerçekten, bana kontrol bir hata, bir status_code 200 oluyor verir sr.url, hangi gösterilerihttps://www.bundesanzeiger.de/pub/en/error-404?9
Biraz daha derine indiğimde, request_urlyukarıdakinin şöyle bir şeye çözüldüğünü fark ettim:
https://www.bundesanzeiger.de/pub/en/nlp;wwwsid=EFEB15CD4ADC8932A91BA88B561A50E9.web07-pub?0-1.-nlp~filter~form~panel-form
ancak Chrome'da istek url'sini kontrol ettiğimde, aslında
https://www.bundesanzeiger.de/pub/en/nlp?87-1.-nlp~filter~form~panel-form`
87Burada bazı oturum kimliği var düşündüren, değişim gibi görünüyor, ama ben kullanarak yapıyorum zaman requestsdüzgün çözmeye görünmüyor.
Burada neyi kaçırdığım hakkında bir fikrin var mı?
Yanıtlar
CSV dosyasını indirmek için bu komut dosyasını deneyebilirsiniz:
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') )
Baskılar:
"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.
Kontrol edersen https://www.bundesanzeiger.de/robots.txt, bu web sitesi indekslenmekten hoşlanmıyor. Web sitesi, botlar tarafından kullanılan varsayılan kullanıcı aracısına erişimi reddediyor olabilir. Bu yardımcı olabilir: Python istekleri ile robots.txt karşılaştırması