本文首发于微信公众号:清贫王子
需要源代码文件的朋友们可以关注此微信公众号,然后回复关键词获取,谢谢!
做研究经常与参考文献打交道,有时我们需要下载某个学者主页上的全部已发表文献,得到主页网址,点进去,一个接一个的下呗......
如果主页上的文章少,那么手动下载还可以。但有些大牛的主页上挂的文章数量动辄百十来篇,一个接一个下载太浪费感情了......
呜呼哀哉!之前大意了啊,当时没有想,现在,我爬一下就想起来了,很快啊,可以用爬虫啊!
下面我们就以”纪辉“这位学者的主页为例,说明如何爬取他主页上的文献。
文献所在的url是https://blog.nus.edu.sg/matjh/publication/
,打开进入到下面的页面
然后用祖传大法:鼠标右键—检查,查看网页源代码。
可以看到,这些文献分布在<li>...</li>
这些列表中,里面包括题目和下载地址。
知道了爬取内容的所在位置,接下来有请 Matlab 登场,掌声欢迎......
先设置一些参数
options = weboptions('Timeout', randNum(1));
options.CharacterEncoding = 'UTF-8';
options.RequestMethod = 'get';
options.ContentType = 'text';
options.UserAgent = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64)', ...
' AppleWebKit/537.36 (KHTML, like Gecko)', ...
' Chrome/77.0.3865.120 Safari/537.36'];
然后webread
爬取网页内容
htmlContent = webread(url, options);
有了网页内容,我们再提取文献相关的内容,正则表达式是
pat = '(?<=<li>).*?(?=</li>)';
经过正则匹配后,得到了下面80条内容(对应80篇文献信息):
单独拿出其中一条分析一下:(以第一条为例)
<span style="font-size: 95%;"><strong>Watermarking deep neural networks in image processing</strong> [<a href="https://blog.nus.edu.sg/matjh/files/2020/04/TNNLS2020_watermark.pdf">PDF</a>] [<a href="https://github.com/painfulloop/Watermark-DnCNN">Github</a>]</span><br /><span style="font-size: 95%;"> Y. Quan, H. Teng, Y. Chen, and H. Ji,<br /> <em>IEEE Transactions on Neural Networks and Learning Systems,</em> xxx(x), xx-xx, xxx, 2020</span>
我们需要获取的详细内容包括,题目,年份,和文献下载地址。保存时将题目作为文件名(将提取的年份加入到题目开头处)保存。
题目夹在<strong>
和</strong>
中,下载地址在<a href="
和">
之间,年份在结尾</span>
前面,4位数字(注意到一些特殊的条目,如第41条中,年份后面是两个</span></span>)。匹配这些目标信息,将其他信息忽略,用regexprep
函数。
接下来就写出正则表达式
pat = '<span .+><strong>(.+?)</strong>\s*[<a .*?href="(.+?)">.+(\d{4})(?:</span>){1,2}';
最后匹配替换如下:
allContentSimp = regexprep(allContent, pat, '$3_$1_split_$2');
我们将年份后接一_
放到题目前面,而题目和下载地址之间加入_split_
以便后面分割字符。匹配完之后,得到如下的内容:
这时还没有完,题目和下载地址是在一块的,不过中间有_split_
字符连接着,所以接下来分别获取题目和下载地址,匹配代码如下:
singleContent = regexp(allContentSimp, '_split_', 'split');
题目和下载地址分离后,得到如下的内容:
容易知道,每个cell中的第1个分量是题目,第2个分量是下载地址,注意到题目中可能存在
:
,?
,/
等等的特殊字符,在作为文件名保存时会不合法,所以在批量下载前,过滤掉这些特殊字符。
以第80个条目为例,代码如下:
singlePaper = singleContent{80};
% Delete the end of space of sentence
title = regexprep(singlePaper{1}, '(.+?)\s*?$', '$1');
% Represent specific symbol
title = regexprep(title, ':|<sub>|</sub>|\?|\\|/', '_');
paperUrl = singlePaper{2};
% Save file
websave(title, paperUrl);
说明:该主页上的文献下载起来还是挺缓慢的(也是正常现象,手动下载pdf时,需要等到pdf文件在浏览器中加载完后,再点击保存按钮才下载下来文件,这里只不过是机器帮我们弄了。),可以晚上睡觉前开始进行,早上起来后再看结果吧!
下面是已下载的文件
总结一下:以后遇到大牛的主页上有N多篇papers的时候,我们不讲武德,简单写个脚本,让机器帮忙下载文献,但如果文献少的话,还是手动吧,杀鸡焉用牛刀。
今天的分享就到这里了,喜欢的朋友请点个赞,需要获取源代码的朋友们,请在公众号后台回复关键词:pdf文献 来获得下载链接。