2013-05-07 38 views
7

这是我想刮链接: http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_U新手:如何克服Javascript“onclick”按钮来抓取网页?

“英国版”标签是在右上角,以显示该网页的英文版本。

有一个按钮,我必须按顺序阅读网页上的资金信息按。如果没有,视图被阻塞,并且使用scrapy shell总是导致空[]。

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

而且AgreeClick的功能是:

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(); 

如何克服这个的onclick = “AgreeClick()” 函数凑网页?

回答

4

您不能只点击scrapy内的链接(请参阅Click a Button in Scrapy)。

首先,检查你需要的数据是否已经存在 - 在html中(它在后台 - 所以它在那里)。

另一种选择是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") 

还有一个选择是使用mechanize。它不能执行js代码,但是,根据源代码,AgreeClick只是设置cookie ListFundShowDisclaimertrue。这是一个起点(不知道它的工作原理):

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() 

然后,您可以用BeautifulSoup或任何你喜欢的解析结果。

+0

你是否也有请求解决方案?我正在使用请求,我需要这样做。 – Shaardool 2015-06-09 17:13:50

4

使用Python的spynner库模拟浏览器并执行客户端JavaScript。

import spynner 

browser = spynner.Browser() 
url = "http://www.prudential.com/path/?args=values" 

browser.load(url) 

browser.runjs("AgreeClick();") 

markup = browser._get_html() 

正如你所看到的,你可以调用在页面的源代码编程提供任何JavaScript函数。

如果您还需要解析结果,我强烈建议BeautifulSoup