2011-09-20 56 views
1

我已经做过网络抓取,但它从来没有这么复杂。我想从学校网站上获取课程信息。然而,所有的课程信息都显示在网络刮板的噩梦中。如何抓取网站内容(* COMPLEX * iframe,javascript提交)

首先,当你点击“Schedule of Classes”网址时,它会首先引导你浏览其他几个页面(我相信设置cookie和检查其他废话)。

然后,它终于加载了一个页面,该页面显然只在从机构的网页(如arizona.edu)加载时才喜欢加载。

从那里表单提交必须通过实际上没有重新加载页面的按钮,但只提交一个AJAX查询,我认为它只是操纵iframe。

这个查询对我来说很难复制。我一直使用PHP和curl模拟浏览器访问初始页面,收集适当的cookie等。但我认为我的curl函数发送的头文件有问题,因为它在初始“搜索表单”加载后从不让我执行任何类型的查询。

任何帮助将是真棒......

http://www.arizona.edu/students/registering-classes - >

或者只是在这里 “课程表”: http://schedule.arizona.edu/

+0

网站刮气味。如果他们没有API来提供他们的数据,他们不想被刮掉 –

+0

@ Col.Shrapnel那么我需要这些数据。我怀疑他们设置这个系统以避免被刮伤。这是他们实施管理整个学术界的一个更大系统的一部分。顾问们使用这个系统来批准学生上课等,我不是在试图阻止顾问刮蹭。这是他们选择使用的预制系统,这是我见过的最笨重的东西。 我计划开发一个应用程序来帮助学生,如果应用程序有任何动力,我会直接接近学校,并说嘿...给我API,所以我可以轻松地做到这一点。 – Rawr

回答

3

如果您需要刮网站重JS/AJAX的使用 - 你需要的东西比PHP更强大;)

首先 - 它必须是完整的浏览器有能力执行JS,二 - 必须有一些API用于自动浏览。

假设你是一个孩子(还有谁需要解析一所学校) - 试试Firefox iMacros。如果你是经验丰富的老将 - 看看Selenium。

+0

呃所以现在我实际上不得不把家用电脑专用于这项操作?除非我真的得到一个专用服务器,否则我希望有一些解决方案可以作为网站cron工作的一部分轻松实现。 – Rawr

+0

你可以在服务器上运行firefox/iceweasel。在本演示中检查第70-72页。 http://www.defcon.org/images/defcon-17/dc-17-presentations/defcon-17-michael_shrenk-screen_scraper_tricks.pdf – c69

+0

这是很有帮助的先生,即使我怀疑我可能需要一个专用的服务器或一个用于安装iMacros的虚拟服务器。这一切都非常有帮助,因为这可能必须是我最终走向的方式。殴打某人发布网址到一些像梦一样工作的PHP代码,这正是我所期待的。 – Rawr

0

你肯定你被允许刮网站?

如果是,那么他们可以给你一个简单的REST API?

在极少数情况下,当他们允许您访问数据但不提供API时,我的建议是安装一些软件来记录您与网站的HTTP交互,可能是wireshark或某些HTTP代理,但记录所有http请求的详细信息非常重要。完成之后,对其进行分析,然后尝试将其重放到最新的位置。

在可能的杂事中,可能在某些时间点,服务器向您发送生成的JavaScript,需要由客户端浏览器执行以便进入下一步。在这种情况下,您需要计算如何解析收到的JavaScript,并找出如何移动。

一个好主意并不是在爆发模式下激发所有的http请求,而是放置一些随机延迟,以便服务器看起来更像“人”。

但最后你需要弄清楚这是否值得这么麻烦?由于几乎任何刮板的路段都可以解决,但它可能会相当耗费时间。

+0

有一个显示课程状态的UofA Android应用程序。也许我会从那里开始。它在收集信息时有一些API函数。再一次,我非常怀疑他们的系统的目的是避免被刮伤。不过,我怀疑他们会实施一些功能来满足我的需求。我可能可以访问UofA应用程序使用的信息。你知道任何可以跟踪Android应用程序的网页查询的Windows应用程序吗? – Rawr

+0

嗯,请尝试下载android sdk和模拟器,并运行它下面的应用程序。由于模拟器充当http代理,因此很可能它也提供日志记录。 –

3

我过去用很多与JS,iframes和各种东西的页面。我用PhantomJS作为无头浏览器,后来我用PhantomCurl包装。该包装是一个python脚本,可以从命令行运行或作为模块导入