文章目录

  • 一、写在前面
  • 二、准备工作
  • 三、开始爬取
  • 四、效果展示

一、写在前面

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

二、准备工作

使用软件
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) ) ).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()

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

四、效果展示

兄弟们,记得随手三连,你的助力是我更新的动力~

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

  1. 文献爬虫小试(不如直接用Endnotes或其他文献管理软件)

    #!/usr/bin/python import requests from bs4 import BeautifulSoup as bs from requests import status_co ...

  2. 聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包

    聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包 前言 分析页面 具体实现 解析页面 获取网页内容 解析网页内容 文件下载 多线程下载 成果 总结 前言 事情要从几天前说起,我有一个朋 ...

  3. 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用...

     四个主要操作类:JsonConverter .JsonHelper .JsonSplit .AjaxResult 一.JsonConverter: 自定义查询对象转换动态类.object动态类转换j ...

  4. fetch git pull 切换_每天提交 Git 太烦?直接用 Python 就好了!

    作者:匿蟒 链接:https://note.qidong.name/2018/01/gitpython 对于协作开发的项目,每天开发前后更新和提交 Git 仓库是基本操作.但作为总是想偷懒的程序员,一 ...

  5. python 人像素描_谁说程序员不懂浪漫的,直接用 Python 给女朋友画张素描

    现在总有人说什么程序员不够浪漫!天真,你以为是真的不够浪漫吗? 其实我们只是没时间而已,每天都这么忙,不是开发程序就是修bug,都要聪明绝顶了, 哪还有精力搞浪漫,不过,等我们有时间了,那就没有你们普 ...

  6. 表弟准备买房,让我帮他分析分析哪个小区最合适,我直接用python下载了本地所有房源信息做成了可视化图

    文章目录

  7. 今天吃什么?我直接用Python制作随机食物生成器

    前言 咳咳,今天中午吃什么啊,今天晚上吃啥,emm夜宵吃啥 不知道你们每天有没有问过这些问些问题,我基本上天天问,问完后想吃这个又想吃那个,纠结的要命,还不如搞个随机食物生成器 有些朋友就说了,这种东 ...

  8. python处理完数据导入数据库_全国最新行政区划省市区三级数据表(2018年9月),可直接用Python处理后导入数据库...

    本资料为最新整理的全国行政区划数据表,数据截至到2018年9月1日,共包含省市区4291个(34个省份 396个城市 3857个区县),内容包含名称.全称.全拼.简拼.省市区聚合.邮编.经度.纬度等! ...

  9. 爬虫推特数据分析的外文文献_科研人必备:一个工具搞定文献查阅、数据分析、模型搭建...

    发表论文,是每个科研人的必经之路!你想要毕业.拿奖金.评职称.争取资金.争取项目,必须发表论文.跟论文打交道的过程足以写成一本20万字的"爱恨情仇史"了. 从选题开始,到大量查阅文 ...

最新文章

  1. 这是我读过写得最好的【秒杀系统架构】分析与实战!
  2. php xml对象解析_php解析xml 的四种简单方法(附实例)
  3. 嵌入式ARM多核处理器并行化方法
  4. springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载
  5. 为什么电脑不能打字_嘉兴在线丨「生活经济学」为什么笔记本电脑能在任何国家的供电标准下运作,其他大部分电器却不能?...
  6. 安装Ubunutu音频视频库
  7. 如何解决网页中console的显示内容出现undefined和null_如何优雅地处理前端异常?...
  8. 扎克伯格5小时听证鏖战:五大焦点,四处尴尬,一次耿直CEO笑翻全场
  9. Java面试题300道
  10. Latex学习笔记 (8) 字体样式之衬线字体与无衬线体字体
  11. 商务数据分析与应用学习笔记
  12. WinSock IO模型五: 完成端口
  13. 机器学习系列2---经验风险最小化原则和结构风险最小化原则与VC维问题
  14. 卡西欧计算机储存数据,卡西欧计算器(统计计算)操作.ppt
  15. mac查看、修改文件权限
  16. 中国移动云mas短信对接(webservice)
  17. python中pos是什么_如何在NLTK中使用pos_标记?
  18. linux系统编程之管道(三):命名管道FIFO和mkfifo函数
  19. 如何在OpenLDAP启用MemberOf
  20. Unity3d游戏制作 建模与蒙皮

热门文章

  1. 计算机网络原理 作业
  2. 个人博客开源系统XBlog介绍和部署
  3. Z2021年全球家用自动血压计收入大约1018.7百万美元,预计2028年达到1194.2百万美元,2022至2028期间,年复合增长率CAGR为 %。同时2020年全球家用自动血压计销量大约 ,预计
  4. Java——博主的学习路线
  5. 车载DSP音频功放淡入淡出算法实现方法
  6. yolo-v3代码学习
  7. Java生成PDF文件(Itext篇)
  8. 私域流量运营的工作内容有哪些,SCRM系统能做什么?
  9. 如果当初......
  10. 原生JS制作最简单轮播图(超清晰思路)