【问题标题】:Extracting information from AJAX based sites using Python使用 Python 从基于 AJAX 的站点中提取信息
【发布时间】:2011-12-26 10:46:54
【问题描述】:

我正在尝试使用 Python 在基于 ajax 的网站上检索查询结果,例如 www.snapbird.org。由于它没有显示在页面源中,我不确定如何继续。 我是 Python 新手,因此如果我能找到正确方向的指针,那就太好了。 如果这更容易,我也愿意接受其他一些方法来完成这项任务

【问题讨论】:

    标签: python ajax data-mining


    【解决方案1】:

    这会很复杂,但首先,请填写 firebug 并找到在处理 AJAX 请求时调用的 URL。您可以直接在 Python 程序中调用它并解析输出。

    【讨论】:

      【解决方案2】:

      您可以使用 Selenium 的 Python client driver 来解析页面源。我通常将它与PyQuery 结合使用,以使网页抓取更容易。

      这是basic tutorial for Selenium's Python driver。请务必遵循 Selenium 版本 2 而不是版本 1 的说明(除非您出于某种原因使用版本 1)。

      【讨论】:

        【解决方案3】:

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

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

        其他 javascript 脚本/书签小程序模拟用户与网站的交互,因此 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 :)
        

        这是一个精简的示例,没有任何花哨的 iframe/非必要元素,只会增加复杂性。

        除了 Liam 所说的,Selenium 也是一个很棒的工具,它有助于满足我的各种抓取需求。如果您愿意,我很乐意为您提供帮助。

        【讨论】:

          【解决方案4】:

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

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

          举个例子……

          我使用joyvalencia 进行了搜索,并使用 firebug 检查了请求 url 以查看:

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

          【讨论】:

            猜你喜欢
            • 2015-07-19
            • 1970-01-01
            • 1970-01-01
            • 2011-09-07
            • 2013-09-12
            • 1970-01-01
            • 2016-12-31
            • 2010-09-24
            • 1970-01-01
            相关资源
            最近更新 更多