人生苦短,我用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) ) ).textauthors = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,author_xpath) ) ).textsource = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,source_xpath) ) ).textdate = WebDriverWait( driver, 10 ).until( EC.presence_of_element_located((By.XPATH ,date_xpath) ) ).textdatabase = 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")continuefinally:
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()

四、效果展示

不小心截大了嘿嘿~

省流:保存为数据格式


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

  1. 2023全新计算机专业毕业设计选题

    2023全新计算机专业毕业设计选题 对于计算机专业的学生最头疼的就是临近毕业时的毕业设计,对于如何选题,技术选型等这些问题,难道了大部分人,确实,还没毕业的学生对于这些问题还比较陌生,只有学习的理论知 ...

  2. 2023年计算机专业毕业实习报告最新

      2023年计算机专业毕业实习报告最新篇1 一.实习基本情况 按照学校对毕业生的要求,为毕业后的工作和谋职打下良好的基础.我于X年X月来到山西柳林汇丰兴业同德焦煤有限公司进行为期X个月的实习.毕业实 ...

  3. 计算机专业期刊参考文献,大学生计算机专业学论文参考文献 大学生计算机专业期刊参考文献哪里找...

    [100个]关于大学生计算机专业学论文参考文献汇总,作为大学生的毕业生应该明白了大学生计算机专业期刊参考文献哪里找,收集好参考文献后的大学生计算机专业论文写作起来会更轻松! 一.大学生计算机专业论文参 ...

  4. 计算机专业文献,最新大学计算机专业参考文献 大学计算机专业论文参考文献哪里找...

    [100个]最新大学计算机专业参考文献供您参考,希望能解决毕业生们的大学计算机专业论文参考文献哪里找相关问题,整理好参考文献那就开始写大学计算机专业论文吧! 一.大学计算机专业论文参考文献范文 [1] ...

  5. 计算机专业和机电专业的区别,12届计算机专业和机电专业.doc

    12届计算机专业和机电专业 12届计算机1班.12届机电1.2.3.4班 <计算应用基础>月考试题 学号:_________ 姓名:_________ 班级:_____________ 考 ...

  6. 2020年职业学计算机专业饱和,2020年计算机专业人才饱和?找不到工作了?传智专修学院告诉你答案...

    原标题:2020年计算机专业人才饱和?找不到工作了?传智专修学院告诉你答案 在当前的"高考季"正式来临之际,我们或多或少,都会听到类似的声音"2020年,计算机专业必定又 ...

  7. 干货|计算机专业大学生毕业后找工作应该考哪些证书

    大学生计算机专业毕业后,找工作前如果考取了某项证书,一般会被优秀的大公司看中,很容易从众多的毕业生中脱颖而出,因为刚毕业的大学生如果没有工作经验,那么他的优势就是考取的证书与所在学校是否是名牌.学校是 ...

  8. 2023年计算机专业还值得无脑梭哈吗——计算机类专业在读一年学生个人分享

    长忆观潮,满郭人争江上望.来疑沧海尽成空,万面鼓声中. 弄潮儿向涛头立,手把红旗旗不湿.别来几向梦中看,梦觉尚心寒. IT 界每隔几年就有一波浪潮或者泡沫,新的一波大潮已经打过来了,躲?能跑多远?不如 ...

  9. 2023年计算机专业不好找工作的原因是什么?

    计算机专业是一个就业前景较好的领域,但仍然存在一些因素可能导致计算机专业毕业生找工作相对困难.以下是一些可能的原因: **市场竞争激烈:**计算机专业吸引了大量的学生,导致市场上存在大量的竞争.大学生 ...

最新文章

  1. Open***服务器安装配置及客户端调试
  2. [HTTP]Etag的工作流程
  3. linux音频时钟bclk,linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系
  4. Spark安装及其sbt和maven 打包工具安装
  5. 【王道计组笔记】总线(1):总线的概念和分类
  6. android 悬浮窗截屏,GitHub - tyhjh/ScreenShot: Android截屏的封装
  7. 人人都可以做深度学习应用:入门篇(下)
  8. 移动端UML图应用之UML结构图——包图、部署图和组件图
  9. 树莓派4B修复双触摸屏触摸问题
  10. 【脚本工具】QQ个人数据管理方法与脚本
  11. 【推荐系统】今日头条推荐算法原理全文详解
  12. 谷歌浏览器设置中文教程
  13. linux安装qq 中文乱码,在Deepin系统下用Wine运行的QQ音乐界面出现乱码的解决
  14. Kong插件开发向导
  15. 网页的一个页面中显示另一个页面
  16. NXP I.MX芯片资源合集
  17. CQOI2016省选游记
  18. 一般网站有哪些类型的
  19. 装系统时遇到的常见问题汇总
  20. 学习Linux命令(34)

热门文章

  1. IE9下不打开F12调试工具无法打开页面的问题解决
  2. Python list列表添三种加元素的方法
  3. 程序员、架构师、技术经理、技术总监和CTO都是干什么的?
  4. AWR (Automatic Workload Repository)- 自动工作负载信息库
  5. cookie的作用之一——登录
  6. 5.资料下载:QT与MFC学习
  7. 2016年甲骨文全球大会创造极致云体验
  8. 二进制与八进制十进制十六进制之间的转换
  9. 卷积神经网络精确率不增反降_姿态跟踪论文研读--(1)利用卷积神经网络学习人体姿态估计特征...
  10. centos7中防火墙设置