油猴子脚本——豆瓣读书的图书馆插件(1)
标签(空格分隔): 爬虫
上学期就有的想法,昨天因为不想自己闲下来所以开始动手继续折腾。到今天位置也算做好大部分的内容了。也算是对假期学习php+js的一个总结吧。
需要的技术:
- 油猴子脚本api——GM_xmlhttprequest(超好用!);
- xpath还有正则表达式(开启了新世界的大门啊喂!);
- xpathhelper(强大的chrome插件,以后做爬虫再也不用第三方的模块啦!);
简单的流程:
- 获取豆瓣书籍名字;
- 提交到我的vps;
- 由我的vps向海事大学图书馆查询端口提交请求;
- 分析返回的请求再返回给脚本;
- 显示出来;
差不多也就那么多事了,可以开始写代码了。
|
|
首先看油猴子脚本开头的注释快,名称、作者、更新地址什么的都是一目了然。需要关心的是@grant
还有@match
前者是用来包含油猴子提供给你的内部函数的,后者是用来指定在那些页面下生效的。我需要在豆瓣读书下生效,所以对应的是https://book.douban.com/subject/*
注意通配符。获取书籍名称非常容易,一行代码能够搞定,var keyword1 = title.replace( '(豆瓣)', '' ).trim();
接下来使用gm_xmlhttprequest模块构造get请求,提交书籍名称到我的vps。可以参考greasepot的wiki,不难写出代码,注意提交完成后的执行内容得写在onload里面。代码如下:
function newztflh(book_name, book_location, book_ztflh) {
this.book_name = book_name;
this.book_location = book_location;
this.book_ztflh = book_ztflh;
}
var ztflh = new newztflh(‘’,’’,’’);
GM_xmlhttpRequest({
method: “GET”,
url: “”+keyword1,//请求的url
synchronous : false,//是否为异步请求
onload: function(response) {
var obj = JSON.parse(response.responseText);
if (obj.book_name == null) {
ztflh.book_name = “找不到该书籍”;//抛出异常
}
else{
ztflh.book_name = obj.book_name;
ztflh.book_location = obj.book_location;
ztflh.book_ztflh = obj.book_ztflh;
}
switch(location.host){//构造页面显示
case “movie.douban.com”:
appendLinks(Movie_links, link)
link.append('<br>')
.append('<span class="pl">字幕链接:</span>')
.append(
$("<a>").attr({
href: "http://shooter.cn/search/" + movieTitle,
target: "_blank"
}).html("Shooter")
);
break;
case "book.douban.com":
appendLinks(Book_links, link)
link.append('<br>')
.append('<span class="pl">图书馆信息 :</span>'+ztflh.book_name+' '+ztflh.book_location+' '+ztflh.book_ztflh+' '+'<br/>')
break;
}
$('#info').append(link);
}
});
接下来是后端的内容,因为还不会用php的模块,所以直接用xpath来对页面进行解析。这里推荐xpathhelper,只需按下ctrl+shift+x再按下shift把鼠标移动到哪就可以显示对应的xpath,不过需要注意生成的是从根标签开始的,如果太长可以直接用”/“来代替。
最后是返回json数据(主要是看到v2ex上有人吐槽为何后端不能返回json数据,所以良好习惯从现在开始吧。我这数据量不大,老老实实组成数组,然后再用json_encode转换就好了。注意因为出现中文所以需要在开始加header("Content-Type: text/html;charset=utf-8");//防止出现乱码
还有json_encode需要多一个参数cho json_encode($arr, JSON_UNESCAPED_UNICODE);
js上再用json.parse取出就好了,实在方便的一匹啊。
todolist:
- 返回的json增加错误代码(主要是图书馆最近在维护,希望能在后端直接判断出来)
- 生成的书籍信息更加好看一些(要是能像广州十校图书馆那样就好了)