问题描述
OPGG是最权威的LOL数据网站,从这个网站上我们可以得到很多有关LOL的非常有用的数据,而matlab爬虫就是一个能够从网站上搜集信息的工具。这篇文章将要讲述如何利用matlab爬虫从OPGG上整理LOL英雄信息。
结果展示
英雄的信息分为三列,分别为中文名、英文名、位置。
代码分析
一开始,麻烦的事情就出现了,OPGG官网:http://www.op.gg/champion/statistics是一个综合多种语言的网站,但是每种语言的链接都是一样的。当我们使用urlread语句读取这个网站的信息的时候,却默认打开的是英文版的网站。但是我们所需要收集是信息却是中文版的。为了解决这个问题,我们只能将该网页源代码中我们所需要的那一部分保存到一个txt文件中。将其命名为"22.txt"。
a=importdata(‘22.txt’);
读取txt文件"22.txt"。
b=convertCharsToStrings(a);
转化为字符串数组。
A=regexpi(b,‘data-champion-name="\S{1,}"’,‘match’);
观察网页源代码,中文名周围的格式为’data-champion-name=" ",利用正则化匹配将其找出。
A(cellfun(@isempty,A))=[];
去掉没有匹配项的空cell数组。
for i=1:size(A)
C(i)=A{i}(1);
end
将字符串提取到一个新矩阵C中。
C=strrep(C,‘data-champion-name="’,’’);
C=strrep(C,’"’,’’);
将’data-champion-name="和’"删掉,此时字符串中只剩下中文名。
B=regexpi(b,‘data-champion-key="\S{1,}"’,‘match’);
B(cellfun(@isempty,B))=[];
for i=1:size(B)
D(i)=B{i}(1);
end
D=strrep(D,‘data-champion-key="’,’’);
D=strrep(D,’"’,’’);
同理,利用正则化匹配找出英文名。
位置这一部分有些复杂,因为一个英雄可能适合很多个位置,当我们搜索位置的时候,可能会获得多个结果,而这每一个结果都被保存在不同的cell数组中,我们要想办法将它们连起来。
已知语句:[‘a’,‘b’,‘c’]可以将字符串连起来,变成’abc’。所以我们想要将’上单’,‘中单’,'打野’连起来,就要想办法将它们变成[‘a’,‘b’,‘c’]的形式。
E=regexpi(a,‘title="\S{1,}|\S{1,}’,‘match’);
E(cellfun(@isempty,E))=[];
先不将a化为字符串数组,先进行正则化匹配,然后去空。正则化匹配的时候,我们意识到“巨魔之王”的匹配格式和其他英雄都不同,为title=" 。所以要用一个|,将“巨魔之王”的匹配格式放在前面。
F=cell(size(E,1),1);
定义F为一个空的字符数组。
for i=1:size(E,1)
for j=1:size(E{i},2)
F{i}=[F{i},E{i}{j}];
end
end
利用这个方法可以将E{i}中的每个元素合并到F{i}中。
F=strrep(F,’’,’’);
F=strrep(F,’’,’’);
F=strrep(F,‘title="’,’’);
F=strrep(F,’"’,’’);
F=convertCharsToStrings(F);
删去多余字符,转化为字符串数组。
G=[“中文名”,“英文名”,“位置”];
xlswrite(‘output2.xlsx’,G,‘A1:C1’);
xlswrite(‘output2.xlsx’,C’,‘A2:A146’);
xlswrite(‘output2.xlsx’,D’,‘B2:B146’);
xlswrite(‘output2.xlsx’,F,‘C2:C146’);
写入excel。设置A2:A146的原因是总共的英雄数量为145。
源代码
a=importdata('22.txt');
b=convertCharsToStrings(a);
A=regexpi(b,'data-champion-name="\S{1,}"','match');
A(cellfun(@isempty,A))=[];
for i=1:size(A)
C(i)=A{i}(1);
end
C=strrep(C,'data-champion-name="','');
C=strrep(C,'"','');
B=regexpi(b,'data-champion-key="\S{1,}"','match');
B(cellfun(@isempty,B))=[];
for i=1:size(B)
D(i)=B{i}(1);
end
D=strrep(D,'data-champion-key="','');
D=strrep(D,'"','');
E=regexpi(a,'title="\S{1,}|<span>\S{1,}</span>','match');
E(cellfun(@isempty,E))=[];
F=cell(size(E,1),1);
for i=1:size(E,1)
for j=1:size(E{i},2)
F{i}=[F{i},E{i}{j}];
end
end
F=strrep(F,'<span>','');
F=strrep(F,'</span>','');
F=strrep(F,'title="','');
F=strrep(F,'"','');
F=convertCharsToStrings(F);
G=["中文名","英文名","位置"];
xlswrite('output2.xlsx',G,'A1:C1');
xlswrite('output2.xlsx',C','A2:A146');
xlswrite('output2.xlsx',D','B2:B146');
xlswrite('output2.xlsx',F,'C2:C146');