PyQt5-论文爬取程序

1、编辑主窗体页面

步骤和我之前编辑12306车票信息窗口类似,在这里就不一一赘述了,直接上代码!
paper.py

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(720, 720)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 0, 720, 270))
        self.label.setStyleSheet("background-image: url(:/jpg/1.jpg);")
        self.label.setText("")
        self.label.setObjectName("label")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 270, 721, 80))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.label_2 = QtWidgets.QLabel(self.frame)
        self.label_2.setGeometry(QtCore.QRect(160, 30, 54, 21))
        self.label_2.setObjectName("label_2")
        font = QtGui.QFont()
        font.setPointSize(10)
        self.label_2.setFont(font)
        self.textEdit = QtWidgets.QTextEdit(self.frame)
        self.textEdit.setGeometry(QtCore.QRect(220, 20, 81, 41))
        self.textEdit.setObjectName("textEdit")
        font = QtGui.QFont()
        font.setPointSize(14)
        self.textEdit.setFont(font)
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setGeometry(QtCore.QRect(450, 20, 75, 41))
        self.pushButton.setObjectName("pushButton")
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(0, 350, 721, 371))
        self.tableView.setObjectName("tableView")
        self.model = QStandardItemModel()
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.tableView.horizontalHeader().setVisible(False)
        self.tableView.verticalHeader().setVisible(False)
        font = QtGui.QFont()
        font.setPointSize(7)
        self.tableView.setFont(font)
        self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.tableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

2、编辑用于获取论文信息的文件

core.py
这文件中作者有注释,在这就不一 一讲解了

# %%

# 导入所需模块
from asyncio.windows_events import NULL

import requests
import re
import os
import urllib.request
from urllib.request import urlretrieve


# %%

# 获取URL信息
def get_url(key,page):
    if page==1:
        page=0
    else:
        page*=10
    url = 'https://xueshu.baidu.com/s?wd=' + key +'&pn='+page+ '&ie=utf-8&tn=SE_baiduxueshu_c1gjeupa&sc_from=&sc_as_para=sc_lib%3A&rsv_sug2=0'
    return url




# %%

# 设置请求头
headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    'Referer': 'https://googleads.g.doubleclick.net/'
}

# %%
# 获取相关论文的DOI列表
def get_paper_link(headers, key,page):
    response = requests.get(url=get_url(key,page), headers=headers)
    res1_data = response.text
    # 找论文链接
    paper_link = re.findall(r'<h3 class=\"t c_font\">\n +\n +<a href=\"(.*)\"',
                            res1_data)
    doi_list = []  # 用一个列表接收论文的DOI
    for link in paper_link:
        paper_link = 'http:' + link
        response2 = requests.get(url=paper_link, headers=headers)
        res2_data = response2.text
        # 提取论文的DOI
        try:
            paper_doi = re.findall(r'\'doi\'}\">\n +(.*?)\n ', res2_data)
            if str(10) in paper_doi[0]:
                doi_list.append(paper_doi)
        except:
            pass
    return doi_list


# %%

在这作者还多讲一句如果链接失败可以在请求开头中加入cookie

3、在主窗体中加上相关方法

(1)编辑用点击查询按键的方法on_Click

    def on_Click(self):#查询按键
        DATA = [[0 for i in range(3)] for j in range(100)]  # 创建二维数组
        get_key = self.textEdit.toPlainText()  # 获取UI端输入的查询值
        get_page = self.textEdit_2.toPlainText()#获取UI端输入的查询页数
        doi_key = get_paper_link(headers, get_key, get_page)  # 获取关论文的DOI列表
        if get_key == '':
            self.messageDialog('警告!', '不能为空!!!')
        n=0
        # 创建提取论文的文件夹
        if not os.path.isdir('./data'):
            os.mkdir('./data')
        for doi in doi_key:  # 遍历相关论文的DOI列表
            for i in doi:
                url = 'https://sci.bban.top/pdf/' + i + '.pdf'  # 设置下载论文网址
                l = requests.get(url=url, headers=headers)  # 查看网站是否响应
                if str(l) == '<Response [200]>':  # 响应则执行
                    file = urllib.request.urlopen(url)  # 获取响应结果
                    data = file.read()  # 读取全部
                    dataline = file.readline()  # 读取一行内容
                    fhandle = open('./data/' + get_key + str(n)+'_'+get_page + '.pdf', "wb")  # 将爬取的PDF保存在本地data
                    fhandle.write(data)
                    fhandle.close()
                    demo = (get_key + str(n)+'_'+get_page + '.pdf')  # 获取文件名
                    pant = os.path.abspath('./data/' + demo)  # 获取文件地址
                    datas = [('下载成功:' + url), ('文件名:' + get_key + str(n)+'_'+get_page), ('路径:' + pant)]  # 加入到一维数组
                    # 将获取到的信息加入到二维数组
                    for k in range(3):
                        DATA[n][k] = datas[k]
                    n += 1
                else:
                    datas = [('下载请求错误:' + url)]
                    for k in range(1):
                        DATA[n][k] = datas[k]
                    n += 1

        self.displayTable(n, 3, DATA)  # 表格方法

注意这里的page页数是学术网站搜索论文显示搜索到多少页的页数
(2)编辑存储表格方法displayTable

    def displayTable(self, train, info, DATA):#表格
        self.model.clear()
        for row in range(train):
            for column in range(info):
                # 添加表格内容
                item = QStandardItem(DATA[row][column])
                # 向表格存储模式中添加具体信息
                self.model.setItem(row, column, item)
        self.tableView.setModel(self.model)  # 设置表格存储数据的模式

(4)编写提示错误信息的方法messageDialog 但愿你用不到


    def messageDialog(self, title, message):#提醒
        msg_box = QMessageBox(QMessageBox.Warning, title, message)
        msg_box.exec_()

(5)编写show_mainWindow方法用于实例化UI界面

def show_mainWindow():
        app = QtWidgets.QApplication(sys.argv)  # 首先必须实例化QApplication类,作为GUI主程序入口
        MainWindow = QtWidgets.QMainWindow()  # 实例化QtWidgets.QMainWindow类,创建自带menu的窗体类型QMainWindow
        ui = Ui_MainWindow()  # 实例UI类
        ui.setupUi(MainWindow)  # 设置窗体UI
        MainWindow.show()  # 显示窗体
        sys.exit(app.exec_())  # 当来自操作系统的分发事件指派调用窗口时,

最后加上

if __name__ == "__main__":
        show_mainWindow()

就可以正常运行了

4、程序运行截图

在这里插入图片描述
在这里插入图片描述

软件在运行的过程中出现主窗体未响应也是正常的因为软件后台程序要下载需要时间
如果想获取或者了解更多资源可以联系作者

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值