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()
未完待续