最近在做的一个项目需要抓取新浪微博的公共微博数据,思路就是使用微博提供的API,但是不知道为什么public_timeline的接口出现了问题,每次返回的数据都为空。但是微博API测试工具里使用public_timeline接口有数据返回,所以只有模拟API测试工具请求才能用程序抓数据。
经过chrome的开发者工具分析,API测试工具是给服务器发送了一个post请求,包括4个请求参数。首先想到简单粗暴的方法是写个html form表单提交。但存在着两个问题:1.请求必须包含cookie信息,所以微博要保持登录状态。2.服务器返回的数据直接打印在浏览器上,无法用程序获取。原因是form的submit只是将数据发送到服务器就结束了,纯js无法再获取返回数据。所以想到了用ajax,但是用ajax会存在跨域的问题和无法设置cookie的问题。针对ajax跨域的问题,可以使用jsonp,但是使用jsonp即使jquery ajax内部声明了post提交,实际上还是发送了一个get请求。还有一个解决办法是在服务器端设置request的header Access-Control-Allow-Origin字段为*,但是我的程序只是简单的html+js,没有服务器端程序。幸运的是chrome有个插件Access-Control-Allow-Origin,安装了这个插件就能发送跨域的post请求。
但是由于ajax无法发送cookie数据,导致每次发送请求时服务器不能验证通过,返回的数据总是为空。html+js的方法暂时不能满足我的需求。 所以想到了用python的request包,只要用chrome获取网页端请求的参数,就可以用python模拟,这样就解决了问题。