使用Python从基于AJAX的站点提取信息

时间:2011-11-10 18:46:11

标签: python ajax data-mining

我正在尝试使用Python在基于ajax的网站上检索查询结果,例如www.snapbird.org。由于它没有显示在页面源中,我不知道如何继续。 我是一个Python新手,因此如果我能在正确的方向上获得一个指针就会很棒。 如果这更容易,我也愿意接受其他任务。

4 个答案:

答案 0 :(得分:0)

这将是复杂的,但作为一个开始,ppen firebug并找到在处理AJAX请求时调用的URL。您可以直接在Python程序中调用它并解析输出。

答案 1 :(得分:0)

您可以使用Selenium的Python client driver来解析页面源代码。我通常将此与PyQuery结合使用,以便更轻松地进行网页抓取。

这是basic tutorial for Selenium's Python driver。请务必按照Selenium版本 2 而非版本1的说明进行操作(除非您出于某种原因使用版本1)。

答案 2 :(得分:0)

您还可以将chrome / firefox配置为HTTP代理,然后使用代理记录/提取必要的内容。我已经使用python代理修改了基于内容类型或URI globs保存/记录请求/内容。

对于其他项目,我编写了特定于网站的javascript bookmarklet,用于轮询新数据,然后将其发布到我的服务器(通过动态创建表单和iframe,并设置myform.target=myiframe;

其他javascript脚本/ bookmarklet模拟用户与网站交互,因此,不是每隔几秒轮询javascript就会自动点击按钮和表单提交等。这些脚本当然总是特定于站点,但它们非常有用对我来说,特别是在迭代给定搜索的所有分页结果时。

这是一个精简的版本,遍历“分页”结果列表并准备将数据发送到我的服务器(然后使用BeautifulSoup进一步解析它)。特别是这是为Youtube的发送/收件箱消息而设计的。

var tables = [];
function process_and_repeat(){
    if(!(inbox && inbox.message_pane_ && inbox.message_pane_.innerHTML)){
        alert("We've got no data!");
    }
    if(inbox.message_pane_.innerHTML.indexOf('<table') === 0)
    {
        tables.push(inbox.message_pane_.innerHTML);
        inbox.next_page();
        setTimeout("process_and_repeat()",3000);
    }
    else{
        alert("Fininshed, [" + tables.length + " processed]");
        document.write('<form action=http://curl.sente.cc method=POST><textarea name=sent.html>'+escape(tables.join('\n'))+'</textarea><input type=submit></form>')
    }
}

process_and_repeat();  // now we wait and watch as all the paginated pages are viewed :)

这是一个精简的例子,没有任何花哨的iframes / non-essentials,只会增加复杂性。

除了Liam所说的,Selenium也是一个很好的工具,它有助于我的各种刮擦需求。如果你愿意,我会非常乐意帮助你。

答案 3 :(得分:0)

一个简单的解决方案可能是使用像Mechanize这样的浏览器。因此,您可以浏览网站,关注链接,进行搜索以及使用具有用户界面的浏览器执行的几乎所有操作。

但是对于一个非常特殊的工作,你可能甚至不需要这样的库,你可以使用urlliburllib2 python库建立连接并读取响应...你可以使用{{ 3}}查看搜索和响应主体的数据结构。然后使用urllib发出包含相关参数的请求...

举个例子......

我使用joyvalencia进行搜索并使用firebug检查请求网址:

http://api.twitter.com/1/statuses/user_timeline.json?screen_name=joyvalencia&count=100&page=2&include_rts=true&callback=twitterlib1321017083330

因此,使用urllib2.urlopen()调用此网址与在Snapbird上进行查询相同。回应机构是:

twitterlib1321017083330([{"id_str":"131548107799396357","place":null,"geo":null,"in_reply_to_user_id_str":null,"coordinates":.......

使用urlopen()并读取响应时,上面的字符串就是你得到的...然后你可以使用json python库来读取数据并将其解析为pythonic数据结构...