毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服

2023-11-06

一、写在前面

马上要毕业了兄弟们,毕业论文是个麻烦事,论文要的资料得一条一条去网上查看,那多浪费时间,咱直接写个爬虫,批量下载慢慢看,不舒服?

在这里插入图片描述

二、准备工作

使用软件
Python和pycharm就可以了,版本的话都行,只要你别用python2。

模块

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"

设置所需篇数

papers_need = 100

打开页面搜索关键词

打开页面

driver.get("https://www.****.net")

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

传入关键字

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

点击搜索

WebDriverWait( driver, 100 ).until( EC.presence_of_element_located( (By.XPATH ,"/html/body/div[1]/div[2]/div/div[1]/input[2]") ) ).click()
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

去除千分位里的逗号

res_unm = int(res_unm.replace(",",''))
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()

到这里所有的功能都实现了,完整代码在左侧的交流基地可以找到。

四、效果展示

在这里插入图片描述兄弟们,记得随手三连,你的助力是我更新的动力~

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服 的相关文章

随机推荐

  • Vc - Qt - 仿照微信聊天窗口 - demov.1.0 初步展示

    项目是开源的 项目所在的github的地址 https github com JLZJMWSY Win32 https github com JLZJMWSY Win32 https github com JLZJMWSY Win32下的Q
  • for循环执行顺序---看一篇就懂了。

    for循环是程序代码中我们使用最多的循环体 当然了while do while也经常使用 其中do while常用于循环体无论判断条件是否正确 都会至少执行一次 for int i 0 i lt 5 i 循环体 执行顺序解抛 执行的顺序如下
  • echarts pie饼图既显示内部又显示外部指示线

    查了echarts 文档 并不能通过简单的配置来实现 原因如下 在单个serie的label中 只能设置一个label 位置可以选择在饼图内部inner 或者饼图外部outer 无法实现同时实现内部 外部显示 想到设置两个serie 让两个
  • Java三部曲(二)JavaWeb

    前言 1 什么是JavaWeb Web 全球广域网 也成为万维网 www 能通过浏览器访问的网站 JavaWeb 用Java开发网站的技术栈 2 本教程的基础框架 网页端 展现数据 HTML 制作页面 CSS 美化页面 JavaScript
  • matlab三维图形的绘制

    采用matlab进行三维图绘制 1 mesh函数 网格图 mesh x y z x是n维向量 y是m维向量 z是m n维向量 x 1 0 1 10 y 1 0 1 10 x y meshgrid x y z x 2 y 2 mesh x y
  • 十种排序算法概览

    十种排序算法概览 快速记忆表格 快速回忆各算法 01 冒泡排序 02 选择排序 03 插入排序 重点 04 希尔排序 05 归并排序 重点 06 快速排序 重点 07 堆排序 重点 08 计数排序 09 桶排序 10 基数排序 练习 本文旨
  • 跟我一起写 Makefile(一)

    跟我一起写 Makefile 陈皓 概述 什么是makefile 或许很多Winodws的程序员都不知道这个东西 因为那些Windows的IDE都为你做了这个工作 但我觉得要作一个好的和professional的程序员 makefile还是
  • 基于深度学习的YOLO目标检测研究-附Matlab代码

    目录 一 引言 二 YOLO的基本思想 三 实验验证 四 参考文献 五 Matlab代码获取 一 引言 目标检测是计算机视觉中的一个研究热点 在很多领域都有应用需求 例如监控安全 自动驾驶 交通监控和机器人视觉等场景 目标检测一般是检测一些
  • 华为OD机试真题2022Q4 A + 2023 B卷(JAVA&JS)

    华为机试题库已于5月10号由2022Q4 A卷 切换 为2023 B卷 各位同学如果收到的是A卷则刷下面的题 如果收到的是B卷则去B卷区刷题 B卷区地址 华为OD机试真题2023 B卷 JAVA JS 华为机试有三道题目 第一道和第二道属于
  • 论文笔记C3D:Learning Spatiotemporal Features with 3D Convolutional Networks

    思考 对视频进行描述 其描述子必须 1 具有普遍性以适应各种场景 2 必须短小紧凑 3 必须利于计算 4 必须易于实现 图像识别中 特征提取的很完备和优秀 但不适用于视频 本文致力于利用3D CNN提取时空特征 我们只用线性分类器来分类它们
  • JavaWeb——基础知识

    Java Web开发的基础内容 Servlet 增加了几个限制的Java类 所以开发一个Servlet并不复杂 然后就是把Servlet部署到web服务器上 Tomcat这个老人家现在身体依然硬朗 然后就等待客户的请求就可以了 Servle
  • 铁岭python培训班

    进入12月后 大部分学校2022的春招也开始收尾 家长们一定要抓紧最后的机会 不管是探校择校 还是插班入学 都要把握时间做好准备 还没确定孩子去哪所学校的家长们 小初高12月开放日 专场来了 今年最后1波开放日活动 包含校园参观 课程体验
  • OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading “C:\ProgramData\Anaconda3\lib\site-packages\to

    完整报错OSError WinError 1455 页面文件太小 无法完成操作 Error loading C ProgramData Anaconda3 lib site packages torch lib shm dll or one
  • 为你精选107个本科软件工程专业的计算机毕业设计项目推荐

    当面对茫茫计算机毕业设计题目海洋 你是否感到无所适从 不知如何选出一个富有创新意义的题目 今天 我们将为大四的同学们分享一些毕业设计项目 希望能给你的毕业设计带来一些灵感 一 成品列表 以下所有springboot框架项目的源码博主已经打包
  • sql:mysql:截取某个字符 1.最后一次出现的之前的字符串 2.最后出现那次的之后的字符串

    截取某个字符最后一次出现 如 之前的字符串 示例字符串 我是 中国 人 select REVERSE 我是 中国 人 from dual 人 国中 是我 select INSTR REVERSE 我是 中国 人 1 from dual 2
  • [零刻]EQ12&EQ12Pro安装OpenWRT软路由教程

    OpenWRT系统安装 安装前准备 1 U盘一个 2 WePE写盘工具 3 Openwrt固件 4 Img镜像写盘工具 安装步骤 1 首先下载WePE写盘工具 制作一个PE系统安装环境 启动软件后 选择安装PE到U盘 2 插入U盘后 刷新一
  • jQuery 查找文本并高亮

    让我们来看一下如何使用 jQuery 去查找或搜索一段文本并高亮它 我是 jQuery 的忠实粉丝 喜欢它简介的语法 接下来让我演示一个示例 仅使用一行 jQuery 代码便可把搜索字段进行高亮
  • <HTML>简单登录页面代码

    这是一个简单的静态的html页面登录图片 之前写的 验证码方面没有搞懂 这里我重新参考了这里 但是部分功能还没有完善 仅供参考
  • 2023年全国硕士研究生入学统一考试英语(一)试题

    2023年全国硕士研究生入学统一考试英语 一 试题 Section I Use of Englis Directions Read the following text Choose the best word s for each num
  • 毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服

    文章目录 一 写在前面 二 准备工作 三 开始爬取 四 效果展示 一 写在前面 马上要毕业了兄弟们 毕业论文是个麻烦事 论文要的资料得一条一条去网上查看 那多浪费时间 咱直接写个爬虫 批量下载慢慢看 不舒服 二 准备工作 使用软件 Pyth