使用selenium+chromedriver爬取数据


使用爬虫爬取知网目录

问题描述

想要获取知网搜索结果页面中的侧栏中的学科导航中的大纲的内容,然后依次来构建知识体系。但是后来发现简单爬取只能爬取部分代码,而导航栏的源代码只有在点击相应学科才能加载出相应代码。所以后面用到了selenium神器。
test

使用普通爬虫未遂

链接

使用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()

最终结果

![爬取结果](res.png)

如果想进行更深入的学习,可以查看selenium的官方文档:

官方文档

参考文献

[1] selenium.模拟鼠标操作(ActionChains

[2] 自动化测试基础篇—Selenium获取元素属性

[3] windowscrollTo()用法

[4] Python 保存数据的方法(4种方法)


Author: star
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source star !
  TOC