新手:如何克服JavaScript中的“onclick”按钮以爬取网页?

10

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

为了显示网页的英文版本,请在右上角点击“English Version”标签。

网页上还有一个按钮,需要按下才能查看基金信息。如果没有按下,网页将被阻止,使用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()"函数以便网页可以被抓取?

2个回答

5

您不能仅仅在scrapy中点击链接(参见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。它不能执行JavaScript代码,但是根据源代码,AgreeClick只是将cookieListFundShowDisclaimer设置为true。这是一个起点(不确定是否有效):

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或其他您喜欢的工具来解析结果。

你是否也有Requests的解决方案?我正在使用Requests,需要做这件事。 - Shaardool

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接