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

未完待续

原文地址:https://www.cnblogs.com/ducklu/p/9032517.html