python_selenium零基础爬虫学习案例_知网文献信息

案例最终效果说明:

        去做这个案例的话是因为看到那个博主的分享,最后通过努力,我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据,并且遍历数据将其导出到一个CSV文件中,代码是很简单的,没有太多的逻辑去判断,但是作为一个小白来说,如果刚刚学完selenium的朋友们可以做这个案例,那这个案例的话我就是用selenium的基本知识去完成的。同时所用到的python的基本知识也是比较简单的。

目录

1.网页分析

2.selenium元素定位&实现

2.1找【高级检索】

2.2找【输入框】

2.3找【检索】

2.4汇总一

2.5附加筛选条件

2.6汇总二

3.数据解析

3.1网页分析

3.2储存数据

3.3第一次尝试(23-01-08)

3.4第二次尝试(23-01-09)

3.5第三次尝试(最终版)(23-01-09)

4.总结

4.1第一次总结(23-01-08)

4.2第二次总结(23-01-09)

4.3第三次总结(23-01-09)

学习笔记,根据这篇文章学习的,讲的很细致。

Python爬虫实战(5) | 爬取知网文献信息(已优化代码) - 知乎 (zhihu.com)

这个博主是利用selenium来爬取的,关于selenium的学习可以参考之前的笔记。

python_selenium_安装&基础学习-CSDN博客

1.网页分析

目标网站:中国知网官网中国知网 (cnki.net)

需求分析:高级检索——>输入查询信息——>点击检索

2.selenium元素定位&实现

先把要用到的包准备好,创建浏览器对象去访问网站,这里就直接展示代码了。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 尝试传参
path = 'chromedriver.exe'
s = Service(path)
browser = webdriver.Chrome(service=s)
url = 'https://www.cnki.net/'
browser.get(url)

2.1找【高级检索】

 这里可以直接复制到完整的xpath,就不用我们自己去寻找了了。

# 找高级检索
highSearch = browser.find_element(by='xpath',value='//*[@id="highSearch"]')
print(highSearch)

2.2找【输入框】

注意:找输入框的时候我遇到了困难,因为点击高级检索之后,url变了,所以用之前的url对象不行,然后仔细看了那个作者发现,他的url直接就是高级检索的页面,所以这里我就也全部改了。

所以从这里开始,后面是新的,前面的是有问题的。

input = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[1]/div[2]/input')

2.3找【检索】

2.4汇总一

那截止到现在的话,我总共是写了这么多的代码。

那基本实现的就是在主题输入框内输入【教育信息化】,然后点击检索这样的功能。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 尝试传参
path = 'chromedriver.exe'
s = Service(path)
browser = webdriver.Chrome(service=s)
url = 'https://kns.cnki.net/kns8s/AdvSearch'
browser.get(url)

import time
time.sleep(2)

#找输入框
input = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[1]/div[2]/input')
print(input)
time.sleep(2)
# 输入查询内容
input.send_keys('教育信息化')
time.sleep(2)
# 找检索
search = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[3]/input')
time.sleep(2)
# 点击检索
search.click()
time.sleep(2)

2.5附加筛选条件

有时候做文献综述的时候,会要求有主题、关键词、篇文摘等要求,有时候要求的是近十年的文章,这种应该怎么办。

首先对于图中主题、关键词、文献来源这种看起来像下拉选择框的,通过仔细分析源码才发现其实不是下拉选择,而是对其他的选线进行了隐藏,只要点击其所在的盒子就可以出现选项。

然后我就发现了一个特别有意思的现象。下面的两种情况,第一种的检索是可以点击的,也就是我们可以看到这个检索按钮,第二种情况,检索按钮被遮挡了,那后面运行点击检索按钮的时候就会报错,但是其实元素定位是没有问题的,就是运行click有问题。

最后具体原因我也不知道,总之后面换成了运行javaScript的代码时没问题的。

到现在的话就是增加了可以更改选项多条件检索的。

现在就来到了时间的板块,关于这个发表时间的日历选择方法,我不知道怎么解决。如果后面解决了就来更新吧。

那我只能尝试解决这个,这一个它是由多种选择的.

那这个的基本原理跟之前的一样,看似是一个下拉选择框其实也是隐藏的一个盒子。

然后就基本附加了一些筛选条件进行检索。

2.6汇总二

纯属小白写的代码哈哈哈哈。


from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

# 尝试传参
path = 'chromedriver.exe'
s = Service(path)
browser = webdriver.Chrome(service=s)
url = 'https://kns.cnki.net/kns8s/AdvSearch'
browser.get(url)

import time
time.sleep(2)

#找输入框
input1 = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[1]/div[2]/input')
time.sleep(2)
# 输入查询内容
input1.send_keys('教育信息化')
time.sleep(2)
# 更改选项——关键词
select = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[2]/div[2]/div[1]/div[1]')
select.click()
time.sleep(2)
key_word = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/div[1]/div[2]/ul/li[3]')
key_word.click()
time.sleep(2)
# 输入查询内容
input2 = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/input')
input2.send_keys('人工智能')
time.sleep(2)

# 更改时间
time_change = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/div')
time_change.click()
time.sleep(2)

select_time = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li[5]')
select_time.click()
time.sleep(2)
# 找检索
search = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[3]/input')
time.sleep(2)
# 点击检索
# search.click() #这个方法没用
browser.execute_script("arguments[0].click();", search) #这个方法有用
# webdriver.ActionChains(browser).move_to_element(search).perform()  #这个方法没用
time.sleep(2)

3.数据解析

3.1网页分析

对于一篇文章的xpath我们可以发现:

题名:/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]/td[2]

作者:/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]/td[3]

来源:/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]/td[4]

可以发现一些规律,td[2]到td[6]都是这篇文献的信息。

但是我们无法获得这篇文献的关键字以及摘要等信息,就需要点进去才可以看到。

对于一整页的每一篇文章我们可以发现:

第一条:/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]

第二条:/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[2]

第三条:/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[3]

那么tr[1]到tr[20]对应的就是每一条信息,这对于我们后面分析xpath路径有关。

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

上面的代码时从原作者那里复制过来的,根据上下文的意思应该就是需要知道每一页有多少条数据,但是我看了好久才知道他这个写的奥妙,一开始我在想怎么去获取表单数据然后将其储存为列表,但是搜了好久都没找到方法,然后我就根据这个博主的代码去结合网页源码看,结果发现其实这个博主就是很简化了这个问题,只要能获取表单数据的条数就可以了。

那这个作者就是根据题名来找到所有类属性为fz14的数据,就可以知道他的表单数据的长度了。

那么现在就是要根据之前所找到的规律去写xpath路径了,同时通过解析得到我们想要的数据。然后再多次的尝试下我终于成功拿到了数据。

3.2储存数据

我是将其存在一个CSV文件里。

简单学习了一下CSV的存储,大家也可以参考这个博主的文章。

python - csv 文件读取、处理、写入_csv_writer = csv.writer(f)-CSDN博客

 

那截止到现在的话,我总共时实现了一个页面的存储,现在的话就是尝试将所有页面进行存储,所以就需要将他们封装成函数方法进行调用,希望我可以成功吧。

3.3第一次尝试(23-01-08)

那今天的尝试,没有实现翻页后继续存储,之后我在看看是咋回事,那现在的话就是我知道最后检索出来的结果是49条数据,总共3页,然后我自己设置了函数方法的调用次数,之后再思考怎么解决这个问题。

当然我写的代码由许多的不足,性能也比较差,也不太稳定,我得再研究研究别人的。今天就到这里吧!

附上我目前的代码。

 


from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import csv
import time

flag = 0

# CSV文件的创建与初始化
header = ['name', 'author ','source', 'dates']
with open('CNKI.csv', 'w', encoding='UTF8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(header)

def open_page():
    # 尝试传参
    path = 'chromedriver.exe'
    s = Service(path)
    browser = webdriver.Chrome(service=s)
    url = 'https://kns.cnki.net/kns8s/AdvSearch'
    browser.get(url)
    time.sleep(2)

    #找输入框
    input1 = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[1]/div[2]/input')
    time.sleep(2)
    # 输入查询内容
    input1.send_keys('教育信息化')
    time.sleep(2)
    # 更改选项——关键词
    select = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[2]/div[2]/div[1]/div[1]')
    select.click()
    time.sleep(2)
    key_word = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/div[1]/div[2]/ul/li[3]')
    key_word.click()
    time.sleep(2)
    # 输入查询内容
    input2 = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/input')
    input2.send_keys('人工智能')
    time.sleep(2)

    # 更改时间
    time_change = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/div')
    time_change.click()
    time.sleep(2)

    select_time = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li[5]')
    select_time.click()
    time.sleep(2)
    # 找检索
    search = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[3]/input')
    time.sleep(2)
    # 点击检索
    # search.click() #这个方法没用
    browser.execute_script("arguments[0].click();", search) #这个方法有用
    # webdriver.ActionChains(browser).move_to_element(search).perform()  #这个方法没用
    time.sleep(2)

    return browser

# name = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]/td[2]').text
# print(name)

def analyz(browser):
    global flag
    # 获取每一页的数据长度
    table_list = browser.find_elements(by=By.CLASS_NAME,value='fz14')

    # 循环遍历数据
    for term in range(1,len(table_list)+1):
        # 定义xpath语句
        name_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[2]'
        author_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[3]'
        source_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[4]'
        date_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[5]'

        # 获取文本信息
        name = browser.find_element(by='xpath',value=name_xpath).text
        author = browser.find_element(by='xpath',value=author_xpath).text
        source = browser.find_element(by='xpath',value=source_xpath).text
        dates = browser.find_element(by='xpath',value=date_xpath).text

        print(name,author,source,dates)

        # 写入CSV文件
        data = [name, author,source,dates]

        with open('CNKI.csv', 'a', encoding='UTF8', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(data)

        # if term == len(table_list):
        #     flag = 1


def change_page():
    global flag
    # 滑倒底部
    js = 'window.scrollTo(0,document.body.scrollHeight)'
    browser.execute_script(js)
    time.sleep(2)
    # 获取下一页的按钮
    next = browser.find_element(by='xpath', value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/a')
    # 点击下一页
    next.click()
    time.sleep(2)


if __name__ == "__main__":
    browser = open_page()
    analyz(browser)
    change_page()
    analyz(browser)
    change_page()
    analyz(browser)

3.4第二次尝试(23-01-09)

那这一次的尝试是基于之前的代码做了一些修改。

那这一次的话,我在open_page这个函数方法中去获取检索结果的总共条目以及总共的页数,这两个数据非常重要。

获取总共的结果数目很简单可以直接通过xpath解析可以获得,那总共由多少页,我是通过元素的信息去获取的,因为我发现data-pagenum这个属性刚好就是页数,所以可以直接运用get_attribute方法去获得数据,但是这里需要注意的是,所获取的page_num一定要转成Int,我当时就是没有转成int导致无法从递归中跳出来,真的是搞了好久才发现。

那我就是递归调用analyze这个函数方法,然后设置好递归出口就可以了,递归出口就是统计页数然后当页数等于page_num的时候就跳出来,就可以基本实现功能了。

附上代码


from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import csv
import time

count = 0

# CSV文件的创建与初始化
header = ['name', 'author ','source', 'dates']
with open('CNKI.csv', 'w', encoding='UTF8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(header)

def open_page():
    # 尝试传参
    path = 'chromedriver.exe'
    s = Service(path)
    browser = webdriver.Chrome(service=s)
    url = 'https://kns.cnki.net/kns8s/AdvSearch'
    browser.get(url)
    time.sleep(2)

    #找输入框
    input1 = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[1]/div[2]/input')
    time.sleep(2)
    # 输入查询内容
    input1.send_keys('教育信息化')
    time.sleep(2)
    # 更改选项——关键词
    select = browser.find_element(by='xpath',value='//*[@id="gradetxt"]/dd[2]/div[2]/div[1]/div[1]')
    select.click()
    time.sleep(2)
    key_word = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/div[1]/div[2]/ul/li[3]')
    key_word.click()
    time.sleep(2)
    # 输入查询内容
    input2 = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/input')
    input2.send_keys('人工智能')
    time.sleep(2)

    # 更改时间
    time_change = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/div')
    time_change.click()
    time.sleep(2)

    select_time = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li[5]')
    select_time.click()
    time.sleep(2)
    # 找检索
    search = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[3]/input')
    time.sleep(2)
    # 点击检索
    # search.click() #这个方法没用
    browser.execute_script("arguments[0].click();", search) #这个方法有用
    # webdriver.ActionChains(browser).move_to_element(search).perform()  #这个方法没用
    time.sleep(2)

    # 获得检索出来的所有条目个数
    res_num = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[1]/div/div[1]/span[1]/em').text
    # 去除千分位的逗号
    res_num = int(res_num.replace(",",""))
    # 获取结果页数
    page_num = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[1]/div/div[1]/span[2]')
    page_num = page_num.get_attribute('data-pagenum')
    # 打印结果
    print((f"共找到 {res_num} 条结果,共 {page_num} 页。"))

    return browser , page_num

# name = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]/td[2]').text
# print(name)

def analyz(browser,page_num):
    global count
    # 获取每一页的数据长度
    table_list = browser.find_elements(by=By.CLASS_NAME,value='fz14')

    # 循环遍历数据
    for term in range(1,len(table_list)+1):
        # 定义xpath语句
        name_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[2]'
        author_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[3]'
        source_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[4]'
        date_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[5]'

        # 获取文本信息
        name = browser.find_element(by='xpath',value=name_xpath).text
        author = browser.find_element(by='xpath',value=author_xpath).text
        source = browser.find_element(by='xpath',value=source_xpath).text
        dates = browser.find_element(by='xpath',value=date_xpath).text

        print(name,author,source,dates)

        # 写入CSV文件
        data = [name, author,source,dates]

        with open('CNKI.csv', 'a', encoding='UTF8', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(data)

        if term == len(table_list):
            count += 1
            print(f"第{count}页已经捕捉完毕")
            if count == page_num:
                print("全部捕捉完毕")
                break
            change_page()
            time.sleep(2)
            analyz(browser,page_num)
            time.sleep(2)




def change_page():
    global flag
    # 滑倒底部
    js = 'window.scrollTo(0,document.body.scrollHeight)'
    browser.execute_script(js)
    time.sleep(2)
    # 获取下一页的按钮
    next = browser.find_element(by='xpath', value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/a')
    # 点击下一页
    next.click()
    time.sleep(2)


if __name__ == "__main__":
    tuple1 = open_page()
    browser = tuple1[0]
    page_num = int(tuple1[1])
    print(page_num)
    analyz(browser,page_num)

    browser.quit()



3.5第三次尝试(最终版)(23-01-09)

这一次我改变了一点点的结构,然后怎么优化代码目前只是说让打开网页的时候不去加载图片来提高效率吧。然后其次就是遇到了一些没有考虑到的情况去修改检查,避免报错吧。总之,这个案例的话大致就是完成了,虽然可能不能真正用来去处理爬取真正有用的数据,但是对selenium的学习以及实际的应用中有了更加深刻的认识,算是巩固自己刚刚学习的知识吧。

附上代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import csv
import time

count = 0

# CSV文件的创建与初始化
header = ['name', 'author ', 'source', 'dates']
with open('CNKI.csv', 'w', encoding='UTF8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(header)

# 打开网页获取数据
def open_page(theme,key_words):
    # 尝试传参
    path = 'chromedriver.exe'
    # 设置不加载图片
    browser_option = webdriver.ChromeOptions()
    browser_option.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
    # 创建对象
    s = Service(path)
    browser = webdriver.Chrome(service=s,options=browser_option)

    url = 'https://kns.cnki.net/kns8s/AdvSearch'
    browser.get(url)
    time.sleep(2)

    # 找输入框
    input1 = browser.find_element(by='xpath', value='//*[@id="gradetxt"]/dd[1]/div[2]/input')
    time.sleep(2)
    # 输入查询内容
    input1.send_keys(f'{theme}')
    time.sleep(2)
    # 更改选项——关键词
    select = browser.find_element(by='xpath', value='//*[@id="gradetxt"]/dd[2]/div[2]/div[1]/div[1]')
    select.click()
    time.sleep(2)
    key_word = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/div[1]/div[2]/ul/li[3]')
    key_word.click()
    time.sleep(2)
    # 输入查询内容
    input2 = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div/dl/dd[2]/div[2]/input')
    input2.send_keys(f'{key_words}')
    time.sleep(2)

    # 更改时间
    time_change = browser.find_element(by='xpath', value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/div')
    time_change.click()
    time.sleep(2)

    select_time = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li[5]')
    select_time.click()
    time.sleep(2)
    # 找检索
    search = browser.find_element(by='xpath',value='/html/body/div[2]/div[1]/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div[3]/input')
    time.sleep(2)
    # 点击检索
    # search.click() #这个方法没用
    browser.execute_script("arguments[0].click();", search)  # 这个方法有用
    # webdriver.ActionChains(browser).move_to_element(search).perform()  #这个方法没用
    time.sleep(2)
    # 考虑到结果的页数没有或者条目为0的情况
    try:
        # 获得检索出来的所有条目个数
        res_num = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[1]/div/div[1]/span[1]/em').text
        # 去除千分位的逗号
        res_num = int(res_num.replace(",", ""))
    except:
        res_num = 0
    try:
        # 获取结果页数
        page_num = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[1]/div/div[1]/span[2]')
        page_num = page_num.get_attribute('data-pagenum')
    except:
        page_num = 1
    # 打印结果
    print((f"共找到 {res_num} 条结果,共 {page_num} 页。"))

    return browser, page_num


# name = browser.find_element(by='xpath',value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[1]/td[2]').text
# print(name)

# 数据解析并导出
def analyz(browser, page_num):
    global count
    # 获取每一页的数据长度
    table_list = browser.find_elements(by=By.CLASS_NAME, value='fz14')

    # 循环遍历数据
    for term in range(1, len(table_list) + 1):
        # 定义xpath语句
        name_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[2]'
        author_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[3]'
        source_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[4]'
        date_xpath = f'/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/table/tbody/tr[{term}]/td[5]'

        # 获取文本信息
        name = browser.find_element(by='xpath', value=name_xpath).text
        author = browser.find_element(by='xpath', value=author_xpath).text
        source = browser.find_element(by='xpath', value=source_xpath).text
        dates = browser.find_element(by='xpath', value=date_xpath).text

        print(name, author, source, dates)

        # 写入CSV文件
        data = [name, author, source, dates]

        with open('CNKI.csv', 'a', encoding='UTF8', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(data)
        # 递归捕捉每一页的数据
        if term == len(table_list):
            count += 1
            print(f"第{count}页已经捕捉完毕")
            if count == page_num:
                print("全部捕捉完毕")
                break
            change_page()
            time.sleep(2)
            analyz(browser, page_num)
            time.sleep(2)

# 切换页面点击下一页
def change_page():
    global flag
    # 滑倒底部
    js = 'window.scrollTo(0,document.body.scrollHeight)'
    browser.execute_script(js)
    time.sleep(2)
    # 获取下一页的按钮
    next = browser.find_element(by='xpath', value='/html/body/div[2]/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/a')
    # 点击下一页
    next.click()
    time.sleep(2)


if __name__ == "__main__":
    # 设置查找的主题和关键词
    theme = '人工智能'
    key_words = '教育'

    tuple1 = open_page(theme,key_words)
    browser = tuple1[0]
    page_num = int(tuple1[1])
    analyz(browser, page_num)

    browser.quit()


4.总结

4.1第一次总结(23-01-08)

        那这是我初学selenium第一次做的实际案例,体验感还是很不错的。虽然中间的过程也很艰辛,就是在不断地去思考下一步怎么做,虽然是根据别的博主的案例来学习的,但是我也尽量的以自己现在的一个学习状况来完成这些代码,所以跟原博主的还是由很大的差别,感觉别人写得很高级,然而我的水平还没到,我只能用自己现在所学来解决这个问题。

        当然我觉得案例学习的方法很好,不仅引导自己主动去思考新学的知识,主动查阅资料,自己调试代码,去思考,还可以让自己去接触一些在日常生活中无法系统去学习到的知识。

        给自己加油吧哈哈哈哈哈哈哈!

4.2第二次总结(23-01-09)

        那这一次的修改其实很简单,昨天晚上的时候就一直在思考怎么去根据页数来调用,然后就增加了两个变量,在打开网页进行检索的时候就尽可能地去观察有用地信息,当然如果利用信息条目数量去判断地话也是可以的。

        那现在的话我在尝试去优化代码的性能,因为现在加载的就是比较慢。并且递归调用函数方法这个算法绝对也是不咋行的。还是要去学习学习其他的哈哈哈哈哈。

4.3第三次总结(23-01-09)

        那关于这一个案例就已经差不多结束了,目前可能比较适合跟我一样刚刚学完selenium来练手的案例吧,做到去真正的实际运用,可能后面只能简单的对这些数据进行一些统计。

        总之基本的功能是可以实现的。但是关于页面的跳转可能还需要继续学习,比如去点击没一排你文章到里面去获得他的关键词和摘要啊。后面可以根据这个再进行改进。

        在这里记录一个大佬的分享;selenium 谷歌 火狐 浏览器设置参数_java火狐修改window.navigator.webdriver-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

automa插件使用的一些实战经验2

automa的工程还是要经常导出备份,因为经常出现突然模块消失的情况。 1 滑动分页条件区分 传统的页面都是有分页标签,这样你很容易知道,应该用分页来做。但是现在手机端的应用基本都是上滑就可以分页,再混合式开发的环境下&#xf…

Maven多模块项目打包:Unable to find main class

目录 一、错误来源 二、原始pom文件 common模块 pojo模块 server模块 父工程 三、解决方法 四、修改pom文件 common模块 pojo模块 server模块(不改动) 父工程 一、错误来源 使用Maven对项目进行多模块开发,在项目打包时出现错误…

c++算法之枚举

目录 解空间的类型 循环枚举解空间 例题 特别数的和 输入格式 输出格式 输入样例: 输出样例: 解 例题 反倍数 问题描述 输入格式 输出格式 样例输入 样例输出 解 例题 找到最多的数 解 枚举算法是一种基本的算法思想,它通过…

linux软件安装(yum命令)

1.Linux系统的应用商店 操作系统安装软件有许多种方式,一般分为: 下载安装包自行安装 如win系统使用exe文件、msi文件等如mac系统使用dmg文件、pkg文件等 系统的应用商店内安装 如win系统有Microsoft Store商店如mac系统有AppStore商店 Linux命令行…

中科星图——Landsat9_C2_SR大气校正后的地表反射率数据

数据名称: Landsat9_C2_SR 数据来源: USGS 时空范围: 2022年1月-2023年3月 空间范围: 全国 数据简介: Landsat9_C2_SR数据集是经大气校正后的地表反射率数据,属于Collection2的二级数据产品&#…

Consider defining a bean of type ‘XXXX‘ in your configuration.

今天学习尚硅谷的SpringCloud时,发现支付模块无法启动,控制台输出下面的错误: 看起来可能是dao层没有被注入。 然后根据我已有的知识,我检查了注解Mapper Mapper public interface PaymentDao {public int create(Payment payment);public…

linux ssh

ssh 是一种安全通道协议,主要用来实现字符界面的远程登录,远程复制等功能。ssh协议对通信双方的数据传输进行了加密处理,其中包括用户登录输入的用户口令,SSH为建立在应用层和传输层基础上的安全协议。对数据进行压缩&#xff0c…

C# 图解教程 第5版 —— 第21章 异步编程

文章目录 21.1 什么是 异步21.2 async/await 特性的结构21.3 什么是异步方法21.3.1 异步方法的控制流21.3.2 取消一个异步操作21.3.3 在调用方法中同步地等待任务21.3.4 在异步方法中异步地等待任务21.3.5 Task.Delay 方法 21.4 GUI 程序中的异步操作(*)…

【前端转安卓】-Java基础知识笔记

常量定义:final public class HelloWorld {// 静态常量public static final double PI 3.14;// 声明成员常量final int y 10;public static void main(String[] args) {// 声明局部常量final double x 3.3;} }变量声明、赋值 String username,address,phone,te…

Python+Selenium做自动化测试(超详细整理)

一、项目介绍 目的 测试某官方网站登录功能模块可以正常使用【文末有配套视频教程和免费的资料文档领取】 用例 1.输入格式正确的用户名和正确的密码,验证是否登录成功; 2.输入格式正确的用户名和不正确的密码,验证是否登录失败&#xff…

OpenCV-Python(34):FAST算法

目标 理解 FAST 算法的基础使用OpenCV 中的FAST 算法相关函数进行角点检测 介绍 FAST算法(Features from Accelerated Segment Test)是一种用于在图像中快速检测角点的算法。它是一种基于像素的检测方法,具有高效、准确的特点,常…

【小程序开发需要多少钱?】

哈喽,大家好,这里是智创开发。 我们今天聊聊开发一个小程序需要多少钱。 由于自己组建团队来开发小程序成本过高,大品牌的企业一般都不会这么搞,所以我们今天只谈假如我有需求,找服务商来全程搞定的费用大致是多少。和…

关于镜头选型时的一些注意事项

1、问题背景 最近的项目调试过程中,遇到与镜头相关的问题比较多。所以本文主要总结一下镜头选型时需注意的事项,保证在项目前期就能规避掉一些问题,避免项目延期。 2、问题分析 我们拿到手的一般都是摄像头模组,在进行摄像头调试时…

java+ssm+vue代码视频学习讲解

一、ssm 1.项目文件结构 2.数据库连接信息 3.其他配置信息 4.java代码文件目录介绍 5.entity层代码 6.controller,service,dao,entity层之间的关系 7.controller层代码 8.登陆拦截功能实现 AuthorizationInterceptor.java 9.文件上传功能 …

日志审计系统Agent项目创建——获取Linux的ip并将得到的日志插入数据库中(Linux版本)

上一篇文章可以直接展示系统在运行过程中的日志,读取日志文件https://blog.csdn.net/wjl990316fddwjl/article/details/135553685 如何将得到的日志插入数据表中,进行更可观的展示? 1、创建表格并执行,可以看到数据库已经创建好…

paypal贝宝怎么绑卡支付

一、PayPal是什么 PayPal是一个很多国家地区通用的支付渠道,我们可以把它理解为一项在线服务,相当于美国版的支付宝。你可以通过PayPal进行汇款和收款,相比传统的电汇和西联那类的汇款方式,PayPal更加简单和容易,被很…

使用ffmpeg对视频进行静音检测

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

Retinal Structure Detection in OCTA Image viaVoting-Based Multitask Learning

一、摘要 研究背景:自动检测视网膜结构,如视网膜血管(RV)、中央凹血管区(FAZ)和视网膜血管连接(RVJ),对了解眼部疾病和临床决策具有重要意义。 主要工作:在本文中,提出了一种新的基于投票的自适应特征融合多任务网络…

Spring之AOP源码(二)

书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理,但是还没有涉…

SQL注入攻击

1.用java实现登录的检查 package jdbc1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner;public class Login {public static void main(String args[]){try(Connection connec…