zoukankan      html  css  js  c++  java
  • Python Selenium官方文档阅读笔记

    先贴上官方文档地址:https://selenium-python.readthedocs.io/installation.html

    Selenium真的是爬虫的神器,使用它以后,我们可以用浏览器做driver直接爬取网站,再也不怕javasript==动态网站了

    1.安装

    库安装很简单,文档上写的很清楚

    主要是driver安装,现在文档给出的地址下号driver.exe,然后除了windows以外配置都很简单

    windows要加入到环境变量Path中,如果加了以后还不成功,可以用这种方法启动driver

    如:Chrome driver

     1 driver = webdriver.Chrome('E:/chromedriver.exe')

    给出相对路径,或绝对路径都可以

    2. Getting Started

    第一个例子

     1 from selenium import webdriver
     2 from selenium.webdriver.common.keys import Keys
     3 
     4 driver = webdriver.Firefox()
     5 driver.get("http://www.python.org")
     6 assert "Python" in driver.title
     7 elem = driver.find_element_by_name("q")
     8 elem.clear()
     9 elem.send_keys("pycon")
    10 elem.send_keys(Keys.RETURN)
    11 assert "No results found." not in driver.page_source
    12 driver.close()

     1 driver = webdriver.Firefox()

    2 driver.get("http://www.python.org") 

    这段代码启动了Firefox的driver(驱动),并加载进网站

    1 assert "Python" in driver.title
    2 elem = driver.find_element_by_name("q")
    3 elem.clear()
    4 elem.send_keys("pycon")
    5 elem.send_keys(Keys.RETURN)
    6 assert "No results found." not in driver.page_source

    第一行:然后通过对title的判断看我们是否正确进入了python.org这个页面

    第二行:找到所有的name == 'q'的

    补充:find_element_by_ 都是这种格式,后面可以加xpath,id, class各种你能想到的属性,

    或许你已经想到了,想要得到所有这样的element怎么办呢,只需要把element改为elements就行了

    但是注意我们只能得到element(像是js里的getElementById一样),不要直接得到attributes

    比如说我想得到一个text,我就这样写find_element_by_xpath('*[@id="DataGrid1"]/tbody/tr[' + str(i) + ']/td[2]/text()')

    这样是不对的,我们只能这样写:

    1 elem_name = driver.find_element_by_xpath('//*[@id="LblreaderName"]')
    2 self.res['name'] = elem_name.text

    因为我们只能获取element(元素)

    如果你想得到id,那就这样写

    1 elem_name = driver.find_element_by_xpath('//*[@id="LblreaderName"]')
    2 print(elem_name.get_attribute('id'))

    第三行:在第二行我们得到了搜素框这个元素,为了我们输入的时候搜索框为空,要clear

    第四行:输入关键字

    第五行:确认,提交(ps:这里的Keys.RETURN 等价于 Keys.ENTER 模拟键盘Enter,因为他们在键盘上建值都是一样的)

    第六行:确认已经进入提交成功的页面

    注:最好加一个time.sleep(3),我曾经在爬一个网站的时候没加,如果这个时候你直接打印页面内容的化

    1 print(driver.page_source)

    有可能还是原来的页面,因为还没加载出来,还有一些防爬虫的网站就是根据你提交表单的速度看你是不是“人”,所以我们再该慢的时候就慢(time.sleep)

    最后,记得关闭driver,driver.close()

    第二个例子:

     1 import unittest
     2 from selenium import webdriver
     3 from selenium.webdriver.common.keys import Keys
     4 
     5 class PythonOrgSearch(unittest.TestCase):
     6 
     7     def setUp(self):
     8         self.driver = webdriver.Firefox()
     9 
    10     def test_search_in_python_org(self):
    11         driver = self.driver
    12         driver.get("http://www.python.org")
    13         self.assertIn("Python", driver.title)
    14         elem = driver.find_element_by_name("q")
    15         elem.send_keys("pycon")
    16         elem.send_keys(Keys.RETURN)
    17         assert "No results found." not in driver.page_source
    18 
    19 
    20     def tearDown(self):
    21         self.driver.close()
    22 
    23 if __name__ == "__main__":
    24     unittest.main()

    第二个例子跟第一个差不多,差距最大的是用了unittset

    我这里简单就这个例子解释一下,setUp函数类似于Scrapy的open_spider,就是开始的时候调用

    然后中间的函数必须有test字段,unittest才会调用

    tearDown函数类似于Scrapy的spider_close,就是结束的时候调用

    最详细的还是文档:https://docs.python.org/3/library/unittest.html#grouping-tests,我以后应该也会解读:

    2.5. Using Selenium with remote WebDriver(远程webdriver,还没太懂,后面补充)

    3.Navigating

    3.1. Interacting with the page(与页面互动)

    通过第二部分讲的find_element_by_[id, class, xpath....],我们就能得到element

    1 element.send_keys("some text")

    你可以向任何Element通过send_keys提交你想要的来进行互动

    1 element.send_keys(" and some", Keys.ARROW_DOWN)

    通过Keys.ARROW_DOWN来按方向键的向下键(其他键都应该差不多),这里我进行了进一步的学习,发现Keys包(其实就是模拟键盘)常用的有如下:

    1.Keys.ENTER 模拟键盘Enter

    2.Keys.CONTROL,'a' 跟键盘的control+a一样,全选

    3.Keys.PageDown 相当于滑动下拉框到底部

    其余类似

    更多keys这篇blog讲的很好https://www.cnblogs.com/mengyu/p/6942584.html,文档还没看到有更多关于keys的解释

    3.2. Filling in forms

    例1:

    1 element = driver.find_element_by_xpath("//select[@name='name']")
    2 all_options = element.find_elements_by_tag_name("option")
    3 for option in all_options:
    4     print("Value is: %s" % option.get_attribute("value"))
    5     option.click()

    第一行:通过find_elements_by_xpath得到第一个name=name的复选框element

    第二行:得到复选框的每个选项,不清楚html的,select的html如下:

    1 <select>
    2   <option value ="volvo">Volvo</option>
    3   <option value ="saab">Saab</option>
    4   <option value="opel">Opel</option>
    5   <option value="audi">Audi</option>
    6 </select>

    第3~5行:点击(option.click)每个复选框

    但是文档说,这不行啊,我教你更牛逼的,建议看blog:https://blog.csdn.net/huilan_same/article/details/52246012

    除了这篇blog教的外,文档还交了

    1 driver.find_element_by_id("submit").click()

    就是让你找到提交按钮提交而已,但是别人还有更牛逼的

    1 element.submit()

    未完待续

  • 相关阅读:
    MVC中生成PDF并在web中显示
    Excel中如何避免删除未筛选得数据
    double数据类型四舍五入的bug
    Oracle 计算两个日期间时间排除非工作日及非工作时间精确至分钟
    数据库日志文件收缩
    Repeater 数据绑定 分页
    文件迁移 得到文件夹下所有文件名称
    共享业务稳定性测试&技术创新组
    产品测试组和业务测试组
    初级Bug率,随时受不了
  • 原文地址:https://www.cnblogs.com/ducklu/p/9032517.html
Copyright © 2011-2022 走看看