我正在尝试使用网络爬虫来保存几个网页。通常我更喜欢使用 perl 的 WWW::Mechanize
模块。然而,据我所知,我试图抓取的网站上有许多似乎很难避免的 javascript。因此我研究了以下 perl 模块
火狐 MozRepl extension本身完美无缺。理论上,我可以按照开发人员教程中显示的方式使用终端浏览网站。但是,我对 javascript 一无所知,因此很难正确使用这些模块。
所以我喜欢从这里开始:Morgan Stanley
对于“公司 - 截至 2011 年 10 月 14 日”下的几家上市公司,我想保存它们各自的页面。例如。单击第一个上市公司(即“1-800-Flowers.com, Inc”),将使用两个参数调用 javascript 函数 -> dtxt('FLWS.O','2011-10-14')
,生成所需的新页面。我现在喜欢保存在本地的页面。
对于 perl 的 MozRepl
模块,我想到了这样的事情:
use strict;
use warnings;
use MozRepl;
my $repl = MozRepl->new;
$repl->setup;
$repl->execute('window.open("http://www.morganstanley.com/eqr/disclosures/webapp/coverage")');
$repl->repl_enter({ source => "content" });
$repl->execute('dtxt("FLWS.O", "2011-10-14")');
现在我想保存生成的 HTML 页面。
因此,我想生成的所需代码应该访问几家公司的 HTML 站点并简单地保存网页。 (这里有例如三个公司:MMM.N、FLWS.O、SSRX.O)
- 是否正确,我无法绕过页面的 javascript 函数,因此无法使用
WWW::Mechanize
? - 在问题 1 之后,提到的 perl 模块是否是一种可行的方法?
- 最后,如果您说前两个问题可以回答"is",那么如果您能帮我解决实际编码问题,那就太好了。例如。在上面的代码中,缺少的重要部分是
'save'-command
。 (也许使用 Firefox 的saveDocument
功能?)
最佳答案
网络通过 HTTP 请求和响应工作。
如果您能找到合适的请求发送,那么您就会得到合适的响应。
如果目标站点使用JS构成请求,那么你可以执行JS, 或分析它的作用,以便您可以用您正在使用的语言做同样的事情。
一个更简单的方法是使用一个工具,它会为您捕获结果请求,无论该请求是否由 JS 创建,然后您就可以编写您的抓取代码 创建您想要的请求。
AT&T的“Web Scraping Proxy”就是这样一个工具。
您设置好它,然后正常浏览网站以到达您想要抓取的页面, WSP 将为您记录所有请求和响应。
它以 Perl 代码的形式记录它们,然后您可以对其进行修改以满足您的需要。
关于javascript - 网络爬虫 : Using Perl's MozRepl module to deal with Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765537/