【发布时间】:2011-12-26 10:46:54
【问题描述】:
我正在尝试使用 Python 在基于 ajax 的网站上检索查询结果,例如 www.snapbird.org。由于它没有显示在页面源中,我不确定如何继续。 我是 Python 新手,因此如果我能找到正确方向的指针,那就太好了。 如果这更容易,我也愿意接受其他一些方法来完成这项任务
【问题讨论】:
标签: python ajax data-mining
我正在尝试使用 Python 在基于 ajax 的网站上检索查询结果,例如 www.snapbird.org。由于它没有显示在页面源中,我不确定如何继续。 我是 Python 新手,因此如果我能找到正确方向的指针,那就太好了。 如果这更容易,我也愿意接受其他一些方法来完成这项任务
【问题讨论】:
标签: python ajax data-mining
这会很复杂,但首先,请填写 firebug 并找到在处理 AJAX 请求时调用的 URL。您可以直接在 Python 程序中调用它并解析输出。
【讨论】:
您可以使用 Selenium 的 Python client driver 来解析页面源。我通常将它与PyQuery 结合使用,以使网页抓取更容易。
这是basic tutorial for Selenium's Python driver。请务必遵循 Selenium 版本 2 而不是版本 1 的说明(除非您出于某种原因使用版本 1)。
【讨论】:
您还可以将 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 也是一个很棒的工具,它有助于满足我的各种抓取需求。如果您愿意,我很乐意为您提供帮助。
【讨论】:
一个简单的解决方案可能是使用像Mechanize 这样的浏览器。因此,您可以浏览网站、跟踪链接、进行搜索以及使用带有用户界面的浏览器进行的几乎所有操作。
但是对于一个非常特殊的工作,你甚至可能不需要这样的库,你可以使用urllib和urllib2 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数据结构......
【讨论】: