前几天用手机抓博客园和csdn的文章的时候,直接分析它们各自的APP得到了如下获取json的链接
csdn
http://ms.csdn.net/api/v2/search/blog?page=1&pagesize=20&key=Android
博客园
http://cnblogs.davismy.com/Handler.ashx?op=BlogSearch&key=Android
后面的参数就不用我多说了。
但是抓取简书内容的时候,却遇到了问题。分析简书APP的时候,每次只要用其他工具抓取(这里我用的是fiddler),简书APP就无法正常访问网络。所以只好放弃APP这条路,然后转向电脑端。在电脑端的简书官网进行搜索,在访问后台找到了这样一个链接:
//www.greatytc.com/search/do?q=Android&page=1&type=notes
然后就是测试过程中的各种坑点。开始,天真的以为返回的内容就是我要的json格式,然后就直接使用volley中的JsonObjectRequest方法去请求上面的地址,然后,就看到了下面的提示
Unexpected response code 404 for //www.greatytc.com/search/do?q=Android&page=1&type=notes
一个大大的404出现在了输出栏,看来返回的内容并不是json格式,然后自己就转用StringRequest方法去请求,还是和上面一样的结果。这个时候,应该倒杯茶好好想想了:这三个(或者说这两种)地址有什么区别呢?然后就是各种尝试,试了一会发现,csdn和博客园的地址都能直接在浏览器中访问,并且显示json数据,但是简书的却不行,每次直接访问都会跳转到一个404页面;只有在简书的页面进行搜索,浏览器自动会在后台访问这个链接,然后返回相应的数据。这块应该就是它们的区别所在,也是解决问题的关键。
既然找到了问题的关键,那就开始动手了,我先在浏览器中的简书页面进行了搜索,然后在浏览器调试模式中找到后台访问的链接,好像请求头里面有很多内容呀,然后为了让手机端能模拟浏览器的行为,重写getHeaders方法,然后加上了全部的参数,满心欢喜的以为能访问了,没想到又报错了,如下:
org.json.JSONException: Value ����������������� of type java.lang.String cannot be converted to JSONObject
这块我使用的是JsonObjectRequest方法进行请求的,看到这个错误,想着应该用StringRequest方法,然后说改就改,直接换成StringRequest方法进行测试,成功是成功了,但是输出栏里却是满满一屏幕的乱码,乱码看着太心烦了,就不贴了。
接下来就是漫漫长路之修改编码问题,网上找了好久各种方法:字符流转字节流,重写volley中的parseNetworkResponse方法等等,然而都没有解决。
突然想到,浏览器端能正常显示,但是手机不能正常显示,两者之间就差了一个请求头,有可能是请求头的问题。然后就又开始尝试。最后,编码问题源头终于找到了,问题就出在了请求头这块
"Accept-Encoding"="gzip, deflate"
这个参数表示本地可以接收压缩格式的数据,电脑端接收到压缩文件之后会自动进行解压,而自己写的程序中没有解压的方法,所以仍然会显示压缩的内容,所以看到的就是乱码了。
然后果断删掉这行参数,程序终于正常跑起来了,还有比如搜索的内容会被标签包裹之类的小问题,这边我是用replace函数直接进行替换的。现在的大概界面是这样的。
翻页还没有做,下拉刷新之后只是重复请求这个页面,这个坑会在这周末填上,记下自己犯的一些小错误,自己多来看看,也就不会在犯了。