【问题标题】:Newbie: How to overcome Javascript "onclick" button to scrape web page?新手:如何克服Javascript“onclick”按钮来抓取网页?
【发布时间】:2013-05-01 12:38:05
【问题描述】:

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

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    你不能只点击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只是将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 中也有解决方案吗?我正在使用请求,我需要这样做。
    【解决方案2】:

    使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2012-05-11
      • 2011-07-30
      • 1970-01-01
      相关资源
      最近更新 更多