# 导入expected_conditions类
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
# 导入BeautifulSoup库
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
# 导入TimeoutException
from selenium.common.exceptions import TimeoutException
# 导入pymongo模块
import pymongo
# 导入time模块
import time
from selenium.webdriver.chrome.service import Service
先导入所需要的模块
# 初始化Google Chrome浏览器对象,赋值给browser
from selenium.webdriver.support.wait import WebDriverWait
设置好自己下载的chromedriver文件路径
driver_path = r"E:\a谷歌浏览器下载内容\chromedriver-win642\chromedriver-win64\chromedriver.exe"
service = Service ( driver_path )
browser= webdriver.Chrome ( service=service )
设置数据库
# browser = webdriver.Chrome()
# 初始化WebDriverWait对象
wait = WebDriverWait(browser, 10)
# 创建MongoClient对象实例
client = pymongo.MongoClient('localhost', 27017)
# 连接数据库,如果不存在则创建一个数据库
mongo = client.cnki
# 连接集合,如果不存在则创建一个集合
collection = mongo.papers
# 定义搜索函数,根据输入的关键字搜索
def searcher(keyword):
# 请求中国知网首页,并打开浏览器
browser.get('https://www.cnki.net/')
browser.maximize_window() # 最大化窗口
time.sleep(2) # 休眠2s
# 寻找id属性值为“txt_SearchText”的输入框,并赋值给input
input = wait.until(
EC.presence_of_element_located((By.ID, 'txt_SearchText'))
)
input.send_keys(keyword) # 输入关键字“Python”
# 寻找“搜索”按钮并点击
wait.until(EC.presence_of_element_located(
(By.CLASS_NAME, 'search-btn'))).click()
time.sleep(3) # 休眠3s
# 寻找筛选项并点击
wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, "[class='icon icon-sort']"))).click()
# 寻找并点击显示“50”条的选项
wait.until(EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, '#id_grid_display_num ul li')))[2].click()
time.sleep(3) # 休眠3s
parse_page() # 调用 parse_page 函数
页面爬取函数代码
def parse_page():
wait.until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, '.result-table-list tbody tr')
)
)
html = browser.page_source # 获取HTML源代码
# 创建BeautifulSoup对象,将页面解析为lxml格式
soup = BeautifulSoup(html, 'lxml')
# 根据CSS选择器抓取内容
items = soup.select('.result-table-list tbody tr')
# 遍历列表,提取文献信息
for i in range(0, len(items)):
item = items[i]
detail = item.select('td') # 根据CSS选择器抓取td标签
paper = {
'index': detail[0].text.strip(),
'title': detail[1].text.strip(),
'author': detail[2].text.strip(),
'resource': detail[3].text.strip(),
'time': detail[4].text.strip(),
'database': detail[5].text.strip()
}
print(paper) # 输出文献信息
data_storage(paper) # 调用 data_storage 函数
其他工具类函数略过
效果展示
可视化结果: