2016-07-04 2 views
2

Ich versuche, einige Informationen von einer Website zu holen, ohne Erfolg.Wie kann ich Daten abschaben, die durch eine Schaltfläche gesperrt sind?

Das Problem ist, dass die Daten nur nach dem Klicken auf eine bestimmte Schaltfläche angezeigt werden.

first_page

Die Informationen, die ich in diesem Tag liegt wollen:

<div id="frmContact" class="contactForm hidden"></div> 
<div class="btn btn-secondary viewnumber phone-trigger" data-ga-action="header"> 
    <a href="#" rel="nofollow">Ver telefone</a> 
    <i class="icon"></i> 
</div> 

Es kann etwas mit dieser Linie zu tun haben:

<form action="/noindex/doctor-phone" id="frmPhone" method="post"><input name="__RequestVerificationToken" type="hidden" value="3uFb11EKzbTh4TWoqXk025U7jS7QoV5-od7lSgSBzdu616u82jQAHiOTl2aB3q47aRCIg2CjVCjE6R6bUAqDplAOfeM1" /><input id="entityKey" name="entityKey" type="hidden" value="12898671" /><input id="placeType" name="placeType" type="hidden" value="" /><input id="placeKey" name="placeKey" type="hidden" value="" /></form> <div id="phonePlacer"></div> 

Aber ich weiß nicht, wie man dieses __RequestVerificationToken richtig benutzt.


Muss ich einen request auf dem Server das Telefon Informationen erhalten mit diesen Informationen senden? Wenn das so ist, wie?

Nachdem ich auf die Schaltfläche klicken, dann ist dies das Popup, das (ich habe Interesse an info1 zu info4) erscheint:

enter image description here

Mein Code:

page = BeautifulSoup(urllib2.urlopen('http://www.doctoralia.com.br/medico/RANDOM_PROFILE'), "html.parser") 
hidden_tags = page.find_all("input", type="hidden") 

for tag in hidden_tags: 
    print tag 

Ausgang:

<input name="__RequestVerificationToken" type="hidden" value="gPYstKvmi4xBQsV81ECf5mYe695igvq8E2QqtOgBPqtRybEP74OEbSAe8uDg8dlZCpqib94FIrUoPMnpLTC0tY7kiJE1"/> 
<input id="entityKey" name="entityKey" type="hidden" value="14336768"/> 
<input id="placeType" name="placeType" type="hidden" value=""/> 
<input id="placeKey" name="placeKey" type="hidden" value=""/> 

Antwort

1

Es ist ziemlich einfach mit einem requests.Session Objekt, Sie müssen nur das __RequestVerificationToken Token aus der ersten Seite und ein paar Stücke von Formulardaten extrahieren. Früher habe ich die Seite von einem vollständigen Liste, die Zahlen und den Link zur Ärzte-Seite zu gelangen, gilt die gleiche Logik, wo immer Sie sich entscheiden, von die Zahl zu erhalten:

from bs4 import BeautifulSoup 
import requests 
from urlparse import urljoin 

head = { 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", 
    "X-Requested-With": "XMLHttpRequest"} 

base = "http://www.doctoralia.com.br/" 

with requests.Session() as s: 
    r = s.get('http://www.doctoralia.com.br/medicos/especialidade/dermatologistas-1314') 
    page = BeautifulSoup(r.content, "html.parser") 
    token = page.select_one("input[name=__RequestVerificationToken]"["value"]) 
    hidden_tags = page.select("article.media.doctor") 
    for tag in hidden_tags: 
     h3 = tag.select_one("h3") 
     key = h3.a["data-track-click"] 
     place = tag.select_one("span[data-location]")["data-location"].split("|", 1)[0] 

     data = {"__RequestVerificationToken": token, 
      "entityKey": key, 
      "placeKey": place} 
     resp = s.post("http://www.doctoralia.com.br/noindex/doctor-phone", data=data, headers=head) 
     soup = BeautifulSoup(resp.content,"html.parser") 
     print(urljoin(base,h3.a["href"])) 
     print(soup.select_one("li.phone").text.strip()) 

Das bekommt man alle Links und die Telefonnummern Jeder Arzt, alles, was Sie im Popup sehen, wenn Sie auf die Schaltfläche klicken, steht für die Analyse zur Verfügung. Die wesentlichen Formulardaten sind die __RequestVerificationToken und die entityKey, die placeKey scheint nicht den Post aber keinen Schaden darunter zu beeinflussen. Die Header sind auch in diesem Fall nicht notwendig, aber es ist auch kein Nachteil, immer einen User-Agent hinzuzufügen. Möglicherweise möchten Sie zwischen Anforderungen einen Ruhezustand hinzufügen, damit Sie den Server nicht hämmern, wenn Sie viele Anfragen stellen. Auch Blick auf die Roboter.txt:

User-agent: * 
Disallow: /noindex/ 
Disallow: /usuarios/ 
Disallow: /users/ 
Disallow: /utilisateurs/ 
Disallow: /utenti/ 
Disallow: /gebruikers/ 
Disallow: /nutzer/ 
Disallow: /medical-center/m/ 
Disallow: /consultant/m/ 
Disallow: /centro-medico/m/ 
Disallow: /medico/m/ 
Disallow: /centre-medical/m/ 
Disallow: /medicin/m/ 
Disallow: /centro-medico/m/ 
Disallow: /medico/m/ 
Disallow: /centri-medici/m/ 
Disallow: /medecin/m/ 
Disallow: /healthpro/m/ 
Disallow: /facharzt/m/ 
Disallow: /sanit�tszentrum/m/ 
Disallow: /clickfav/ 
Disallow: /clicktlf/ 
Disallow: /reservas/ 
Disallow: /citas/ 
Disallow: /medisch-centrum/m/ 
Disallow: /deskundige/m/ 
Disallow: /arzt/m/ 
Disallow: /klinik/m/ 
Disallow: /citas/ 
Disallow: /turnos/ 
Disallow: /appuntamenti/ 
Disallow: /appointments/ 
Disallow: /consultas/ 
Disallow: /ws/Schedules.asmx/ 
Disallow: /RESOURCE NOT FOUND/ 
Disallow: /RESOURCE+NOT+FOUND/ 
Disallow: /RESOURCE%20NOT%20FOUND/ 
Disallow: /entities/ 

Es gibt keine User-Agent-Beschränkung und was Sie kratzen nicht nicht erlaubt ist

2

Wie Sie sehen können, wenn Sie verwenden Google Chrome Dev Tools auf der Registerkarte "Netzwerk" sendet eine POST-Anfrage an http://www.doctoralia.com.br/noindex/doctor-phone. Diese POST-Anfrage ist gegen CSRF geschützt, daher wird es sehr schwierig sein, diese Anfrage zu fälschen, um die Daten zu erhalten.

Seit BeautifulSoup ist ein HTML-Parser . Sie können nicht wirklich mit der Webseite interagieren. Wenn Sie wirklich die Daten bekommen wollen. Sie sollten ein Tool wie selenium verwenden, das einen echten Browser emuliert.

Beachten Sie jedoch, dass die Daten nicht nur zur Umgehung geschützt sind. Sie möchten wahrscheinlich nicht, dass die Daten gekratzt werden, und es könnte illegal sein, dies zu tun.

+0

große Antwort ... kurz und prägnant noch deckt alle Fragen – charlietfl

Verwandte Themen