本文主要介绍“百度糯米电影信息采集爬虫”的开发教程,按三个不同类目爬取影片的基本信息,爬取字段包括电影ID、电影名称和上映时间等字段,文章结尾会附上完整的爬虫代码。
使用功能点:
接下来,给你详细说明“百度糯米电影信息采集爬虫”的开发过程:
步骤1 创建爬虫
点击“新建应用”,选择“爬虫”,点击“下一步”。
输入爬虫名称“百度糯米电影信息采集爬虫”,选择“编辑模式”,点击“创建”,神箭手爬虫创建成功。
步骤2 分析网页&开发爬虫
本文使用Chrome浏览器分析京东商品网页,按“F12”打开浏览器“开发者工具”。
在浏览器“开发者工具”中勾选“Preserve log”,按“F5”刷新网页,电影列表数据便会重新加载进来。
在浏览器“开发者工具”中选择“AHR”,搜索“getmovielist”,便可找到存放电影列表信息的URL。
步骤3 测试并运行爬虫
爬虫开发完成后,点击“测试”按钮看爬虫的爬取结果是否正确。
返回爬虫总览页,点击“启动爬虫”,稍等片刻,爬虫就会爬取到数据了。
步骤4 数据发布与导出
神箭手爬虫导出数据示例,如下图所示:
“百度糯米电影信息采集爬虫”完整示例代码:
/**
百度糯米电影信息采集爬虫源码
可批量爬取“热映影片”、“即将上映”和“影片库”的所有电影数据
只爬取列表页上展示出的数据
可使用代理IP,也可不使用代理IP
**/
var category = "热映影片";//@select(category, 请选择要爬取的电影分类, 一次只能选一个分类进行爬取)
var uiconfigs = {
inputs: [
{
name: "category",
onLoad: function() {
this.addOption(["热映影片", "即将上映", "影片库"]);
}
}
]
};
ui.render(uiconfigs);
var configs = {
contentUrlRegexes: [
],
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 == "热映影片") {
}
else if (category == "即将上映") {
}
else if (category == "影片库") {
}
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();