用 matlab 爬取期刊影响因子

“爬虫”这个词的火爆多少跟 python 有些联系,python 也当之无愧是最适合写爬虫程序的语言。但如果 matlab 用户想要写个爬虫程序处理些简单任务,大可不必再学 python,matlab同样提供了获取 web 数据的函数,也能实现简单的爬虫。我来分享一个最近遇到的简单案例,说简单却也比中文互联网上能搜到的案例都难些,如果您觉得阅读本文有些吃力,不妨先读这篇文章,[原][Matlab][01] 做一个简单的爬虫或下载器

任务是这样的,老师给我一张 Excel 表格,列了 400 多本期刊的标题,然后给了我一个网址(最新SCI影响因子查询及期刊投稿分析系统(2015-2016年) – LetPub),让我从这网站获取这些期刊的影响因子。这网站可以根据期刊名返回期刊信息,影响因子就在其中。考虑到链接可能失效,我给出一个截图,如下。

写这段程序需要用到 webread 函数、regexp 函数和正则表达式,相关内容请参阅用户手册。

我们需要用 webread 函数向网站提交我们要检索的期刊名,然后接收网站返回的网页源代码,最后从源代码中利用正则表达式提取出影响因子。

提交期刊名时要在 webread 函数中指定网站上相关的变量名和变量值,变量值就是我们要检索的期刊名。那变量名怎么查看呢,其实变量名就是输入期刊名那个 input box 的 id,看图。

如果你也用 Chrome 浏览器,那么右击 input box,单击检查,就会弹出元素检查窗口,就可以看到网页的源码了,我们得知 input box 的 id 是 searchname,也就是说我们通过 webread 函数提交的变量名是 searchname。这条语句如下。

    url = 'http://www.letpub.com.cn/index.php?page=journalapp&view=search'; 
    source_page = webread(url, 'searchname', char(journal_names(i)));
Code language: JavaScript (javascript)

这样网页源码就储存到了 source_page 变量中,接下来我们从 source_page 中提取出影响因子。类似地,我们观察下包含影响因子的语句。

<td style="border:1px #DDD solid; border-collapse:collapse; text-align:left; padding:8px 8px 8px 8px;">2.603</td>
Code language: HTML, XML (xml)

我们构造一个正则表达式,并且用 matlab 的 regexp 函数匹配。

    pattern = '>[0-9]\.[0-9][0-9][0-9]<';
    IF = regexp(source_page, pattern, 'match');
Code language: JavaScript (javascript)

经过试验,pattern 两端的 >< 符号应该保留,不然会匹配到不想要的结果。

下面给出完整的包含输入输出、循环的代码。需要注意的是,如果想运行这段代码需要读者自行构建输入文件,并且修改代码中输入文件的路径。另请注意,matlab 2015a 以前的版本没有 webread 函数,因此该教程不适用。

%% search impact factors from website for prof. Zhou.

%% read journal names from the file provided by Zhou
statics_filename = 'H:\impact factor\statics20170224.xlsx';
[~, journal_names, ~] = xlsread(statics_filename, 'A2:A475');
%% save the pages from the website and match the impact factors.
n = size(journal_names);
statics_result = cell(n);
for i = 1:n
    url = 'http://www.letpub.com.cn/index.php?page=journalapp&view=search'; % provided by Zhou
    source_page = webread(url, 'searchname', char(journal_names(i)));
    % match the impact factor from the source.
    pattern = '>[0-9]\.[0-9][0-9][0-9]<';
    IF = regexp(source_page, pattern, 'match');
    IF = strjoin(IF);
    statics_result(i) = {IF};
    disp(i);
    disp(IF);
end
%% write the statics file. 
xlswrite(statics_filename, statics, 2);
Code language: JavaScript (javascript)
常恭

作者: 常恭

略懂 OpenFOAM

发表评论