2012-08-03 64 views
4

我已经到了使用Javascript和Python3进入网页抓取网页的混战时刻。我很清楚,我的靴子可能会与一匹死马接触,但我仍然想要画出我的六射手。这是西方的意大利面条;成为我的灰色帽子?Python 3,网络抓取和Javascript [Oh My]

::背景故事::

我使用Python 3.2.3。

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

使用晨星作为这一历史数据的权衡,或称之为“追踪总收益”,就是为了生成这些数据,他们使用Javascript。

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

A Mutual Fund;

An ETF;

A Stock.

我感兴趣 “后返回” 部分,上排左右的号码中Javascript制作的图表。

::试图到目前为止::

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

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

::我听说过... ::

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

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

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

- >风车。参见'Selenium'。然而,我却不够关键唱“拉曼恰之人”。

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

我读过关于必须“不使用浏览器模拟浏览器”的喋喋不休的问题。听起来像机械化,但不是我目前所了解的Python3。

::我的问题::

任何建议,指针,解决方案,或者 “看过来” 的方向?

非常感谢,

Miles,Dusty Desert Villager。

+0

通过使用没有任何会话cookie检查的Ajax请求,至少过滤来自其他域的请求,他们使用JavaScript做基本上使你的工作真的很容易。 – 2012-08-03 23:52:49

回答

11

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

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

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

Here's an example request they make in 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并直接解析出数据。

+3

我需要停止点嫖娼。这对于原来的答案的评论基本上是正确的:“Chrome使得查看XHR请求非常容易。”开发人员工具(扳手或右键单击/检查元素)/网络(选项卡在工具)/底部的XHR过滤器。“ – 2012-08-03 23:42:02

+1

通过XHR,他意味着来自JS的http请求。或者Ajax,如果你必须。 (我宁愿我们没有)。所有你必须刮的是桌子和JSON。不错。 – 2012-08-03 23:47:44

+1

谢谢Erik! :)我会修改我的答案,以便更清楚。以前在Chrome中没有使用过开发工具的人不太容易理解。 – 2012-08-03 23:49:42