使用爬虫爬取知网目录
问题描述
想要获取知网搜索结果页面中的侧栏中的学科导航中的大纲的内容,然后依次来构建知识体系。但是后来发现简单爬取只能爬取部分代码,而导航栏的源代码只有在点击相应学科才能加载出相应代码。所以后面用到了selenium神器。
使用普通爬虫未遂
使用selenium进行爬取
下载google chrome
下载chromedriver
选择与浏览器版本相似的也可以,不一定非得必须一致
链接
下载selenium
pip install selenium
遇到问题:
Message: 'chromedriver' executable needs to be in PATH
解决方法,
我是前几种方法无效,所以用了最后一种绝对路径引用。
解决代码
"""
获取网页源代码并且将侧栏文本内容进行整理
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import time
browser=webdriver.Chrome(executable_path=r'E:\chrome\chromedriver_win32\chromedriver.exe')
f = open("./test.txt",'w',encoding='utf-8') #保存源代码的文件
try:
browser.get("https://concept.cnki.net/") #访问知网概念知识库
input=browser.find_element_by_id("search_box") #获取搜索栏的id
input.send_keys("slam")
input.send_keys(Keys.ENTER)
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,"treeMenu1")))
for i in range(1,505):
browser.execute_script("window.scrollTo(0,"+str(i*18)+")") #把网页滚动到底(否则后面的点击看不到时会报错)
#window.scrollTo(x,y):滑动到x,y位置
button = browser.find_element_by_id("treeMenu1_"+str(i)+"_switch") #获取侧边栏按钮的Id treeMenu1_49_a
name = browser.find_element_by_id("treeMenu1_"+str(i)+"_span").text #获取文本字符串
level = browser.find_element_by_id("treeMenu1_"+str(i)+"_a").get_attribute('class') #获取文本对应等级
level = int(level[-1])
for j in range(level):
f.write(" ")
f.write(name+'\n')
ActionChainsDriver = ActionChains(browser).click(button) #点击对应按钮
ActionChainsDriver.perform() #执行点击动作
#f.write(browser.page_source) #保存当前的网页源代码
time.sleep(10)
finally:
f.close()
browser.close()
最终结果
如果想进行更深入的学习,可以查看selenium的官方文档: