IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python使用selium模块模拟浏览器,在知网高级检索页面进行全文检索并获取页面数据录入excel(非下载文献) -> 正文阅读

[Python知识库]python使用selium模块模拟浏览器,在知网高级检索页面进行全文检索并获取页面数据录入excel(非下载文献)

序言

场景是在知网高级检索界面中,选择报纸–>点击包含非学术文献–>改成全文模式–>点击检索页发表年度–>获取括号内的数字和对应的年份
在这里插入图片描述

需要三个库,都可以用pip install轻松下载,稍微麻烦点儿的是需要去下载个对应版本的chromedriver.exe驱动,放到python或者Anaconda的文件夹目录下,然后添加环境变量(这部分报错了自行百度即可,操作起来不麻烦的)

注意time.sleep()是必要的,一是为了避免频繁操作被浏览器提醒,二是在网络不好的情况下让网页加载完全,否则都会导致报错

一定不要图快,目前我是8s左右完成一次检索和数据录入,老师给我的要求是700次左右,也就运行个一个半个小时

这之中还会遇到诸多问题,在代码的注释里也都写到了

函数模块介绍

创建模拟浏览器对象

# 返回虚拟浏览器对象
def openUrl(url):
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(3)
    return driver

只需要执行一次的部分

xpath如何获取百度一下即可

# 只运行一次,避免重复操作影响效率
def onceClick(driver):
    #选择报纸栏
    driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/ul[1]/li[4]/a').click()
    time.sleep(2)
    #点击包含非学术文献
    driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/label/input').click()
    time.sleep(1)
    #更改为全文模式
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/div[1]').click()
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/div[1]/div[2]/ul/li[5]').click()
    time.sleep(2)

需要批量执行的重复操作部分

这部分主要是知网页面的交互产生的问题,反复改了好几次终于解决了

第一次检索的时候发表年度页面是关着的
在这里插入图片描述
第二次又变成了不关,但是如果要获取更多需要点击最下面的键,因此引入了flag(结合主函数看)
在这里插入图片描述
try-except是为了防止年份数量不足而报错,因为有些关键词出现得很少,就不需要点击上图这个键,如果不try掉就会报错终止运行

# 输入关键词并点击,循环操作
def send_and_click(driver,kw,np,flag): 
    #输入主题词
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/input').send_keys(kw)
    time.sleep(0.5)
    #输入报纸名字
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[3]/div[2]/input').send_keys(np)
    time.sleep(0.5)
    #点击检索
    driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input').click()
    time.sleep(1.5)
    
    if flag==True:
        #第一次检索时需要展开发表年度大标题
        driver.find_element_by_xpath('//*[@id="divGroup"]/dl[3]/dt').click()
        time.sleep(2)
    if flag==False:
        #第二次开始,发表年度仅缩小,没有收回到大标题,所以展开发表年度缩小的页面,
        #使用try-except是为了防止年份数量不足而报错,影响程序进行
        try:
            driver.find_element_by_xpath('//*[@id="divGroup"]/dl[3]/dd/div/a').click()
            time.sleep(1)
        except:
            pass
        
    #打开被缩小的检索页
    driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[2]/a[2]').click()
    time.sleep(0.5)
    #清空原有内容
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/input').clear()
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[3]/div[2]/input').clear()
    time.sleep(1)

获取网页数据

这个部分主要还是根据自己的需求来,这边我是返回列表

# 获取内容并返回数量列表
def getData_and_print(driver,tw,dp):
    cntDict={}
    for index in range(1,13):
        try:
            text1=driver.find_element_by_xpath('//*[@id="divGroup"]/dl[3]/dd/div/ul/li['+str(index)+']').text
            cntDict[text1[:4]]=text1[5:-1]
        except:
            continue       
    for i in years:
        if i not in cntDict.keys():
            cntDict[i]='0'       
    cnttuplelist=[]
    cntlist=[]
    for i in sorted (cntDict,reverse=False): 
        if int(i)>=2011 and int(i)<=2018:
            cnttuplelist.append((i, cntDict[i]))
            cntlist.append(cntDict[i])     
        else:
            continue

    for ct1,ct2 in cnttuplelist:
        print(dp+'\t\t\t'+ct1+'\t'+tw+'\t\t'+ct2)      
    return cntlist 

录入excel

这个部分也是根据自己的需求来,主要是找准数据的录入规则

#加载并将数据写入excel指定位置
def load_into_excel(datalist,indexi,indexj):
    wb=openpyxl.load_workbook('data.xlsx')
    ws=wb['Sheet1']
    for i in range(len(datalist)):
        ws.cell(row=i+8*indexi+2,column=4+indexj).value=datalist[i]   
    wb.save("data.xlsx")

主函数

#主函数
if __name__ =='__main__':
    driver=openUrl('https://kns.cnki.net/kns8/AdvSearch?dbprefix=CFLS&&crossDbcodes=CJFQ%2CCDMD%2CCIPD%2CCCND%2CCISD%2CSNAD%2CBDZK%2CCCJD%2CCCVD%2CCJFN')
    onceClick(driver)
    flag=True
    for indexi,dp in enumerate(dailyPapers):#报纸为行
        for indexj,tw in enumerate(topicWords):#关键词为列
            send_and_click(driver,tw,dp,flag)
            flag=False #运行第一次后,标记flag为False
            cntlist=getData_and_print(driver,tw,dp)
            load_into_excel(cntlist,indexi,indexj)
    driver.close()

本地文件结构

只需要将data.xlsx和代码文件放一起即可,或者用绝对路径也可
在这里插入图片描述

data.xlsx要求标题等事先按自己的要求准备好,代码只输入数据

在这里插入图片描述

全部代码

from selenium import webdriver 
import time 
import openpyxl
#自定义内容
topicWords=['深化改革','中国梦','放管服']
dailyPapers=['北京日报','天津日报']
years='2022','2021','2020','2019','2018','2017','2016','2015','2014','2013','2012','2011']

# 返回虚拟浏览器对象
def openUrl(url):
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(3)
    return driver

# 只运行一次,避免重复操作影响效率
def onceClick(driver):
    #选择报纸栏
    driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/ul[1]/li[4]/a').click()
    time.sleep(2)
    #点击包含非学术文献
    driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/label/input').click()
    time.sleep(1)
    #更改为全文模式
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/div[1]').click()
    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/div[1]/div[2]/ul/li[5]').click()
    time.sleep(2)

# 输入关键词并点击,循环操作
def send_and_click(driver,kw,np,flag): 
    #输入主题词
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/input').send_keys(kw)
    time.sleep(0.5)
    #输入报纸名字
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[3]/div[2]/input').send_keys(np)
    time.sleep(0.5)
    #点击检索
    driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input').click()
    time.sleep(1.5)
    
    if flag==True:
        #第一次检索时需要展开发表年度大标题
        driver.find_element_by_xpath('//*[@id="divGroup"]/dl[3]/dt').click()
        time.sleep(2)
    if flag==False:
        #第二次开始,发表年度仅缩小,没有收回到大标题,所以展开发表年度缩小的页面,
        #使用try-except是为了防止年份数量不足而报错,影响程序进行
        try:
            driver.find_element_by_xpath('//*[@id="divGroup"]/dl[3]/dd/div/a').click()
            time.sleep(1)
        except:
            pass
        
    #打开被缩小的检索页
    driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[2]/a[2]').click()
    time.sleep(0.5)
    #清空原有内容
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[1]/div[2]/input').clear()
    driver.find_element_by_xpath('//*[@id="gradetxt"]/dd[3]/div[2]/input').clear()
    time.sleep(1)

# 获取内容并返回数量列表
def getData_and_print(driver,tw,dp):
    cntDict={}
    for index in range(1,13):
        try:
            text1=driver.find_element_by_xpath('//*[@id="divGroup"]/dl[3]/dd/div/ul/li['+str(index)+']').text
            cntDict[text1[:4]]=text1[5:-1]
        except:
            continue       
    for i in years:
        if i not in cntDict.keys():
            cntDict[i]='0'       
    cnttuplelist=[]
    cntlist=[]
    for i in sorted (cntDict,reverse=False): 
        if int(i)>=2011 and int(i)<=2018:
            cnttuplelist.append((i, cntDict[i]))
            cntlist.append(cntDict[i])     
        else:
            continue

    for ct1,ct2 in cnttuplelist:
        print(dp+'\t\t\t'+ct1+'\t'+tw+'\t\t'+ct2)      
    return cntlist 

#加载并将数据写入excel指定位置
def load_into_excel(datalist,indexi,indexj):
    wb=openpyxl.load_workbook('data.xlsx')
    ws=wb['Sheet1']
    for i in range(len(datalist)):
        ws.cell(row=i+8*indexi+2,column=4+indexj).value=datalist[i]   
    wb.save("data.xlsx")

#主函数
if __name__ =='__main__':
    driver=openUrl('https://kns.cnki.net/kns8/AdvSearch?dbprefix=CFLS&&crossDbcodes=CJFQ%2CCDMD%2CCIPD%2CCCND%2CCISD%2CSNAD%2CBDZK%2CCCJD%2CCCVD%2CCJFN')
    onceClick(driver)
    flag=True
    for indexi,dp in enumerate(dailyPapers):#报纸为行
        for indexj,tw in enumerate(topicWords):#关键词为列
            send_and_click(driver,tw,dp,flag)
            flag=False #运行第一次后,标记flag为False
            cntlist=getData_and_print(driver,tw,dp)
            load_into_excel(cntlist,indexi,indexj)
    driver.close()

结果预览

控制台

在这里插入图片描述

文件

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-27 17:17:41  更:2022-05-27 17:17:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:59:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码