最近在学习写爬虫时发现了一个好东西——selenium。
与常规的爬虫库不同的是,这个库可以通过程序自动化控制浏览器进行实际操作,而不是直接向url发出请求。有点类似于pyautogui的功能。
很明显,这个库最大的缺点就是慢。但是,有了这样的自动化控制,一些对于普通爬虫库来说很棘手的问题就变得简单了。
比如模拟登录的操作,我们完全可以通过selenium自动化输入账号和密码进行登录(当然可以预留5秒钟时间来输入验证码)
同时它还有一个用途,它所爬取的页面源码就是右键检查里所体现的源码,真正做到了“所见即所得”。
比如我这两天在写一些爬取网易云音乐、抖音视频的程序。
我发现这两个网站都有一个特点,就是你右键检查时所看到的语法树都不是你真正发送请求时所获取的语法树
网易云音乐这个网站搭建了一个iframe框架,即在大框架内还有小框架(网页中的网页,也就是套娃),而按照平常的操作流程,我们爬虫程序发送请求后只能获取到大框架的源码,无法获取到小框架的源码(主要是我太菜了不会哈哈哈)。
而抖音这个网站,我们通过平常的流程获取到的源码,其他部分都没问题,就是视频这个板块的源码是缺失的(我不是很清楚为什么这样,如果有大佬可以解答一下吗…)
上述两种情况都是“所见非所得”,我们都可以用selenium来解决。具体怎么解决呢,我们直接上代码!!!
(具体selenium的环境配置可以参考其他大佬的文章,都有很详细的步骤)
首先,由于我们是将selenium作为一种爬虫工具来使用,而不是进行自动化测试,因此我们直接使用无可视化界面(否则正常情况下会直接当着你的面打开浏览器,然后电脑自己操作)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 实现无可视化界面(固定写法,直接照搬就好了)
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 初始化驱动器对象
driver = webdriver.Chrome('chromedriver.exe', options=chrome_options) # 这一步需要提前配置好环境变量,否则第一个参数就要写驱动器的绝对路径
如果是自动化测试程序,即需要可视化界面时,就不需要写这么多
from selenium import webdriver
# 初始化驱动器对象
driver = webdriver.Chrome('chromedriver.exe') # 这一步需要提前配置好环境变量,否则第一个参数就要写驱动器的绝对路径
紧接着我们就需要访问网站了
driver.get(url=url)
访问网站后,如果网站存在内嵌框架,我们需要从网站外框架切换到内嵌框架中(这个内嵌框架的标签可能是frame,也可能是iframe)
driver.switch_to_frame() # 括号里既可以填框架的属性或ID的字符串,也可以填该框架元素
driver.switch_to_frame('frame_1')
driver.switch_to_frame(driver.find_element_by_css_selector('[src="sample1.html"]'))
进入框架后,我们就需要爬取源码了
page_text = driver.execute_script('return document.documentElement.outerHTML')
程序最后,别忘了退出浏览器,否则程序会一直处于运行状态
driver.quit()
综上
def getHtml(url):
# 实现无可视化界面
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 利用webdriver获取页面源码
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=chrome_options)
driver.get(url=url)
# driver.switch_to.frame() # 如果网页中有iframe框架,需要进行切换
page_text = driver.execute_script('return document.documentElement.outerHTML') # 抓取到页面信息
driver.quit() # 退出浏览器
return page_text
这个函数可以实现输入url,返回给你“所见即所得”的html