前言
“自古美女出苏杭”,“川渝盛产美女”,究竟哪里才是中国最盛产美女的地方,为此,本文采用网页自动化抓取的方法,调取了中国大型偶像乐团SNH48的成员介绍,找到成员出生地一览进行汇总统计!
概要
网页信息采集可以使用的工具众多,本次博主采用casperJS自动化采集的方式,采集了SNH48官网成员介绍页面。casperJS能够方便地实现网页截图,网页元素查找等方面的功能,特别值得一提的是其对于选择器的较好支持,能够基于选择器查找所需元素,这样就大大简化了提取关键信息的步骤,从而避免了以往数据采集通过正则表达式查找元素的麻烦。casperJS的简介及使用方法详见其官网:http://casperjs.org/
步骤
1、登录SNH48官网的成员介绍主页:http://www.snh48.com/member_list.php;
2、随意点击某一成员的信息主页,可以发现其URL格式形如:http://www.snh48.com/member_detail.php?sid=xxx
可以看到,sid后面的数字即为成员的编号;查看整个页面,可以发现其取值范围为1~150,但某些取值可能没有页面,即编号不连续,不过好在这个问题的存在不影响采集,稍后详细介绍。
3、查找成员的出生地,如下图所示红框所示
4、最关键一步,查找该出生地对应的选择器。
打开chrome,选择“检查”,再点击“元素选择器”并选中上面第3步的出生地元素,如下图所示:
可以看出,出生地放在了一个无序列表项li当中,该列表项的class名为12,且有多个同名的class,故不能采用li.12的形式定位。那么,我们向上寻找其父元素
看到其父元素为div,类名mem_w,为了验证类名为mem_w的div的唯一性,在chrome的console中输入:document.querySelectorAll(".mem_w"),如下图所示:
由此可见该元素具有唯一性,那么通过它再找到出生地对应的li即可找到元素,观察发现,显示出生地的li位于该div下的第22个元素,采用document.querySelectorAll(".mem_w li:nth-child(22)")验证,结果如下:
至此,我们就找到了网页采集的关键元素,从而可以编写采集代码了。
5、编写casperJS代码采集信息(拿走不谢):
var casper = require('casper').create();
var fs=require('fs');
casper.start();
fs.write("snh48.html",'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">','a+')
for (var i = 1; i <=180; i++) {
(function (arg) {
casper.then(
function () {
var url = "http://www.snh48.com/member_detail.php?sid=" + arg;
casper.page = casper.newPage();
casper.open(url).then(function () {
fs.write("snh48.html",arg,"a+");
if(casper.getHTML(".mem_w li:nth-child(22)"))
{
fs.write("snh48.html",casper.getHTML(".mem_w li:nth-child(22)")+"<br>",'a+');
}
});
}
);
})(i)
}
casper.run();
代码部分解读:
(1)引入fs模块用于将采集到的数据输出到文件,在写入数据前,为了避免出现乱码,需要给文件指定编码格式UTF-8;
(2)第6行起,引入闭包,否则for循环内采集的结果将永远是最后一个,即sid为180的网页。不熟悉闭包的同学,可以阅读相关书籍和文档。
6、其他
类似的,我们再次抓取SNH48姐妹团BEJ48(http://www.bej48.com/member.html)和GNZ48(http://www.gnz48.com/member/member_list.php)的数据,脚本仍然采用上述框架,只是URL和选择器需要重新调整,在此不再赘述。
结论
省份 | 美女数量 |
上海 | 21 |
四川 | 19 |
广东 | 13 |
江苏 | 12 |
浙江 | 11 |
湖南 | 11 |
湖北 | 10 |
河南 | 9 |
福建 | 7 |
山东 | 7 |
重庆 | 6 |
辽宁 | 6 |
北京 | 5 |
陕西 | 4 |
安徽 | 4 |
贵州 | 4 |
云南 | 3 |
江西 | 3 |
黑龙江 | 2 |
台湾 | 2 |
海南 | 2 |
内蒙古 | 1 |
吉林 | 1 |
香港 | 1 |
河北 | 1 |
广西 | 1 |
甘肃 | 1 |
内蒙 | 1 |
天津 | 1 |
绘制柱状图如下:
可以看出,SNH48成员多来自上海及周边,此外来自四川、湖南、湖北也为数不少,与传统意义上大家认同的盛产美女的地方基本保持一致。当然,由于SNH48地处上海,来自上海的成员可能也有一定程度的地域优势,但基于网页信息的抓取和统计分析,就暂时不考虑此种因素。