一个python自动下载论文的爬虫程序

自动获取想要的论文

2/7更新:
我太蠢了,谷歌chrome浏览器ctrl+F可以搜索关键字,我写完才想起来百度一下(脑海里记得是有一个搜索快捷键的),写代码的好处就在于写好了就不用自己动手了,问题是代码菜鸡写代码也需要点时间···
原:
由于我们研究方向是NLP下面的谣言检测大方向,于是最近在看nlp顶会论文,但是每一年的会议都会收录好几百篇,如此好几个顶会一共就有上千篇论文需要筛选。懒狗的我选择要不试一试写个小代码爬取下来,带有特定字符串的顶会论文。
论文都是在dblp上找的,url规律比较简单,分为以下几步:

  • 找出每篇论文url的相似点
  • 寻找匹配特定字符串的论文
  • 获取到该论文的pdf_url
  • 根据该pdf_url下载pdf

找出每篇论文url的相似点

nlp顶会——ACL、NAACL、EMNLP、COLING。以2020会议为例:
ACL:https://www.aclweb.org/anthology/2020.acl-main.1/(共778篇,每篇url只有最后一位数字不同)
NAACL:https://www.aclweb.org/anthology/N19-1001/(共424篇,1000初始值+篇数值)
EMNLP:https://www.aclweb.org/anthology/2020.emnlp-main.1/(共752篇,同acl)
COLING会议2020我已经看过了,方法是一样的。

寻找匹配特定字符串的论文

找到了论文标题后,筛选出带有特定字符串(研究方向常见单词或词组),如我选的:search、pagerank、extraction、detection、fake news、rumor、bert、graph convolution、graph neural、等(全部采用小写匹配)

if ("search" in title.lower() or "pagerank" in title.lower() or "extraction" in title.lower() or "detection" in title.lower() or "fake news" in title.lower() or "rumor" in title.lower() or "graph convolution" in title.lower() or "graph neural" in title.lower() or "bert" in title.lower()) == True:

获取到该论文的pdf_url

每种会议的pdf和论文的url几乎一样,主要差别为后缀.pdf
如ACL:https://www.aclweb.org/anthology/2020.acl-main.1.pdf(其他会议类似),NAACL会议pdf_url如下:

pdf = "https://www.aclweb.org/anthology/N19-" + str(1000+i) + ".pdf"

根据该pdf_url下载pdf

res = requests.get(pdf, headers=headers)
        filename = title.lower() + '.pdf'
        with open(filename, 'wb+') as f:
            f.write(res.content)
        print(str(i) + ':download ' + "%s" % pdf + ' success!')

完整代码

以下载EMNLP会议论文为例(换其他会议只改url参数):

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""=================================================
@Project -> File   :download_papers -> get_pdf
@IDE    :PyCharm
@Author :SallyLee
@Date   :2021/1/21 17:30
=================================================="""
import requests
import re
import string

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}


def remove_symbols(sentence):
    # 保存pdf时如果paper_title被符号分隔,就将符号转换为空格
    replace = " " * len(string.punctuation)
    tran_tab = str.maketrans(string.punctuation, replace)
    sentence = sentence.translate(tran_tab)
    return sentence


def get_pdf(pdf):
    # 获取到匹配特定词组论文的pdf
    res = requests.get(pdf, headers=headers)
    temp = re.split('[:,?]', title.lower())
    if len(temp) > 1:
        filename = remove_symbols(title.lower()) + '.pdf'
    else:
        filename = title.lower() + '.pdf'
    with open(filename, 'wb+') as f:
        f.write(res.content)


if __name__ == '__main__':
    for i in range(1, 753):
        url = 'https://www.aclweb.org/anthology/2020.emnlp-main.' + str(i) + '/'
        try:
            res = requests.get(url, headers=headers)
            html = res.text
        except requests.exceptions.ConnectionError:
            print(str(i) + ':Connection refused!')

        try:
            title = re.findall('<title>(.*) - ACL Anthology</title>', html)[0]
        except:
            # 抛出列表长度异常,然后忽略该篇论文
            print(str(i) + ":list exception!")
            continue

        if ("search" in title.lower() or "pagerank" in title.lower() or "extraction" in title.lower() or "detection" in title.lower() or "fake news" in title.lower() or "rumor" in title.lower() or "graph convolution" in title.lower() or "graph neural" in title.lower() or "bert" in title.lower()) == True:
            pdf = "https://www.aclweb.org/anthology/2020.emnlp-main." + str(i) + ".pdf"
            print(str(i) + ':' + pdf + " is found!")
            get_pdf(pdf)
            print(str(i) + ':download ' + "%s" % pdf + ' success!')
        else:
            print(str(i) + ':' + "no suitable match!")

    print("————searching finished————")

结果分析

保存为pdf格式,名称为论文的标题

其中解决了两个问题:
1:保存时按照论文标题小写保存,遇到:或者,分隔符会报错,函数remove_symbols将标题中的符号转换为空格(没想到更好的办法)
2:遇到list index out of range问题时忽略该篇论文继续查找

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值