Python 3,Web抓取和Javascript [哦我的]

时间:2012-08-03 23:20:26

标签: javascript python python-3.x web-scraping

我已经到了使用Javascript和Python3进入网络抓取网页的混战。我很清楚我的靴子可能正在与一匹死马接触,但无论如何我觉得我还要画六枪。这是意大利面西部;是我的灰帽子?

::背景故事::

我正在使用Python 3.2.3。

我有兴趣为用户定义的股票收集YTD,1年,3年,5年10年的历史股票/ etf // mutual_fund价格数据......和/或类似的时间框架, etf,或共同基金。我在Morningstar.com上设置我的网站,因为他们倾向于提供尽可能多的数据而不一定需要登录;其他人,例如finance.google.com& c,他们提供的关于股票与etfs和共同基金的数据往往不一致。

使用Morningstar获取此历史数据或称为“尾随总回报”的权衡,就是为了生成这些数据,他们使用Javascript。

以下是Morningstar的一些示例链接:

A Mutual Fund;

An ETF;

A Stock.

我感兴趣的是“追踪退货”部分,Javascript制作图表中数字的顶行左右。

::试图到目前为止

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

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

::我听说过...... ::

- >硒。但是,我的理解是,这需要Thy Favorite Browser实际打开一个网页,导航,然后不关闭,因为Selenium没有“关闭此选项卡//窗口”命令//选项。如果我// my_user想要​​获得许多etfs,股票和/或共同基金的历史数据怎么办?这是很多标签//窗口在浏览器中打开,不一定要打开。

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

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

- >风车。见'Selenium'。然而,我非常关键地唱“拉曼查人”。

- > Google的webscraping代码。试图下载一个载满Javascript的页面会导致......积极的结果吗?

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

::我的问题::

任何建议,指示,解决方案或“查看此处”指示?

非常感谢,

Miles,Dusty Desert Villager。

1 个答案:

答案 0 :(得分:11)

当页面通过javascript加载数据时,它必须向服务器发出请求以通过XMLHttpRequest函数(XHR)获取该数据。你可以看到他们正在做什么,然后使用wget!

自己制作

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

扳手/工具/开发人员工具/网络(工具顶部的标签)/底部的XHR过滤器。

Here's an example request they make in javascript

如果仔细查看XHR请求网址,您会注意到所有跟踪返回的格式都相同:

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并直接解析数据。