2023届计算机专业弄潮儿如何快速找毕业论文文献?

news2024/11/26 14:47:19

人生苦短,我用Python

在这里插入图片描述

一、准备工作

软件选择

  • Python3.8
  • pycharm

模块

requests  #模拟请求
Selenium   # 浏览器自动化操作
  • win+r打开搜索框,输入cmd按确定打开命令提示符窗口,输入pip install 加上你要安装的模块名,
    回车即可安装,下载速度慢就换国内镜像源。
  • 然后要下载一个谷歌浏览器驱动,版本跟你的浏览器最相近的那个就行。

在这里插入图片描述

二、获取数据

页面分析

  • 首先分析一下页面元素,我们一般是在首页输入框中输入你想搜的内容,然后跳转到搜索页面。
    请添加图片描述
  • 我们通过浏览器的检查页面,得到输入框和搜索图标的XPATH分别为:
input_xpath = '/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/input[1]'
button_xpath =  '/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/input[2]'
  • 在输入框输入要搜索的内容,操作搜索按钮转到结果页。
  • 以搜索Python为例,共找到15,925条,300页,每页中包含20个条目,每个条目包含题目、作者、来源等等内容。
    请添加图片描述
  • 通过对当前页面分析发现每个条目对应的的xpath的规律
/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[1]/td[2]
  • 就是倒数第二个标签数字代表本页的第几个条目,最后一个标签 2 - 6
    分别代表题目、作者、来源、发表时间和数据库。在当前页面无法或者文献的摘要信息,下载链接,需要进一步点击进入相关文献条目。
  • 进入详情页面后,根据class name:abstract-text 能够很容易定位到摘要的文本,class name:
    btn-dlcaj 定位到下载链接,其他元素也是一样的。
    请添加图片描述

请添加图片描述

三、开始写代码!

导入要用的库

import time 
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from urllib.parse import urljoin

创建浏览器对象,设置相关参数

get直接返回,不再等待界面加载完成

desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "none"

设置谷歌驱动器的环境

options = webdriver.ChromeOptions()

设置chrome不加载图片,提高速度。

options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

设置不显示窗口

options.add_argument('--headless')

创建一个谷歌驱动器

driver = webdriver.Chrome(options=options)

设置搜索主题

theme = "Python"
~~~python
**设置所需篇数**

papers_need = 100

**打开页面搜索关键词**

*打开页面*
~~~python 
driver.get("https://www.****.net")

网址我屏蔽了,各位自己换一下换成最大的那个查文献论文的网站。

传入关键字

WebDriverWait( driver, 100 ).until( EC.presence_of_element_located( (By.XPATH ,'''//*[@id="txt_SearchText"]''') ) ).send_keys(theme)

点击搜索

time.sleep(3)

点击切换中文文献

WebDriverWait( driver, 100 ).until( EC.presence_of_element_located( (By.XPATH ,"/html/body/div[5]/div[1]/div/div/div/a[1]") ) ).click()
time.sleep(1)

获取总文献数和页数

res_unm = WebDriverWait( driver, 100 ).until( EC.presence_of_element_located( (By.XPATH ,"/html/body/div[5]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em") ) ).text

去除千分位里的逗号

page_unm = int(res_unm/20) + 1
print(f"共找到 {res_unm} 条结果, {page_unm} 页。")

解析结果页

赋值序号,控制爬取的文章数量。

count = 1

当爬取数量小于需求时,循环网页页码。

while count <= papers_need:

等待加载完全,休眠3S。
在适当的地方加上 time.sleep(3) 延时几秒,既可以等待页面加载,也可以防止爬取太快被封IP。

time.sleep(3)

title_list = WebDriverWait( driver, 10 ).until( EC.presence_of_all_elements_located( (By.CLASS_NAME  ,"fz14") ) )

循环网页一页中的条目

for i in range(len(title_list)):
    try:
        term = count%20   # 本页的第几个条目
        title_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[2]"
        author_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[3]"
        source_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[4]"
        date_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[5]"
        database_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[6]"
        title = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,title_xpath) ) ).text
        authors = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,author_xpath) ) ).text
        source = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,source_xpath) ) ).text
        date = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,date_xpath) ) ).text
        database = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,database_xpath) ) ).text

点击条目

title_list[i].click()

获取driver的句柄

n = driver.window_handles 

driver切换至最新生产的页面

driver.switch_to_window(n[-1])  

开始获取页面信息

# title = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h1") ) ).text
# authors = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h3[1]") ) ).text
institute = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,"/html[1]/body[1]/div[2]/div[1]/div[3]/div[1]/div[1]/div[3]/div[1]/h3[2]") ) ).text
abstract = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.CLASS_NAME  ,"abstract-text") ) ).text
try:
    keywords = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.CLASS_NAME  ,"keywords") ) ).text[:-1]
except:
    keywords = '无'
url = driver.current_url

获取下载链接

link = WebDriverWait( driver, 10 ).until( EC.presence_of_all_elements_located((By.CLASS_NAME  ,"btn-dlcaj") ) )[0].get_attribute('href')
link = urljoin(driver.current_url, link)

写入文件

res = f"{count}\t{title}\t{authors}\t{institute}\t{date}\t{source}\t{database}\t{keywords}\t{abstract}\t{url}".replace("\n","")+"\n"
print(res)
with open('CNKI_res.tsv', 'a', encoding='gbk') as f:
    f.write(res)

跳过本条,接着下一个。
如果有多个窗口,关闭第二个窗口, 切换回主页

except:
    print(f" 第{count} 条爬取失败\n")
    continue
        finally:
n2 = driver.window_handles
if len(n2) > 1:
    driver.close()
    driver.switch_to_window(n2[0])

计数,判断需求是否足够。

count += 1
if count == papers_need:break

切换到下一页

WebDriverWait( driver, 10 ).until( EC.presence_of_element_located( (By.XPATH ,"//a[@id='PageNext']") ) ).click()

关闭浏览器

driver.close()

四、效果展示

不小心截大了嘿嘿~

省流:保存为数据格式

请添加图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uml图 各连接线的含义

目录UML类图六种关系的总结1.泛化&#xff08;Generalization&#xff09;2.实现&#xff08;Realization&#xff09;3.关联&#xff08;Association&#xff09;4.聚合&#xff08;Aggregation&#xff09;5.组合&#xff08;Composition&#xff09;6.依赖&#xff08;Depen…

渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)

文章目录前言一、JS前端的修改前言 最近学习了一些有关于JS脚本搭建网站方面的安全知识。通常来说JS是前端的页面代码&#xff0c;因此我们可以直接修改前端的JS代码来实现绕过&#xff0c;故我试着做了一下利用浏览器的开发者工具进行尝试修改页面&#xff0c;以此来直接进行…

<Python>使用python来控制windows系统音量

使用python可以对windows系统的音量进行读取或者设置。 平台&#xff1a;visual studio code 语言&#xff1a;python 需要的python模块&#xff1a; 1、pyqt5 2、ctypes&#xff1a; ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型&#xff0c;并允许调用 DLL …

中国芯,SNS521系列水燃行业云芯产品获奖

近日&#xff0c;由运营商财经网举办的2023中国财经TMT“领秀榜”盛典召开&#xff0c;天翼物联连获四个奖项&#xff0c;分别是&#xff1a;2022年度优秀物联网企业、2022年度5G最佳实践引领企业、2022年度运营商科技创新引领企业以及“SNS521系列水燃行业云芯产品”获2022年度…

命名空间!C++之路扬帆起航

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 目录一、前言二、命名空间1、命名空间的定义Ⅰ、正常定义Ⅱ、嵌套定义Ⅲ、不连续定义2、命名空间的使用Ⅰ、域解析操作符Ⅱ、us…

工作流代码

工作流代码目录概述需求&#xff1a;设计思路实现思路分析1.at parata:2.cash20193.cashEntity4.cashFrmTemplate5.chartType:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make…

分享85个PHP源码,总有一款适合您

PHP源码 分享85个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1606ndyliGtwnjU8vsCLGRg?pwdq0k2 提…

MyBatis -- 参数占位符 #{} 和 ${}

MyBatis -- 参数占位符 #{} 和 ${}一、准备工作二、参数占位符 #{} 和 ${}三、特殊场景3.1 特殊场景 1 -- String3.1.1 使用 #{}3.1.2 使用 ${}3.1.3 分析与解决3.2 特殊场景 2 -- MySQL 关键字3.3 特殊场景 3 -- SQL 注入问题 (重要)3.4 特殊场景 4 -- 模糊查询 like一、准备工…

测试开发 | 想测试入门就必须要懂的软件开发流程

本文节选自霍格沃兹测试学院内部教材 从事软件测试行业&#xff0c;每天面对的被测对象都是软件。如果想要更好的去完成测试工作&#xff0c;首先需要对被测对象&#xff0c;也就是对软件要有基本的了解。 软件 与计算机系统操作有关的计算机程序、可能有的文件、文档及数据。…

多轮对话(二):多轮对话理解的研究进展和主流方法

本文是基于 Advances in Multi-turn Dialogue Comprehension: A Survey。这是一篇综述论文&#xff0c;我也顺便总结一下像我一样的小白&#xff0c;怎么读综述好一些。我读综述是为了快速切入某领域&#xff0c;比如我以前做的是跨模态检索&#xff0c;现在要进入对话系统&…

C++STL-stackqueue的实现

文章目录1. deque的简单介绍1.1 deque的原理介绍1.2 deque的优缺点1.3 为什么选择deque作为底层默认容器2. stack的实现3. queue的实现1. deque的简单介绍 在前面已经介绍过&#xff0c;stack和queue这两个容器适配器&#xff0c;是由deque这个容器封装的。现在我们就需要先学…

易观千帆 | 11月用户体验GX评测:银行APP用户体验稳定提升,从流量竞争逐渐转向用户体验竞争

易观&#xff1a;随着银行行业对用户体验的重视&#xff0c;手机银行APP用户体验稳定提升&#xff0c;竞争也从注重MAU的流量竞争逐渐转移为用户体验竞争。11月易观千帆用户体验GX评测显示&#xff0c;平安口袋银行、中国工商银行、招商银行仍是AAAAA级&#xff0c;在用户体验维…

对于搞钱我们是认真的

前言 大家好&#xff0c;我是xiezhr。一提到搞钱&#xff0c;想必大家都非常非常感兴趣&#xff0c;立马就精神抖擞了。说实话&#xff0c;在这疫情爆发这几年里&#xff0c;赚点钱真不容易。 不知道你是不是也跟我一样&#xff0c;一个人在夜深人静的时候就在想怎么才能通过自…

十三.动态内存管理

目录 一.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc函数 2.free函数 3.calloc函数 4.reallco函数 三.常见的动态内存错误 1.对NULL空指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟的内存使用free释放 4.使用free释放一块动态开辟内存的一…

HTML实现除夕最美烟花,2023春节倒计时,新年不可没有烟花,最炫烟花代码分享

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2023/01/17&#x1f4c5; 最近更新时间&#xff1a;2023/01/17&#x1f935; 此马非凡马&#xff0c;房星本是星。向前…

Android入门第58天-真机调试

开篇 随着我们的Android开始慢慢往后面涉及到设备、网络、通讯内容的开发。我们开始要把真机调试提上日程来了。 比如说&#xff1a;我们用Android扫描barcode、二维码都需要使用到Android的摄像头。而在Android Studio的AVP&#xff08;模拟器&#xff09;里&#xff0c;它的摄…

【树莓派4B】搭建HomeAssistant服务端(二)(systemd配置开机自启动,cpolar内网穿透)

设置开机自启动 创建home-assistanthomeassistant.service服务&#xff1a; sudo nano /etc/systemd/system/home-assistanthomeassistant.service复制以下内容&#xff0c;定义服务&#xff0c;其中After定义先行服务&#xff0c;ExecStart执行启动脚本&#xff1a; [Unit]…

程序跑起来数据总是关闭及丢失?保存进文件里面美滋滋

文章目录前言文件是什么&#xff1f;程序文件数据文件文件名C语言中的文件打开和关闭文件指针文件的打开和关闭fopenfclose文件的顺序读写文件的随机读写fseekftellrewind文件读取结束的判定feof&#xff1a;我们之间可能有误会文件缓冲总结前言 我们或许都有这样的苦恼&#…

【手写 Vue2.x 源码】第二十八篇 - diff算法-问题分析与patch优化

一&#xff0c;前言 首先对 6 月更文内容做一下简单的回顾&#xff1a; Vue2.x 源码环境的搭建Vue2.x 初始化流程介绍对象的单层、深层劫持数组的单层、深层劫持数据代理的实现对象、数组数据变化的观测Vue 数据渲染流程介绍模板生成 AST 语法树AST 语法树生成 render 函数re…

【Java寒假打卡】Java基础-XML文件

【Java寒假打卡】Java基础-XML文件概述标签的规则xml的语法规则解析XMLXML解析的准备工作XML解析文件的代码实现概述 标签的规则 xml的语法规则 <?xml version"1.0" encoding"UTF-8" ?> <!--本xml文件用于描述多个学生信息--> <students&…