这是我要抓的链接: 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()”函数来抓取网页?
答案 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
或您喜欢的任何内容来解析结果。