我必须按下一个按钮才能读取网页上的资金信息。否则,视图将被阻塞,并且使用刮板外壳始终会导致为空[]。
<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()”函数来抓取网页?
首先,检查所需的数据是否已经存在-在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。这是一个起点(不确定是否可行):
mechanize
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或任何你喜欢的内容解析结果。
BeautifulSoup
使用适用于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。