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 timeflag = 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).textauthor = browser.find_element(by='xpath',value=author_xpath).textsource = browser.find_element(by='xpath',value=source_xpath).textdates = browser.find_element(by='xpath',value=date_xpath).textprint(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 = 1def 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 timecount = 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).textauthor = browser.find_element(by='xpath',value=author_xpath).textsource = browser.find_element(by='xpath',value=source_xpath).textdates = browser.find_element(by='xpath',value=date_xpath).textprint(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 += 1print(f"第{count}页已经捕捉完毕")if count == page_num:print("全部捕捉完毕")breakchange_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 timecount = 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 = 0try:# 获取结果页数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).textauthor = browser.find_element(by='xpath', value=author_xpath).textsource = browser.find_element(by='xpath', value=source_xpath).textdates = browser.find_element(by='xpath', value=date_xpath).textprint(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 += 1print(f"第{count}页已经捕捉完毕")if count == page_num:print("全部捕捉完毕")breakchange_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博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue computed计算不到数组或者对象的变化

form: {...childQuestionItems:[...{...score: 6}] } ... computed: {totalScore(){return this.form.childQuestionItems.reduce((sum,e)> sum Number(e.score || 0), 0)} } 想要computed 监听计算form.childQuestionItems改变后所有score的和 但是 computed并不监听。…

.NET Framework 与 .NET Core 与 .NET Standard 之间的差异

介绍 在本文中,我们将探讨 .NET Framework、.NET Core 和 .NET Standard 之间的差异。 .NET Framework 与 .NET Core .NET框架.NET核心 历史 .NET Framework 是 .NET 的第一个实现。 .NET Core 是 .NET 的最新实现。 开源 .NET Framework 的某些组件是开源的。 .N…

程序员该怎样爱护眼镜

当程序员是非常费眼睛的,一天中我们长期盯着电脑,眼镜会感到酸痛,所以我们大家要学会放松眼镜,下面是一些方法,大家来跟着动起来吧! 1.修改编程软件字体大小 我们可以根据个人喜好将字体大小调成自己觉得…

Linux和windows进程同步与线程同步那些事儿(二): windows线程同步详解示例

《Linux和windows进程同步与线程同步那些事儿(一)》 一、线程同步 1.1 windows下线程同步 在Windows中,线程同步可以通过多种机制来实现,其中最常见的包括互斥量(mutex)、事件(event&#xf…

【python可视化大屏】使用python实现可拖拽数据可视化大屏

介绍: 我在前几期分享了关于爬取weibo评论的爬虫,同时也分享了如何去进行数据可视化的操作。但是之前的可视化都是单独的,没有办法在一个界面上展示的。这样一来呢,大家在看的时候其实是很不方便的,就是没有办法一目了…

vue项目完整搭建与启动

vue项目完整搭建与启动 一,安装node环境二,安装vue脚手架(vue-cli)1.cnpm(淘宝镜像安装)2.npm安装3.yarn安装 三,创建vue项目四,cmd切换目录方式1方式2 一,安装node环境 1.下载地址…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -我创建的投票列表实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

GitLab clone 地址 不对

1丶问题描述 2丶解决方案 解决方案: 找到挂载到宿主机配置文件:gitlab.rb vi gitlab.rb 改成自己的ip 重启容器 docker restart gitlab 如果发现容器一直重启,可采用粗暴的方法,直接干掉当前容器,重新运行一个 …

SpringMVC-异常处理及常用组件

异常处理器 1.基于配置的异常处理 springmvc提供了一个处理控制器方法执行过程中所出现的异常的接口: HandlerExceptionResolver HandlerExceptionResolver接口的实现类有: DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver springmvc提供了自定义的异常处…

Apache Doris (六十二): Spark Doris Connector - (2)-使用

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. 将编译jar包加入本地Maven仓库

全版本Windows RCE漏洞复现CVE-2023-36025

漏洞简介 CVE-2023-36025是微软于11月补丁日发布的安全更新中修复Windows SmartScreen安全功能绕过漏洞。攻击者可以通过诱导用户单击特制的URL来利用该漏洞,对目标系统进行攻击。成功利用该漏洞的攻击者能够绕过Windows Defender SmartScreen检查及其相关提示。该漏…

2024年【R2移动式压力容器充装】考试资料及R2移动式压力容器充装理论考试

题库来源:安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试资料根据新R2移动式压力容器充装考试大纲要求,安全生产模拟考试一点通将R2移动式压力容器充装模拟考试试题进行汇编,组成一套R2移动式压力容器充装全真模拟考试试题&a…

Node.js和npm

目录 01_Node.js01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.认识URL中的端口号目标讲解小结 06.http模块-创建Web服务目标讲解小结 07.案例-浏览时钟目标讲解小结 02_Node.js模块化…

02-python的基础语法-01python字面量/注释/数据类型/数据类型转换

字面量 在代码中,被写下来的固定的值,被称为字面量。 python中哪些值是可以被写出来的呢?又该如何写呢? 字符串:又称文本,是由任意数量的字符如中文,英文,各类符号,数字组成。 这…

ES-极客学习第二部分ES 入门

基本概念 索引、文档、节点、分片和API json 文档 文档的元数据 需要通过Kibana导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览” 索引 kibana 管理ES索引 在系统中找到kibana配置文件(我这里是etc/kibana/kibana.yml) vim /…

redis(1)

redis 缓存穿透 1.什么是缓存穿透呢? 当客户端访问数据库一个不存在的数据时,数据库查询不到也不会添加在缓存中,所以客户端的每次访问都会去查数据库,这有可能会导致数据库垮掉。 2.解决方案 1.缓存空数据,即便查…

Oracle与Java JDBC数据类型对照

Oracle Database JDBC开发人员指南和参考 SQL Data TypesJDBC Type CodesStandard Java TypesOracle Extension Java Types CHAR java.sql.Types.CHAR java.lang.String oracle.sql.CHAR VARCHAR2 java.sql.Types.VARCHAR java.lang.String oracle.sql.CHAR LONG jav…

vue使用sm2对手机号邮箱等加签名,数据完整性

vue使用sm2对手机号邮箱等加签名,数据完整性 1、安装依赖 npm install --save sm-crypto2、在utils文件下新建sm2Util.js // sm2Util.js const SM2 require(sm-crypto).sm2; const publicKey woshigongyao // 公钥 const privateKey woshisiyao // 私钥/* * 加…

esp32UART串口外设(Arduino)

通用异步接收器/发送器 (UART) 介绍 通用异步接收器/发送器 (UART) 是一种硬件功能,它使用广泛采用的异步串行通信接口(如 RS232、RS422 和 RS485)处理通信(即时序要求和数据成帧&…

个人笔记:分布式大数据技术原理(二)构建在 Hadoop 框架之上的 Hive 与 Impala

大家想了解更多大数据相关内容请移驾我的课堂: 大数据相关课程 剖析及实践企业级大数据 数据架构规划设计 大厂架构师知识梳理:剖析及实践数据建模 有了 MapReduce,Tez 和 Spark 之后,程序员发现,MapReduce 的程序写起来真麻烦。他们希望简化这个过程。这就好比你有了汇编…