感谢吴老师的《数据新闻与网络数据挖掘》课程
感谢各位捧场的小伙伴们
本文适用对象为编程零基础者
仅供学习交流使用,请勿用于商业用途。
通过这样的方法,可以类似得到其他信息,这里编写了爬取酒店名称、经度、纬度的代码:
代码运行后,我们可以在MATLAB的Workspace窗口中,查得已经爬取的信息:
但是,在网页源代码中,星级的标注多为字符串,例如:'hotel_stars05'代表国家旅游局评定五星级,'hotel_diamond05'代表携程用户评定的5钻。若直接爬取字符串,不方便后续的处理,我们更希望得到的是代表星级的数值‘4’或‘5’。
这里我们可以用MATLAB中的字符串替换函数strrep()对其进行替换,
star=strrep(star,'hotel_diamond05','5');
它在变量star中查找'hotel_diamond05',并将'hotel_diamond05'替换为‘5’。
以此类推,将所有的字符串都进行替换,即可将酒店星级数值化:
成功提取一则酒店的信息之后,我们可以借助程序的循环结构,对第一页的酒店信息进行爬取。循环结构即设定条件,使程序在满足该条件时,循环执行相同操作。
而在爬取这一页的酒店信息时,需要循环执行的相同操作是提取每一则酒店的id、名称等信息,接下来需要寻找可以设定的循环条件。
观察之前的代码
我们将第一则信息存在info中:
info=s1(tagloc(1):tagloc(2))
而第一则信息提取后,info中的内容就不需要了,我们可以将第二则酒店的信息存入info,覆盖第一则酒店的信息:
info=s1(tagloc(2):tagloc(3))
以此类推,如果有n则酒店信息,我们需要爬取第i则信息,代码就可以写作:
info=s1(tagloc(i):tagloc(i+1))
而我们可以通过n=length(taploc),将taploc数组的长度(taploc中存的数字数量)记在n中,即‘{’位置信息的数量,这就是一页网页中的酒店数量n。
但是在这里,我们不能用n作为循环的结尾,因为若i为n(i=n)时,
info=s1(tagloc(n):tagloc(n+1))
程序出错,因为tagloc中只有n个数,tagloc(n+1)不存在。
所以比较简单的办法是:我们可以先通过循环取前n-1则的酒店信息,单独提取本页最后一则酒店的信息。将酒店信息部分的结尾作为最后一个酒店的结尾进行定位,存于tagend中:
这样,我们就可以单独读取最后一则酒店信息进行爬取:
info=s1(tagloc(n):tagend)
接下来,我们可以进行循环部分代码的编写,这里选择循环中的一种:for循环,其代码以for开始,end结束,for之后紧跟的是循环变量及其循环范围的设置,for与end之间的是需要重复执行的语句。具体代码如下,i从1开始,每执行一轮后,会自增1,直到n-1:
到这里,一页内的酒店信息我们都可以成功爬取了,这里介绍输出函数fprintf,可以实时看到结果:
fprintf(“%s\n”,id)
这条语句中,双引号内是需要输出的内容框架,%s代表的是一个字符串型的变量,‘\n’代表输出一个回车,也就是我们的输出是一个字符串并加上回车键进行分隔的形式。这个输出的框架搭好之后,我们需要对其内容进行填充,即我们在逗号之后写上id,表示变量id的内容是作为对%s的填补。
结果如下:
大家可以试着加上其他内容,也可以根据个人喜好输出的框架,例如可以用’\t’(tab键)替代‘\n’进行分隔。由于我们爬取时储存类型都为字符串,因此每一处信息只要用一个“%s”表示即可。
当然,循环结构也可以实现从爬1页酒店信息到爬n页酒店信息,大家可先行尝试!
今日总结
·寻找用于循环的条件
·实现for循环
·输出结果
下期预告
大量爬取数据并储存至文件中
领取专属 10元无门槛券
私享最新 技术干货