Search This Blog

批量下载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

3 comments:

  1. 不过严格地说,英国大学和美国大学对这两个词的使用和定义很不一样,可以说正好相反:英国的博士论文一般都是Thesis,指有创见性的专著性论文,硕士论文是Dissertation.而在美国Dissertation表示最高一层的、深入的、有独创性的毕业论文,即博士论文。https://essaymin.com/cn/blog/american-essay-writing-service/

    ReplyDelete
  2. 我手动文本处理提取pdf文件地址,接着丢浏览器批量下载被封了。。。查到这个文章。。。原来matlab还能干这个事。。。

    ReplyDelete