4

我已经到了使用 Javascript 和 Python3 在网络抓取网页上进入混战的地步。我很清楚我的靴子可能会碰到一匹死马,但无论如何我还是想画出我的六射手。这是一部意大利式西部片;做我的灰帽子?

::背景故事::

我正在使用 Python 3.2.3。

我有兴趣收集 YTD、1 年、3 年、5 年 10 年......和/或用户定义的股票、etf 或共同基金。我将我的网站设置在 Morningstar.com 上,因为它们倾向于提供尽可能多的数据,而无需登录;Finance.google.com &c 等其他人在他们提供的关于股票、etfs 和共同基金的数据方面往往不一致。

使用晨星来获取这些历史数据,或者他们称之为“追踪总回报”的权衡是,为了生成这些数据,他们使用了 Javascript。

以下是晨星的一些示例链接:

共同基金;

ETF;

股票。

我对 Javascript 生成的图表中的“尾随回报”部分、顶行左右的数字感兴趣。

::到目前为止尝试过::

我已经确认 wget 不能使用 Javascript;即使下载所有相关文件 [css, .js, &c] 也不允许我在浏览器或脚本中本地呈现 javascript。StackOverflow 上的研究证实了这一点。我愿意在这里纠正。

我的研究告诉我,Python3 不存在 Mechanize。无论如何我都试过了,然后变成了警察沙威,大声喊道:“我知道!” 在错误消息“模块不存在”。

::我听说过...::

->硒。但是,我的理解是,这需要你最喜欢的浏览器实际打开一个网页,四处导航,然后不关闭,因为 Selenium 没有“关闭此选项卡//窗口”命令//选项。如果我//my_user 想要获取许多 etf、股票和/或共同基金的历史数据怎么办?这是在浏览器中打开的很多选项卡//窗口,不一定希望打开。

->httplib2. 我认为这很好,但我怀疑它是否会与 Javascript 一起使用。例如,是否使用 .cache 和 get 选项?

import httplib2
conn = httplib2.Http(".cache")
page = conn.request(u"http://the_url","GET")

- >风车。见“硒”。然而,我唱得不够调调,无法唱“Man of La Mancha”。

->谷歌的网页抓取代码。尝试下载包含 Javascript 的页面会导致...积极的结果吗?

我读过关于必须“在没有浏览器的情况下模拟浏览器”的喋喋不休。听起来像机械化,但不是我目前理解的 Python3。

::我的问题::

有任何建议、指示、解决方案或“看这里”的指示吗?

非常感谢,

迈尔斯,尘土飞扬的沙漠村民。

4

1 回答 1

11

当页面通过 javascript 加载数据时,它必须向服务器发出请求以通过 XMLHttpRequest 函数 (XHR) 获取该数据。您可以查看他们提出的请求,然后使用 wget 自己提出请求!

要找出他们发出的请求,请使用 Web Inspector(Chrome 和 Safari)或 Firebug (Firefox)。以下是在 Chrome 中执行此操作的方法:

扳手/工具/开发者工具/网络(工具顶部的选项卡)/底部的 XHR 过滤器。

这是他们在 javascript 中提出的示例请求

如果您仔细查看 XHR 请求 url,您会注意到所有尾随返回具有相同的格式:

http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=

您只需要指定t. 例如:

http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=VAW http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=INTC http://performance.morningstar.com/Performance/cef/trailing-total-returns.action?t=VHCOX

现在您可以wget直接解析这些 URI 并解析出数据。

于 2012-08-03T23:26:26.313 回答