Web Scrapping Cookies

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Boonlight
User
Beiträge: 6
Registriert: Freitag 10. April 2020, 17:15

Moin Python Freunde,

ich habe folgendes Problem. Mein Script funktioniert soweit, das ich die Daten meines Fussballmanagaers jeden Tag auslesen kann und per CSV Speichere. Nun will ich aber, dass ich nicht händisch meine Cookies eintrage sondern ich möchte, dass das automatisch passiert. Bitte nehmt Rücksicht auf meinen schlechten Code. Dieses Projekt ist mein erstes Python Projekt.

Cookie hier extra anonymisiert

Code: Alles auswählen

import requests

headers_player = {
            
            'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8',
            'Accept-Language' : 'de,en-US;q=0.7,en;q=0.3',
            'Connection' : 'keep-alive',
            'Cookie' : '_ga=abc; _fbp=cde; _gid=fgh; onlineliga_location=OL-cookie; io=io-coockie; XSRF-TOKEN=xsrf-token; onlineliga_session=OL-Session',
            'Accept-Encoding' : 'gzip, deflate, br',
            'Host' : 'www.onlineliga.de',
            'Upgrade-Insecure-Requests' : "1"
            }

rplayer = requests.get(url = playerurl ,  headers = headers_player)
Dieser Teil funktioniert also einwandfrei wenn ich es hardcoded reinkopiere.

Hier nun dann versuche Cookies wegzulassen und automatisch zu holen, aber daran scheitere ich leider gnadenlos.

Code: Alles auswählen

headers_player = {
            
            'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8',
            'Accept-Language' : 'de,en-US;q=0.7,en;q=0.3',
            'Connection' : 'keep-alive',
            'Accept-Encoding' : 'gzip, deflate, br',
            'Host' : 'www.onlineliga.de',
            'Upgrade-Insecure-Requests' : "1"
            }
            
  r = requests.get('https://www.onlineliga.de')
  c = r.cookies
  h = r.headers
  print (r.headers)
#  session = requests.Session()
#  response = session.get('https://www.onlineliga.de')
#  cookies = session.cookies
#  cookies = response.cookies.get_dict('.onlineliga.de')
#  if cookies:
#      str_cook = str(cookies)
#      str_cook = re.sub('{', '', str_cook)
#      str_cook = re.sub('}', '', str_cook)
#      str_cook = re.sub(':', '=', str_cook)
##      str_cook = re.sub("'", '', str_cook)
##      str_cook = re.sub(",", ';', str_cook)
#      print(str_cook)
  #print(cookies)
#  print("------------------------------------")
#  #headers_player.update({'Cookie' : cookies})
#  #headers_skill.update({'Cookie' : cookies})
#  print("PLAYER")
#  print(headers_player)
#  print("------------------------------------")
#  print("SKILL")
#  print(headers_skill)        


for x in playerids:    
    playerurl = "https://www.onlineliga.de/player/overview?playerId=" + x
    
    rplayer = requests.get(url = playerurl ,  cookies = c, headers = headers_player)

Wäre schön wenn mich hier jemand unterstützen könnte.

Grüße
Boon
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum machst Du so komplizierte Dinge mit den Cookies?
Du hast doch schon ein Session, wenigstens auskommentiert, aber trotzdem haust Du noch mit replace drauf rum?
Cookies werden in einer Session automatisch gespeichert:

Code: Alles auswählen

session = requests.Session()
response = session.get('https://www.onlineliga.de')
response.raise_for_status()
for player_id in player_ids:
    response = session.get('https://www.onlineliga.de/player/overview', params={'playerId':player_id})
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und eventuell muss man in der Session sich auch anmelden, falls das Daten sind die man nur zu Gesicht bekommt, falls man angemeldet ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Boonlight
User
Beiträge: 6
Registriert: Freitag 10. April 2020, 17:15

__blackjack__ hat geschrieben: Samstag 11. April 2020, 18:14 Und eventuell muss man in der Session sich auch anmelden, falls das Daten sind die man nur zu Gesicht bekommt, falls man angemeldet ist.
Der erste Request funktioniert, die Daten bekommt man ohne Anmeldung zu Gesicht.

Code: Alles auswählen

session = requests.Session()
  response = session.get('https://www.onlineliga.de')
  response.raise_for_status()
  for player_id in playerids:
    

    #playerurl = "https://www.onlineliga.de/player/overview" + player_id
    skillurl = "https://www.onlineliga.de/team/training/details/results/player?playerId=" + player_id
   
    rplayer = session.get('https://www.onlineliga.de/player/overview', params={'playerId':player_id})
    docplayer = html.fromstring(rplayer.content.decode('UTF-8'))

Der zweite scheitert aber.

Code: Alles auswählen

rskill = session.get(skillurl)    
docskill = html.fromstring(rskill.content.decode('UTF-8'))
zusätzlicher Versuch mit Headerinformationen

Code: Alles auswählen

rskill = requests.get(url = skillurl ,  headers = headers_skill)
beides funktioniert nicht. Auth habe ich auch versucht. Hatte aber auch keinen Erfolg.

Code: Alles auswählen

s.auth = ('user', 'pass')
Boonlight
User
Beiträge: 6
Registriert: Freitag 10. April 2020, 17:15

Hab es jetzt erstmal lauffähig über eine ConfigDatei, sodass sich das jeder selbst anlegen kann.
Automatisch auslesen wäre aber immer noch deutlich netter. Aber das bekomme ich bisher nicht hin.
Boonlight
User
Beiträge: 6
Registriert: Freitag 10. April 2020, 17:15

hab es nun geschafft. Danke für die Denkanstöße

Code: Alles auswählen

result = session_requests.post(
      	login_url, 
      	data = payload, 
      	headers = dict(referer=login_url)
      )
Boonlight
User
Beiträge: 6
Registriert: Freitag 10. April 2020, 17:15

soup.findall komm mit folgendem Resultset zurück

Code: Alles auswählen

[<div class="team-overview-next-match-wrapper" onclick="olAnchorNavigation.load('/match', { season : 3, matchId : 7097 });">
<div class="text-center">-</div>
<div class="text-center next-match-preview-link">
                                    Vorschau
                                    <span class="fa fa-angle-right"></span>
</div>
</div>]
wie komm ich einfach nun an die season und die matchId?
mit Get_text und get etc hab ich es schon probiert aber er liefert mir nur dann " Vorschau "

Code: Alles auswählen

roverview = session_req.get(url = overurl)
    soup = BeautifulSoup(roverview.text, 'html.parser')
    #docoverview = html.fromstring(roverview.content.decode('UTF-8'))
    content = soup.find_all('div', { "class" : "team-overview-next-match-wrapper"})
Boonlight
User
Beiträge: 6
Registriert: Freitag 10. April 2020, 17:15

hab es selbst rausgefunden

Code: Alles auswählen

content[0].attrs['onclick'].text
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Boonlight: Wenn Du nur das erste (vielleicht sogar einzige) vorkommen finden willst, dann nimm doch nicht `find_all()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten