9

这是我要抓取的链接:http: //www.prudential.com.hk/PruServlet? module=fund& purpose=searchHistFund&fundCd=MMFU_U

“英文版”选项卡位于右上角,以显示网页的英文版。

我必须按下一个按钮才能阅读网页上的资金信息。如果不是,则视图被阻塞,并且使用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

2 回答 2

4

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

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

另一种选择是

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然后,您可以使用或任何您喜欢的方式解析结果。

于 2013-05-07T18:59:38.627 回答
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

于 2013-05-07T14:15:35.890 回答