【问题标题】:Python 3, Web-scraping, and Javascript [Oh My]Python 3、网页抓取和 Javascript [Oh My]
【发布时间】:2012-08-02 00:29:03
【问题描述】:

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

::Backstory::

我正在使用 Python 3.2.3。

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

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

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

A Mutual Fund;

An ETF;

A Stock.

我对 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")

->风车。见“硒”。然而,我唱“拉曼查人”的调子不够调。

->Google 的webscraping 代码。尝试下载包含 Javascript 的页面会导致...积极的结果吗?

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

::我的问题::

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

非常感谢,

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

【问题讨论】:

  • 通过使用 Ajax 请求而不进行任何类型的会话 cookie 检查来至少过滤来自其他域的请求,他们使用 JavaScript 基本上使您的工作变得非常非常容易。

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


【解决方案1】:

当页面通过 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 并直接解析出数据。

【讨论】:

  • 我需要停止卖淫。这可以更好地作为对基本上正确的原始答案的评论:“Chrome 可以很容易地查看 XHR 请求。开发人员工具(扳手或右键单击/检查元素)/网络(顶部的选项卡)工具)/XHR 过滤器在底部。”
  • XHR 指的是直接来自 JS 的 http 请求。如果需要,也可以使用 Ajax。 (我宁愿我们没有)。您只需要抓取表格和 JSON。还不错。
  • 谢谢埃里克! :) 我会修改我的答案以更清楚。对于之前没有在 Chrome 中使用过开发工具的人来说,这不是很容易理解。
  • 非常感谢赛普拉斯,这让我很生气。我会试一试 XD
  • ... 以及有关 Firebug 和类似产品的精彩提示;我能够以相同//相似的结果遵循这种方法。再次,非常感谢。
猜你喜欢
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多