我正试图在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中返回的正确数据。我已经看了一段时间,但仍无法找到获取数据的方法。帮助
答案 0 :(得分:3)
您正在尝试使用curl来抓取一个支持Ajax的html页面。
由于原始页面达到某个状态(从服务器获取会话,cookie等),然后进行ajax调用,这是雄心勃勃的。
您需要完全模仿页面正在执行的操作。
例如,该呼叫既发送会话ID 的Cookie,又发送相同的会话ID作为其发布参数之一。 - 因此,您需要查看传入的cookie值才能正确创建传出的Post参数。我不知道如何使用curl来做到这一点。
我建议您在处理此网站时可能需要使用Perl Mechanize或其他更强大的抓取系统。
另请注意,服务器将您想要的数据作为JS片段返回,不是作为JSON。因此,一旦您能够说服服务器将其提供给您,您就需要解析回复。
补充:当您看到原始页面与模拟它之间的差异时,除了Wireshark之外,您可能还想尝试使用Firebug和Fiddler中的Net选项卡。
一个有价值的项目......
添加以回应关于Perl Mechanize不支持Javascript的评论:
你不需要你的抓取程序来做Javascript。您需要程序模拟HTML页面与服务器的交互。如果您的程序向服务器发送与在浏览器中运行时真正的html页面完全相同的位,那么服务器将使用您想要的数据进行响应。
由于它没有响应数据,因此您不会发送相同的位。
您应该首先完全模拟浏览器。例如,在您的请求中发送相同的标头,包括用户代理,接受和其他标头。服务器可能正在检查这些。