2016-04-18 10 views
2

Ich versuche, einige Informationen von einer bestimmten URL zu kratzen. Nennen wir es: www.foo.bar/bazBeautifulSoup: scrape HTML nur zugänglich nach dem Klicken auf "Akzeptieren" in der gleichen URL

Wenn Sie auf diese URL mit einem Webbrowser zugreifen, wird die übliche Schaltfläche "Ich bin älter als 18" angezeigt. Die URL ändert sich nicht und der echte Inhalt wird nur geladen, wenn Sie die Schaltfläche manuell anklicken.

Ich würde gerne "simulieren", dass klicken Sie auf die Schaltfläche "Ich bin älter als 18", um auf die Informationen zugreifen zu können, die ich wirklich kratzen möchte.

Dies ist der HTML-Code der Taste, die angeklickt werden soll:

<div align=center> 
    <a href="javascript:showContent()"><span>ENTRAR</span></a> 
</div> 

Und dies ist die JavaScript-Funktion, die durch das href Attribut aufgerufen wird:

<script type="text/javascript"><!-- 
function showContent() { 
    document.getElementById('all-content').style.display = ''; 
    document.getElementById('adultmessage').style.display = 'none'; 
    document.cookie = 'adult=yes; path=/'; 
} 
function hideAdultContent(){ 
    document.getElementById('all-content').style.display = 'none'; 
} 
// --></script> 

irgendwelche Tipps würde ich mich freuen darauf, was zu erforschen, um dies zu tun.

+1

können Sie den Link teilen? –

+1

@ Xar, wie Padraic sagte. Selen ist Ihre beste Wahl. Sehen Sie sich das Framework [slack] (https://github.com/Wykleph/Slack) an, da es Ihnen helfen kann, die Dinge organisiert zu halten. – DuckPuncher

+0

@PadraicCunningham die URL ist http://www.pasion.com/amistad/ Sie müssen auf "Entrar" klicken, um auf den echten Inhalt zuzugreifen. – Xar

Antwort

3

Sie können nicht interagieren mit Javascript BeautifulSoup verwenden, können Sie Selen verwenden, das Element zu klicken, um es mit PhantomJS für Headless-Browsing:

from selenium import webdriver 

dr = webdriver.PhantomJS() 

dr.get("www.foo.bar/baz") 

dr.find_element_by_xpath("//a[@href='javascript:showContent()']").click() 

XPath das Element finden, dann simulieren wir einen Klick welche geben sollte du, was du brauchst.

Die Seite nehme ich an in Spanisch ist so die href ist eigentlich javascript:muestradulto():

dr.find_element_by_xpath("//a[@href='javascript:muestradulto()']").click() 

Sobald der Link angeklickt wird und Sie print(dr.page_source), Sie werden sehen, Sie auf der nächsten Seite erhalten, die EL BUSCANUNCIOS in der Nähe der Spitze hat:

In [1]: url = "http://www.pasion.com/amistad/" 

In [2]: from selenium import webdriver 

In [3]: dr = webdriver.PhantomJS() 

In [4]: dr.get(url) 

In [5]: dr.find_element_by_xpath("//a[@href='javascript:muestradulto()']").click() 

In [6]: print("EL BUSCANUNCIOS" in dr.page_source) 
True 

Wenn Sie es vorziehen BS4 verwenden Sie die Quelle zu BeautifulSoup passieren kann und die Arbeit an, dass weg, aber Selen können Sie XPath und eine viel größere Auswahl an CSS-Selektoren, die Sie mehr nützlich finden könnten.

Eigentlich, wenn man sich anschaut, was die Seite zurückkehrt, die Sie tatsächlich den Quellcode erhalten nur Anfragen verwenden, die Verbindung muss nur auf der Webseite angeklickt werden:

In [14]: from requests import get 

In [14]: from bs4 import BeautifulSoup 

In [15]: soup = BeautifulSoup(get(url).content) 

In [16]: print(soup.select("#cuerpo div[class^=x]")[:2]) 
[<div class="x1"><div class="x2">\n<div class="x3"></div>\n<div class="x4">Amistad en Barcelona i rodalies (BARCELONA)</div>\n<div class="x5">r508491244 </div>\n<div class="x6" style="font-size:8px"><a href="/creditos/auto-renueva.php" style="color:#ee0000">AUTO\xb7RENUEVA</a></div>\n</div>\n<div class="x9"><a class="cti" href="para-mujer-busque-amistad-508491244.htm" target="_blank">PARA MUJER BUSQUE AMISTAD</a><br/><div class="tx"> Deseo coincidir con una mujer que busque una relaci\xf3n de amistad continuada con un hombre maduro, tranquilo, educado, cari\xf1oso y de trato f\xe1cil. No tengo pareja y ahora no la busco. Busco una amiga para pasear, hablar, echar unas risas, caf\xe9s, cines, conciertos, etc. No me importa para nada la talla de suje ni de pantal\xf3n que usas, ni tu edad, ni tampoco si tienes eso que ahora se llaman cargas. Soy un tipo normal y busco lo mismo. Si necesitas algo m\xe1s, tambi\xe9n lo podemos hablar. Con afecto. Dani. Edad 54 a\xf1os</div><br/> <div class="x11">\n</div>\n</div>\n<div class="x10" id="ph508491244" style="width: auto">\n</div></div>, <div class="x2">\n<div class="x3"></div>\n<div class="x4">Amistad en Barcelona i rodalies (BARCELONA)</div>\n<div class="x5">r508491244 </div>\n<div class="x6" style="font-size:8px"><a href="/creditos/auto-renueva.php" style="color:#ee0000">AUTO\xb7RENUEVA</a></div>\n</div>] 

Also eigentlich brauchen Sie nicht zu sich darum kümmern, irgendetwas anzuklicken.

+0

Vielen Dank Padraic! Tolle Erklärung! Nur noch eine kleine Frage: Woher bekommst du die "Get" -Methode? Was muss ich importieren? In Ihrer Zeile 15 bekomme ich die 'NameError: Name 'get' ist nicht definiert 'Fehlermeldung. – Xar

+1

Entschuldigung, bedeutete, Paste, die in, sollte ein 'von Anfragen Import Get ' –

+0

Danke noch einmal zu kopieren! – Xar

Verwandte Themen