python selenium 用法 和 Chrome headless

本文详细介绍了Python使用Selenium操作Chrome无头浏览器(headless mode)进行爬虫实战,包括安装、页面操作、异常处理、Chrome headless的使用,适合解决JavaScript渲染问题。内容涵盖Selenium的页面等待、元素定位、交互操作,以及如何启动无界面的Chrome进行网页抓取。
摘要由CSDN通过智能技术生成

From: http://cuiqingcai.com/2599.html

Selenium教程:https://www.yiibai.com/selenium
selenium 官方参考文档:https://selenium-python.readthedocs.io/index.html
Selenium Documentation:https://www.seleniumhq.org/docs
Selenium 与 PhantomJS:http://www.cnblogs.com/miqi1992/p/8093958.html
自动化测试工具 Selenium:http://www.51testing.com/zhuanti/selenium.html
Selenium :http://www.ltesting.net/ceshi/open/kygncsgj/selenium
Selenium 中文网:http://www.selenium.org.cn
Selenium发展史:https://www.cnblogs.com/fnng/p/7426928.html
Free Selenium Tutorials:https://www.guru99.com/selenium-tutorial.html
Selenium自动化测试教程:http://www.51zxw.net/list.aspx?cid=615
知乎 - Selenium:https://www.zhihu.com/topic/19574589/top-answers
功能测试工具Selenium IDE:https://jingyan.baidu.com/article/ea24bc39bc48dada62b33139.html
Mechanize 和 Selenium:https://blog.csdn.net/u011974639/article/details/73148949
python爬虫从入门到放弃(八)之 Selenium库的使用:https://www.cnblogs.com/zhaof/p/6953241.html
python爬虫 --- 基于selenium用火狐模拟登陆爬搜索关键词的微博:https://blog.csdn.net/u010454729/article/details/51225388
selenium 模拟 fireFox浏览器,爬取网页信息:https://github.com/wu-yy/myhomeCrawler

前言

        前面学习了 PhantomJS 的基本用法,归根结底它是一个没有界面的浏览器,而且运行的是 JavaScript 脚本,然而这就能写爬虫了吗?这又和Python有什么关系?接下来我们介绍的这个工具,统统解决掉你的疑惑。

简介

        Selenium 是什么?一句话,自动化测试工具。简单的说就是一个可以用代码操所浏览器的工具。可以通过selenium进行搜索关键字,点击按钮等等操作。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。当selenium升级到3.0之后,对不同的浏览器驱动进行了规范。如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动(注:部分浏览器驱动地址需要科学上网)。话说回来,PhantomJS 不也是一个浏览器吗,那么 Selenium 支持不?答案是肯定的,这样二者便可以实现无缝对接了。

        然后又有什么好消息呢?Selenium支持多种语言开发,比如 Java,C,Ruby等等,有 Python 吗?那是必须的!哦这可真是天大的好消息啊。

        嗯,所以呢?安装一下 Python 的 Selenium 库,再安装好 PhantomJS,不就可以实现 Python+Selenium+PhantomJS 的无缝对接了嘛!PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Python 的对接,Python 进行后期的处理,完美的三剑客!

        有人问,为什么不直接用浏览器而用一个没界面的 PhantomJS 呢?答案是:效率高!

        Selenium 2,又名 WebDriver,主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手)。也就是说 Selenium 2 是 Selenium 和 WebDriver 两个项目的合并,即 Selenium 2 兼容 Selenium,它既支持 Selenium API 也支持 WebDriver API。selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此用于任何支持JavaScript的浏览器上。selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

更多详情可以查看 Webdriver 的简介。

Webdriver

嗯,通过以上描述,我们应该对 Selenium 有了大概对认识,接下来就让我们开始进入动态爬取的新世界吧。

本文参考内容来自

Selenium官网 SeleniumPython文档

用python写爬虫的时候,主要用的是selenium的Webdriver,我们可以通过下面的方式先看看Selenium.Webdriver支持哪些浏览器。首先导入 webdriver 模块。然后使用help函数

from selenium import webdriver
help(webdriver)

安装

首先安装 Selenium

pip install selenium

或者下载源码

下载源码

然后解压后运行下面的命令进行安装

python setup.py install

安装好了之后我们便开始探索抓取方法了。

快速开始

初步体验

声明浏览器对象

上面我们知道了selenium支持很多的浏览器,但是如果想要声明并调用浏览器则需要:

from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()

这里只写了两个例子,当然了其他的支持的浏览器都可以通过这种方式调用

一个例子感受一下 Selenium,这里用 Chrome 浏览器来测试,方便查看效果,到真正爬取的时候换回 PhantomJS 即可。

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

运行这段代码,会自动打开浏览器,然后访问百度。

如果程序执行错误,浏览器没有打开,那么应该是没有装 Chrome 浏览器或者 Chrome 驱动没有配置在环境变量里。下载驱动,然后将驱动文件路径配置在环境变量即可。

安装三大浏览器驱动driver
        1. chromedriver 下载地址:http://chromedriver.chromium.org
            chromedriver 镜像下载地址 :http://npm.taobao.org/mirrors/chromedriver
        2. Firefox 的驱动 geckodriver 下载地址:https://github.com/mozilla/geckodriver/releases
        3. IE 的驱动 IEdriver 下载地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver

注意:下载解压后,将chromedriver.exe , geckodriver.exe , Iedriver.exe发到Python的安装目录,例如 D:\python 。 然后再将Python的安装目录添加到系统环境变量的Path下面。

爬虫 Selenium Chromium 与 Chromedriver对应版本( 注意是 chromium,不是 Chrome ):
淘宝镜像地址在每个文件夹的 notes.txt 中存有 chromium 和 Chromedriver 的版本对应(一般3个chromium版本对应1个Chromedriver 版本)。

chromium     chromedriver
v64-66 v2.37
v63-65 v2.36
v62-64 v2.35
v61-63 v2.34
v60-62 v2.33

然后打开Python IDLE分别输入以下代码来启动不同的浏览器

启动谷歌浏览器
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

启动火狐浏览器
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')

启动IE浏览器
from selenium import webdriver
browser = webdriver.Ie()
browser.get('http://www.baidu.com/')

模拟提交

下面的代码实现了“模拟百度提交搜索”的功能。首先等页面加载完成,然后输入关键字到搜索框文本,最后点击提交。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
print driver.title
elem = driver.find_element_by_name("wd")    # 百度首页搜索框 name="wd"
elem.send_keys("MM")                        # 输入关键字
elem.send_keys(Keys.RETURN)                 # 模拟 点击 enter键,提交
print driver.page_source                    # 打印 js 渲染后的网页

        其中 driver.get 方法会打开请求的URL,WebDriver 会等待页面完全加载完成之后才会返回,即程序会等待页面的所有内容加载完成,JS渲染完毕之后才继续往下执行。注意:如果这里用到了特别多的 Ajax 的话,程序可能不知道是否已经完全加载完毕。

        WebDriver 提供了许多寻找网页元素的方法,譬如 find_element_by_* 的方法。例如一个输入框可以通过  find_element_by_name 方法寻找 name 属性来确定。

        然后我们输入来文本然后模拟点击了回车,就像我们敲击键盘一样。我们可以利用 Keys 这个类来模拟键盘输入。

        注意:获取网页渲染后的源代码。输出 page_source 属性即可。这样,就可以做到网页的动态爬取了。        

                   如果想知道更过代码中driver对象有那些方法,可以通过 dir(driver) 查看

测试用例

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

运行程序,同样的功能,我们将其封装为测试标准类的形式。

        The test case class is inherited from unittest.TestCase. Inheriting from TestCase class is the way to tell unittest module that this is a test case. The setUp is part of initialization, this method will get called before every test function which you are going to write in this test case class. The test case method should always start with characters test. The tearDown method will get called after every test method. This is a place to do all cleanup actions. You can also call quit method instead of close. The quit will exit the entire browser, whereas close will close a tab, but if it is the only tab opened, by default most browser will exit entirely.

        测试用例是继承了 unittest.TestCase 类,继承这个类表明这是一个测试类。setUp方法是初始化的方法,这个方法会在每个测试类中自动调用。每一个测试方法命名都有规范,必须以 test 开头,会自动执行。最后的 tearDown 方法会在每一个测试方法结束之后调用。这相当于最后的析构方法。在这个方法里写的是 close 方法,你还可以写 quit 方法。不过 close 方法相当于关闭了这个 TAB 选项卡,然而 quit 是退出了整个浏览器。当你只开启了一个 TAB 选项卡的时候,关闭的时候也会将整个浏览器关闭。

driver = webdriver.Chrome()
driver.maximize_window()    # 最大化浏览器
driver.implicitly_wait(20)  # 设置隐式时间等待
access_url = 'https://www.baidu.com'
driver.get(access_url)

element_login = driver.find_element_by_id('login')  # 网页的登录按钮
element_login.click()  # 点击登录按钮
sleep(2)               # 显式等待 2s

links = driver.find_element_by_tag_name('a')  # 查找所有的 a 标签
link = links[3]  # 提取 第四个 a 标签
link.click()     # 点击 提取 的 a 标签

Selenium常见元素定位方法和操作的学习介绍https://blog.csdn.net/eastmount/article/details/48108259

Selenium切换窗口句柄及调用Chrome浏览器:https://blog.csdn.net/eastmount/article/details/53253278

页面操作

访问页面  

from selenium import webdriver

browser = webdriver.Chrome()

browser.get("http://www.baidu.com")
print(browser.page_source)
browser.close()

上述代码运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器

查找元素

查找单个元素

from selenium import webdriver

browser = webdriver.Chrome()

browser.get("http://www.taobao.com")
input_first = browser.find_element_by_id("q")
input_second = browser.find_element
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值