2013-05-07 4 views
7

Dies ist der Link, den ich kratzen will: http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_UNeuling: Wie man Javascript "Onclick" Knopf überwinden, um Webseite zu kratzen?

Die „Deutsche Version“ -Reiter am oberen Ecke der rechten Hand ist, um die englische Version der Web-Seite zu zeigen.

Es gibt eine Schaltfläche, die ich drücken muss, um die Geldmittelinformationen auf der Webseite zu lesen. Ist dies nicht der Fall, wird die Ansicht blockiert, und die Verwendung von scrapy shell führt immer zu einem leeren [].

<div onclick="AgreeClick()" style="width:200px; padding:8px; border:1px black solid; 
background-color:#cccccc; cursor:pointer;">Confirmed</div> 

Und die Funktion von AgreeClick ist:

function AgreeClick() { 
var cookieKey = "ListFundShowDisclaimer"; 
SetCookie(cookieKey, "true", null); 
Get("disclaimerDiv").style.display = "none"; 
Get("blankDiv").style.display = "none"; 
Get("screenDiv").style.display = "none"; 
//Get("contentTable").style.display = "block"; 
ShowDropDown(); 

Wie überwinden ich diesen Onclick = "AgreeClick()" Funktion, um die Web-Seite zu kratzen?

Antwort

4

Sie können nicht einfach auf den Link innerhalb von scrapy klicken (siehe Click a Button in Scrapy).

Zuerst, überprüfen Sie, ob die Daten, die Sie benötigen, bereits da sind - in der HTML (es ist im Hintergrund - so ist es da).

Eine weitere Option ist selenium:

from selenium import webdriver 
import time 

browser = webdriver.Firefox() 
browser.get("http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_U") 

elem = browser.find_element_by_xpath('//*[@id="disclaimer"]/div/div') 
elem.click() 
time.sleep(0.2) 

elem = browser.find_element_by_xpath("//*") 
print elem.get_attribute("outerHTML") 

Eine weitere Option ist mechanize zu verwenden. Es kann den js-Code nicht ausführen, aber AgreeClick setzt gemäß dem Quellcode nur den Cookie ListFundShowDisclaimer auf true. Dies ist ein Ausgangspunkt (nicht sicher, ob es funktioniert):

import cookielib 
import mechanize 

br = mechanize.Browser() 

cj = cookielib.CookieJar() 
ck = cookielib.Cookie(version=0, name='ListFundShowDisclaimer', value='true', port=None, port_specified=False, 
         domain='www.prudential.com.hk', domain_specified=False, domain_initial_dot=False, path='/', 
         path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, 
         rest={'HttpOnly': None}, rfc2109=False) 
cj.set_cookie(ck) 
br.set_cookiejar(cj) 

br.open("http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_U") 
print br.response().read() 

Dann können Sie das Ergebnis mit BeautifulSoup analysieren oder was auch immer Sie bevorzugen.

+0

Haben Sie auch eine Lösung in Requests? Ich verwende Anfragen und ich muss dies tun. – Shaardool

4

Verwenden Sie die Bibliothek spynner für Python, um einen Browser zu emulieren und das clientseitige JavaScript auszuführen.

Wie Sie sehen können, können Sie jede JavaScript-Funktion in der Quelle der Seite programmgesteuert aufrufen.

Wenn Sie auch Ergebnisse analysieren müssen, empfehle ich BeautifulSoup.