【问题标题】:Problem with Curl fetching Ajax DataCurl 获取 Ajax 数据的问题
【发布时间】:2010-08-18 22:15:00
【问题描述】:

我正在尝试在this page 上获取“已添加的联系人”:

数据是通过 Ajax 调用注入的,我使用 Wireshark 来捕获我认为获取数据的调用:

POST /dwr/call/plaincall/UserActionAPI.getRecentlyTitleChangedContacts.dwr HTTP/1.1

这发布了一堆变量和一个 cookie,所以我使用以下字符串进行了 curl 调用:

curl -b "cookiejar.txt" -v -e "http://www.jigsaw.com/showContactUpdateTab.xhtml?companyId=212324" \
    -F "type=text/plain&callCount=1&page=/showContactUpdateTab.xhtml?companyId=212324&httpSessionId=9CDBDA38B4F0C2A84622B523E79C0C38&scriptSessionId=784885169D0457ECDCA26FEF7B6DD7CF305&c0-scriptName=UserActionAPI&c0-methodName=getRecentlyAddedContacts&c0-id=0&c0-param0=number:212324&c0-param1=boolean:false&c0-param2=boolean:false&batchId=0" \
    "http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyAddedContacts.dwr"

但它总是返回 what looks like more JS script,即使我可以看到 Wireshark 中返回的正确数据。我已经研究了一段时间,但仍然无法找到获取数据的方法。帮忙?

【问题讨论】:

    标签: javascript ajax perl curl


    【解决方案1】:

    您正在尝试使用 curl 抓取 Ajax 驱动的 html 页面。

    这是雄心勃勃的,因为原始页面正在达到某种状态(从服务器、cookie 等获取会话),然后进行 ajax 调用。

    您需要准确地模仿页面在做什么。

    例如,调用同时发送带有会话 ID 的 cookie发送 same 会话 ID 作为其发布参数之一。 -- 所以你需要查看传入的 cookie 值才能正确创建传出的 Post 参数。我不知道你会如何只使用 curl 来做到这一点。

    我建议您在处理此网站时可能需要使用 Perl Mechanize 或其他功能更强大的抓取系统。

    另请注意,服务器将您想要的数据作为 JS 片段返回,而不是作为 JSON。因此,一旦您能够说服服务器将其提供给您,您就需要解析回复。

    补充:当看到原始页面与您的模拟页面之间的差异时,您可能想尝试 Firebug 和 Fiddler 中的 Net 选项卡以及 Wireshark。

    一个有价值的项目...

    添加以回应有关 Perl Mechanize 不支持 Javascript 的评论:

    您确实不需要需要您的抓取程序来执行 Javascript。您需要您的程序模拟 HTML 页面与服务器的交互。如果您的程序在浏览器中运行时向服务器发送与真正的 html 页面完全相同的位,那么服务器将响应您想要的数据。

    由于它没有响应数据,因此您发送的位不同。

    您应该从完全模拟浏览器开始。例如,在您的请求中发送相同的标头,包括用户代理、接受和其他标头。服务器可能正在检查这些。

    【讨论】:

    • WWW::Mechanize perl 包不支持 Javascript。是的,我必须解析数据,这不是问题。在 Firefox 中,不同之处在于 Firefox 获取数据而 curl 没有。我用 Chrome 打开了页面,然后更改了用户代理、会话 ID 并复制了 cookie 以进行 Curl 调用,结果相同。必须有一些 Perl 模块才能正确执行此操作?我的意思是,我想做的就是运行 Javascript,然后刷新 DOM,对吧?
    • 我添加到答案中,见上文。由于您正在尝试抓取服务器,因此您的客户端上没有 dom。您正在模拟浏览器,您的软件不是浏览器。在浏览器中打开会话,然后尝试在 curl 中完成会话通常不会起作用,因为您将使用不同的 TCP 连接进入服务器——服务器将为您生成一个新会话。您的客户端需要模拟与服务器的整个对话。
    猜你喜欢
    • 2013-10-08
    • 2020-02-10
    • 1970-01-01
    • 2011-04-25
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多