Anmeldung mit Webseiten

Meine vorherige Frage ( Anmeldung auf Website mit Anfragen ) erzeugte einige tolle Antworten und damit konnte ich viele Websites kratzen. Aber die Seite, an der ich arbeite, ist jetzt knifflig. Ich weiß nicht, ob es eine Website Bug oder etwas getan absichtlich, aber ich kann nicht kratzen.

Heres ein Teil meines Codes.

import requests import re from lxml import html from multiprocessing.dummy import Pool as ThreadPool from fake_useragent import UserAgent import time import ctypes global FileName now = time.strftime('%d.%m.%Y_%H%M%S_') FileName=str(now + "Scraped data.txt") fileW = open(FileName, "w") url = open('URL.txt', 'r').read().splitlines() fileW.write("URL Name SKU Dimensions Availability MSRP NetPrice") fileW.write(chr(10)) count=0 no_of_pools=14 r = requests.session() payload = { "email":"I cant give them out in public", "password":"maybe I can share it privately if anyone can help me with it :)", "redirect":"true" } rs = r.get("https://checkout.reginaandrew.com/store/checkout.ssp?fragment=login&is=login&lang=en_US&login=T#login-register") rs = r.post("https://checkout.reginaandrew.com/store/checkout.ssp?fragment=login&is=login&lang=en_US&login=T#login-register",data=payload,headers={'Referer':"https://checkout.reginaandrew.com/store/my_account.ssp"}) rs = r.get("https://checkout.reginaandrew.com/store/my_account.ssp") tree = html.fromstring(rs.content) print(str(tree.xpath("//*[@id='site-header']/div[3]/nav/div[2]/div/div/a/@href"))) 

Das Problem ist, dass auch wenn ich mich manuell einlogge und eine Produkt-URL öffne, indem du sie in die Adressleiste eingibst, erkennt der Browser nicht, dass er eingeloggt ist.

Der einzige Weg, um das zu sehen, klickt auf einen Link auf der Seite, die du nach der Anmeldung umgeleitet hast. Erst dann erkennt der Browser, dass er sich angemeldet hat und ich kann bestimmte URLs öffnen und alle Informationen sehen.

Welches Hindernis, in das ich hineinlief, ist, dass sich der Link ändert. Die Druckanweisung im Code

Print (str (tree.xpath ("// * [@ id = 'site-header'] / div [3] / nav / div [2] / div / div / a / @ href")))

Dies sollte den Link extrahiert haben, aber es gibt nichts zurück.

irgendwelche Ideen?

EDIT (Strippen von Leerraum) rs.content ist:

 <!DOCTYPE html><html lang="en-US"><head><meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <link rel="shortcut icon" href="https://checkout.reginaandrew.com/c.1283670/store/img/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title></title> <!--[if !IE]><!--> <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css/checkout.css?t=1484321730904"> <!--<![endif]--> <!--[if lte IE 9]> <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css_ie/checkout_2.css?t=1484321730904"> <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css_ie/checkout_1.css?t=1484321730904"> <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css_ie/checkout.css?t=1484321730904"> <![endif]--> <!--[if lt IE 9]> <script src="/c.1283670/store/javascript/html5shiv.min.js"></script> <script src="/c.1283670/store/javascript/respond.min.js"></script> <![endif]--> <script>var SC=window.SC={ENVIRONMENT:{jsEnvironment:typeof nsglobal==='undefined'?'browser':'server'},isCrossOrigin:function(){return 'checkout.reginaandrew.com'!==document.location.hostname},isPageGenerator:function(){return typeof nsglobal!=='undefined'},getSessionInfo:function(key){var session=SC.SESSION||SC.DEFAULT_SESSION||{};return key?session[key]:session},getPublishedObject:function(key){return SC.ENVIRONMENT&&SC.ENVIRONMENT.published&&SC.ENVIRONMENT.published[key]?SC.ENVIRONMENT.published[key]:null}};function loadScript(data){'use strict';var element;if(data.url){element='<script src="'+data.url+'"></'+'script>'}else{element='<script>'+data.code+'</'+'script>'}if(data.seo_remove){document.write(element)}else{document.write('</div>'+element+'<div class="seo-remove">')}} </script> </head> <body> <noscript> <div class="checkout-layout-no-javascript-msg"> <strong>Javascript is disabled on your browser.</strong><br> To view this site, you must enable JavaScript or upgrade to a JavaScript-capable browser. </div> </noscript> <div id="main" class="main"></div> <script>loadScript({url: '/c.1283670/store/checkout.environment.ssp?lang=en_US&cur=USD&t=' + (new Date().getTime())}); </script> <script>if (!~window.location.hash.indexOf('login-register') && !~window.location.hash.indexOf('forgot-password') && 'login-register'){window.location.hash = 'login-register';} </script> <script src="/c.1283670/store/javascript/checkout.js?t=1484321730904"> </script> <script src="/cms/2/assets/js/postframe.js"></script> <script src="/cms/2/cms.js"></script> <script>SCM['SC.Checkout'].Configuration.currentTouchpoint = 'login';</script> </body> </html> 

2 Solutions collect form web for “Anmeldung mit Webseiten”

Kratzende Standorte können hart sein

Einige Seiten senden Ihnen gut geformte HTML und alles, was Sie tun müssen, ist in ihm zu suchen, um Daten / Links zu finden, was auch immer Sie zum Schaben brauchen.

Einige Seiten schicken Ihnen schlecht geformte HTML. Browsers, im Laufe der Jahre haben sich ziemlich ausgenommen "schlecht" HTML und tun das Beste, was sie können, um zu interpretieren, was das HTML versucht zu tun. Der Nachteil ist, wenn du einen strengen Parser benutzt, um das HTML zu entschlüsseln, das es scheitern kann: Du brauchst etwas, das mit Fuzzy-Daten arbeiten kann. Oder, nur brutale Kraft mit Regex. Ihre Verwendung von xpath funktioniert nur, wenn das resultierende HTML ein gut geformtes XML-Dokument erzeugt.

Einige Seiten (mehr und mehr in diesen Tagen) senden ein bisschen HTML und Javascript, und vielleicht JSON, XML, was auch immer für den Browser. Der Browser konstruiert dann das endgültige HTML (das DOM) und zeigt es dem Benutzer an. Das hast du hier

Sie wollen das endgültige DOM kratzen, aber da ist nicht das, was die Seite dir sendet. Also musst du entweder kratzen, was sie senden (zum Beispiel, du siehst heraus, dass der Link, den du willst, aus dem JSON entschieden werden kann, den sie {books: [{title: "Graphs of Wrath", code: "a88kyyedkgH"}]} Wenn du den Browser alle Anfragen treibst, baue ich das DOM auf und krüge dann das Ergebnis, es ist langsamer, aber es ist langsamer Es klappt.

Wenn es hart wird, betrachten Sie:

  1. Die Website wahrscheinlich nicht wollen, dass Sie dies tun und (wir) Webmaster haben genau so viele Werkzeuge, um Ihr Leben härter und härter zu machen.
  2. Alternativ kann es eine veröffentlichte API, die für Sie entworfen wurde, um die meisten Informationen zu erhalten (Amazon ist ein großartiges Beispiel). (Meine Vermutung ist, dass Amazonus weiß, dass es nicht alle Webscrapper schlagen kann, also ist es besser für sie, einen Weg zu bieten, der nicht so viele Ressourcen auf ihren Hauptservern verbraucht.)

Das wird sehr knifflig sein und vielleicht möchten Sie ein anspruchsvolleres Tool wie Selen verwenden , um einen Browser emulieren zu können.

Andernfalls müssen Sie untersuchen, welche Cookies oder andere Arten von Authentifizierung für Sie erforderlich sind, um sich bei der Website anzumelden. Beachten Sie alle Cookies, die hinter den Kulissen passiert werden – es ist nicht ganz so einfach wie nur Eingabe in den Benutzernamen / Passwort, um sich hier anmelden zu können. Sie können sehen, welche Informationen übergeben werden, indem Sie die Registerkarte "Netzwerk" in Ihrem Webbrowser anzeigen.

Bildbeschreibung hier eingeben

Schließlich, wenn Sie sich Sorgen machen, dass Selen könnte "träge" (es ist – schließlich ist es das Gleiche tun, was ein Benutzer tun würde, wenn Sie einen Browser öffnen und auf Dinge klicken), dann können Sie versuchen, etwas wie CasperJS, though Die Lernkurve, um etwas mit diesem umzusetzen ist ziemlich steiler als Selen – vielleicht möchten Sie mit Selen zuerst versuchen.

  • Python 2 v. 3 xpfad
  • Wie richte ich XPath-Abfrage für HTML-Parsing ein?
  • Python Crawler nicht finden spezifische Xpath
  • Wie füge ich ein Attribut zu einem Tag hinzu, das mit xpath in lxml in Python gefunden wurde?
  • Lxml findall SyntaxError: ungültiges Prädikat
  • Warum gibt mein Scrapy-Code ein leeres Array zurück?
  • Erstellen von Loop, um Tabellendaten in scrapy / python zu analysieren
  • Schaben von Web-Seite und Neuformatierung zu einer Kalender-Datei
  • Verknüpfen von Xpath verschachtelten Text in Scrapy
  • Erhalten Sie die Liste der XML-Attributwerte in Python
  • Lxml xpath kann keine HTML-Elemente anzeigen
  • Python ist die beste Programmiersprache der Welt.