Search This Blog

自定义IEEE Xplore文献列表

IEEE Xplore 数据库提供了文献列表下载服务,可以方便地导出所查询文献的相关信息,存储与csv文件中。相关信息包括:文献名称、作者、发表年份、发表刊物等共计31个标签。在上一篇博文(批量下载IEEE Xplore数据库论文)中给出了根据csv文件下载文献的方法,在此做进一步补充:自定义下载的文献列表信息,例如只选择关注其中的若干标签,如:文献名称、作者、发表年份、发表刊物、引用次数这五个标签。此外,为每个条目添加文献超链接,关联到本地已下载的文献,从而便于索引和查看。

可以通过Matlab快速实现以上两个目标,涉及的主要函数如下:
  • xlsread / xlswrite
  • actxserver
其中,xlsread xlswrite 分别读取和写入excel(csv)文件;而 axtxserver 可以创建windows的COM组件,从而操作该对象,例如:exl = axtxserver('excel.application') 可以创建一个Excel对象。以下给出通过Matlab为Excel单元格添加超链接的实现示例:
exl = actxserver('excel.application');
exlWkbk = exl.Workbooks;
exlFile = exlWkbk.Open([pwd '/' filename]);
exlSheet1 = exlFile.Sheets.Item('Sheet1');

rngObj = exlSheet1.get('Cells', row, col);
exlSheet1.Hyperlinks.Add(rngObj, 'somelink');

exlFile.Save()
exlFile.Close()
exl.Quit
exl.delete

在创建Excel对象后,可以调用Excel VBA中的方法对Excel单元格进行访问,而其中添加超链接的方式即: exlSheet1.Hyperlinks.Add(rngObj, 'somelink'); 值得注意的是以R1C1方式访问Excel单元格的方式为:rngObj = exlSheet1.get('Cells', row, col); 完整代码如下所示:
function SelectInterestTags(export, filename, savepath)
%% Select interested tags from IEEE Xplore export file
%   and generate an excel file which contains hyperlink for each entry to
%   locate the downloaded file
%
%   export: csv file downloaded from IEEE Xplore
% filename: saved excel filename
% savepath: path for downloaded pdf files
%
clc

%% initial
switch(nargin)
    case 2
        savepath = pwd;
    case 3
        % do nothing
    otherwise
        error('Wrong for number of inputs.')
end

%% load csv file
[raw_numerical, raw_text, RAW] = xlsread(export);
NameList = raw_text(3:end, 1);
YearList = raw_numerical(1:end, 2);

pat = '[\\/:*?"<>|]';
NameList = regexprep(NameList, pat, ' ');

%% disp all tags and choose interest tags
Tags = raw_text(2, :);
for k = 1 : length(Tags)
    fprintf('\t%d\t%s\n', k, Tags{k});
end

prompt = 'Please Select Your Interest Tags (-1 for all, 0 for default): ';
interestTags = input(prompt);

%% parameter check
if interestTags == -1
    interestTags = 1:length(Tags);
else
    if interestTags == 0 % default selection
        interestTags = [1, 22, 4, 6, 11, 17, 24, 2];
    end
end

disp('The following tags are selected: ')
disp(Tags(interestTags)')

%% write xls file
InterestArray = RAW([2:end], interestTags);
xlswrite(filename, InterestArray);

%% add hyperlink for each paper

exl = actxserver('excel.application');
exlWkbk = exl.Workbooks;
exlFile = exlWkbk.Open([pwd '/' filename]);
exlSheet1 = exlFile.Sheets.Item('Sheet1');

for k = 1 : length(InterestArray) - 1
    pdfFile = [savepath '/' num2str(YearList(k)) ' ' NameList{k} '.pdf'];
    if exist(pdfFile, 'file') == 2
        rngObj = exlSheet1.get('Cells', k + 1, 1);
        exlSheet1.Hyperlinks.Add(rngObj, pdfFile);
    end
end
disp([filename ' generated!'])

%% save file and close activex excel com
exlFile.Save()
exlFile.Close()
exl.Quit
exl.delete

参考


批量下载IEEE Xplore数据库论文

在文献调研初期一般需要大量下载相关论文,IEEE Xplore提供了简单的批量下载功能,一次最多10篇,不算方便;此外,短时间内连续批量下载会遭到服务器拒绝,导致一段时间内无法下载文献。因此,考虑写个小脚本下载所需查阅的文献。

好在Xplore提供了导出文献列表的功能,如下图所示:
勾选所需的文献后,点击导出即会自动下载一个csv文件,保存有文献的相关信息,如:标题、年份、作者、文献链接等,如下图所示:

而文献链接为URL地址,打开后为PDF的浏览界面,PDF文件封装于一个<iframe></iframe>标签中。
基于以上的信息,可以设计如下的脚本逻辑:
采用Matlab实现,主要用到两个网络函数:webread 和 websave (于R2014b后引入,低于此版本的Matlab可以采用urlread 和 urlwrite 替代)
  • webread(url) 输入参数为url地址,访问该地址并以字符串的形式返回html代码;
  • websave(filename, url) 将url地址内容保存到本地并命名为filename。
以上逻辑描述如下:读取csv函数,提取出文献的链接以及文献相关信息;其中链接作为webread输入参数,调用后获得html内容,字符串提取出pdf的下载地址,然后通过websave下载pdf文件;结合csv读取的文献信息为文献命名。

注意事项

  • 以上讨论基于具备IEEE Xplore访问权限的前提,一般校园网均具备;
  • 在以文献标题作为文件名保存时需要注意通配符的问题,例如:“\/:*?"<>|”这些字符是无法存在于文件名中的,所以需要考虑将这些字符替换,比如替换为空格。可以通过正则表达式实现,Matlab中regexprep可用;
  • 下载时最好设置相邻下载间的等待时间从而模拟人工操作避免被封IP,例如可以用: pause(30 * rand() + 30) 模拟随机的等待时间。

代码

function DownloadPDFfromXplore(export, skip)
%% download pdf from IEEE EXplore export file
% if termites at any exception, we can restart and skip those downloaded 
if nargin == 1
    skip = 0;
end

[raw_numerical, raw_text, ~] = xlsread(export);
UrlList = raw_text(skip+3:end, 16);
NameList = raw_text(skip+3:end, 1);
YearList = raw_numerical(skip+1:end, 2);

pat = '[\\/:*?"<>|]';
NameList = regexprep(NameList, pat, ' ');

for k = 1 : length(NameList)
   html = webread(UrlList{k});
   first = strfind(html, '<iframe src="h');
   last = strfind(html, '" frameborder=0>');
   url = html(first+13:last-1);
   disp(url)
   filename = [num2str(YearList(k)) ' ' NameList{k} '.pdf'];
   disp(filename)
   websave(filename, url);
   waitTime = 30 * rand() + 30;
   pause(waitTime);
end