新手:如何克服Javascript“onclick”按钮刮网页?

时间:2013-05-07 14:04:25

标签: python web-scraping scrapy

这是我要抓的链接: 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()”函数来抓取网页?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ListFundShowDisclaimer设置为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或您喜欢的任何内容来解析结果。