Loading...
墨滴

图像处理与MATLAB

2021/09/27  阅读:44  主题:姹紫

爬取某学者主页上的文献

爬取某学者主页上的文献

做研究经常与参考文献打交道,有时我们需要下载某个学者主页上的全部已发表文献,得到主页网址,点进去,一个接一个的下呗......

如果主页上的文章少,那么手动下载还可以。但有些大牛的主页上挂的文章数量动辄百十来篇,一个接一个下载太浪费感情了......

呜呼哀哉!之前大意了啊,当时没有想,现在,我爬一下就想起来了,很快啊,可以用爬虫啊!

下面我们就以”纪辉“这位学者的主页为例,说明如何爬取他主页上的文献。

文献所在的urlhttps://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条中,年份后面是两个)。匹配这些目标信息,将其他信息忽略,用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文献 来获得下载链接。

图像处理与MATLAB

2021/09/27  阅读:44  主题:姹紫

作者介绍

图像处理与MATLAB