小编典典

如何克服Javascript的“ onclick”按钮来抓取网页?

scrapy

我必须按下一个按钮才能读取网页上的资金信息。否则,视图将被阻塞,并且使用刮板外壳始终会导致为空[]。

<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()”函数来抓取网页?


阅读 672

收藏
2020-04-10

共2个答案

小编典典

首先,检查所需的数据是否已经存在-在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或任何你喜欢的内容解析结果。

2020-04-10
小编典典

使用适用于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。

2020-04-10