本文主要介绍“百度糯米电影信息采集爬虫”的开发教程,按三个不同类目爬取影片的基本信息,爬取字段包括电影ID、电影名称和上映时间等字段,文章结尾会附上完整的爬虫代码。
采集网站URL:https://dianying.nuomi.com/movie/movielist
使用功能点:
· 自定义设置
· initCrawl、afterDownloadPage、onProcessContentPage和afterExtractPage回调函数
接下来,给你详细说明“百度糯米电影信息采集爬虫”的开发过程:
步骤1 创建爬虫
注册并登录神箭手,进入神箭手控制台。

点击“新建应用”,选择“爬虫”,点击“下一步”。

输入爬虫名称“百度糯米电影信息采集爬虫”,选择“编辑模式”,点击“创建”,神箭手爬虫创建成功。

步骤2 分析网页&开发爬虫
本文使用Chrome浏览器分析京东商品网页,按“F12”打开浏览器“开发者工具”。

在浏览器“开发者工具”中勾选“Preserve log”,按“F5”刷新网页,电影列表数据便会重新加载进来。

在浏览器“开发者工具”中选择“AHR”,搜索“getmovielist”,便可找到存放电影列表信息的URL。

分析请求该URL返回的JSONP数据,结合“神箭手开发文档”,在神箭手爬虫编辑页开发爬虫代码。

步骤3 测试并运行爬虫
爬虫开发完成后,点击“测试”按钮看爬虫的爬取结果是否正确。

测试通过后,进入“爬虫设置”页,设置“代理IP”、“文件云托管”以及需要爬取的电影“分类”。

返回爬虫总览页,点击“启动爬虫”,稍等片刻,爬虫就会爬取到数据了。

步骤4 数据发布与导出
爬虫爬到数据后,可以选择将数据发布到网站或数据库中,点此查看神箭手数据发布详细教程。

此外,还可选择将数据“导出”,点此查看神箭手数据导出详细教程。

神箭手爬虫导出数据示例,如下图所示:

“百度糯米电影信息采集爬虫”完整示例代码:
/**
百度糯米电影信息采集爬虫源码
可批量爬取“热映影片”、“即将上映”和“影片库”的所有电影数据
只爬取列表页上展示出的数据
可使用代理IP,也可不使用代理IP
想爬取更多数据,请参考“新版”神箭手开发文档(http://docs.shenjian.io/develop/crawler/quick-start.html)
**/
var category = "热映影片";//@select(category, 请选择要爬取的电影分类, 一次只能选一个分类进行爬取)
var uiconfigs = {
inputs: [
{
name: "category",
onLoad: function() {
this.addOption(["热映影片", "即将上映", "影片库"]);
}
}
]
};
ui.render(uiconfigs);
var configs = {
domains: ["dianying.nuomi.com"],
contentUrlRegexes: [
/http[\w:\/]+dianying\.nuomi\.com\/movie\/getmovielist\?.*/
],
helperUrlRegexes: [""],
fields: [
{
name: "movie_list",
alias: "电影列表",
selector: "//*[contains(@class,'movie-content')]",
repeated: true,
children:[
{
name: "id",
alias: "电影ID",
selectorType: SelectorType.Regex,
selector: /"movieId":(\d+)\}/,
required: true,
primaryKey: true
},
{
name: "category",
alias: "分类",
required: true,
primaryKey: true
},
{
name: "name",
alias: "电影名称",
selector: "//*[contains(@class,'movie-name')]/text()"
},
{
name: "image",
alias: "封面图",
selector: "//*[contains(@class,'movie-pic')]//@src"
},
{
name: "score",
alias: "评分",
selector: "//*[contains(@class,'num nuomi-red')]"
},
{
name: "projection_type",
alias: "放映类型",
selector: "//*[contains(@class,'movie-name')]/span"
},
{
name: "film_desc",
alias: "电影短评",
selector: "//*[contains(@class,'font-shadow font')]"
},
{
name: "movie_infos",
selector: "//ul[contains(@class,'info')]/li",
repeated: true,
transient: true
},
{
name: "type",
alias: "类型"
},
{
name: "duration",
alias: "时长"
},
{
name: "release_time",
alias: "上映时间"
}
]
}
]
};
configs.initCrawl = function(site) {
var scanUrl = "";
var time = new Date().getTime();
if (category == "热映影片") {
scanUrl = "https://dianying.nuomi.com/movie/getmovielist?pagelets[]=pageletMovielist&reqID=0&type=hot&cityId=131&pageNum=0&pageSize=10&needMovieNews=false&isHomePage=false&needSliceAdSpace=false&t=" + time;
}
else if (category == "即将上映") {
scanUrl = "https://dianying.nuomi.com/movie/getmovielist?pagelets[]=pageletMovielist&reqID=0&type=new&cityId=131&pageNum=0&pageSize=10&needMovieNews=false&t=" + time;
}
else if (category == "影片库") {
scanUrl = "https://dianying.nuomi.com/movie/getmovielist?pagelets[]=pageletMovielist&reqID=0&type=lib&cityId=131&pageNum=0&pageSize=10&needMovieNews=false&t=" + time;
}
else {
system.exit("请选择要爬取的电影分类!");
}
site.addScanUrl(scanUrl);
};
configs.afterDownloadPage = function(page, site) {
if (!page.raw) return page;
var pageRaw = page.raw;
try {
pageRaw = page.raw.substring(page.raw.indexOf("(")+1, page.raw.lastIndexOf(")"));
var jsonData = JSON.parse(pageRaw);
pageRaw = jsonData.html;
}
catch (err) {
console.log("Failed to get movie list! err: " + err);
}
page.raw = pageRaw;
return page;
};
configs.onProcessScanPage = function(page, content, site) {
return false;
};
configs.onProcessContentPage = function(page, content, site) {
var m = /&pageNum=(\d+)/.exec(page.url);
if (!m && !m[1]) return false;
var curPageNum = parseInt(m[1]) + 1;
var totalPageNum = parseInt(extract(page.raw, "//*[@id='pagerInfo']/@data-pagecount"));
if (curPageNum >= totalPageNum) return false;
var time = new Date().getTime();
var nextContentUrl = page.url.substring(0, page.url.indexOf("&t="));
nextContentUrl = nextContentUrl.replace(m[0], "&pageNum="+curPageNum) + "&t=" + time;
site.addUrl(nextContentUrl);
return false;
};
configs.afterExtractPage = function(page, data, site) {
var movieList = data.movie_list;
if (movieList && movieList.length > 0) {
for (var ml in movieList) {
movieList[ml].category = category;
var movieInfos = movieList[ml].movie_infos;
for (var mi in movieInfos) {
if (movieInfos[mi].indexOf("类型") > -1) {
movieList[ml].type = movieInfos[mi].replace(/\u7c7b\u578b[::]+/, "");
}
else if (movieInfos[mi].indexOf("时长") > -1) {
movieList[ml].duration = movieInfos[mi].replace(/\u65f6\u957f[::]+/, "");
}
else if (movieInfos[mi].indexOf("上映时间") > -1) {
movieList[ml].release_time = movieInfos[mi].replace(/\u4e0a\u6620\u65f6\u95f4[::]+/, "");
}
}
}
data.movie_list = movieList;
}
return data;
};
var crawler = new Crawler(configs);
crawler.start();
网友评论