源代码过长,在此省略。可以看到,我们得到的当前URL、Cookies和源代码都是浏览器中的真实内容。
所以说,如果用Selenium来驱动浏览器加载网页的话,就可以直接拿到JavaScript渲染的结果了,不用担心使用的是什么加密系统。
下面来详细了解一下Selenium的用法。
3. 声明浏览器对象
Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。
此外,我们可以用如下方式初始化:
1
2
3
4
5
6
|
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser = webdriver.Edge() browser = webdriver.PhantomJS() browser = webdriver.Safari() |
这样就完成了浏览器对象的初始化并将其赋值为browser对象。接下来,我们要做的就是调用browser对象,让其执行各个动作以模拟浏览器操作。
4. 访问页面
我们可以用get()方法来请求网页,参数传入链接URL即可。比如,这里用get()方法访问淘宝,然后打印出源代码,代码如下:
1
2
3
4
5
|
from selenium import webdriver browser = webdriver.Chrome() browser.get( 'https://www.taobao.com' ) print (browser.page_source) browser.close() |
运行后发现,弹出了Chrome浏览器并且自动访问了淘宝,然后控制台输出了淘宝页面的源代码,随后浏览器关闭。
通过这几行简单的代码,我们可以实现浏览器的驱动并获取网页源码,非常便捷。
5. 查找节点
Selenium可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。比如,我们想要完成向某个输入框输入文字的操作,总需要知道这个输入框在哪里吧?而Selenium提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便下一步执行一些动作或者提取信息。
单个节点
比如,想要从淘宝页面中提取搜索框这个节点,首先要观察它的源代码,如图7-2所示。
图7-2 源代码
可以发现,它的id是q,name也是q。此外,还有许多其他属性,此时我们就可以用多种方式获取它了。比如,find_element_by_name()是根据name值获取,find_element_by_id()是根据id获取。另外,还有根据XPath、CSS选择器等获取的方式。
我们用代码实现一下:
1
2
3
4
5
6
7
8
|
from selenium import webdriver browser = webdriver.Chrome() browser.get( 'https://www.taobao.com' ) input_first = browser.find_element_by_id( 'q' ) input_second = browser.find_element_by_css_selector( '#q' ) input_third = browser.find_element_by_xpath( '//*[@id="q"]' ) print(input_first, input_second, input_third) browser.close() |
这里我们使用3种方式获取输入框,分别是根据ID、CSS选择器和XPath获取,它们返回的结果完全一致。运行结果如下:
1
2
3
4
5
6
|
<selenium.webdriver.remote.webelement.WebElement (session= "5e53d9e1c8646e44c14c1c2880d424af" , element="0.564956309 6161541-1")> <selenium.webdriver.remote.webelement.WebElement (session= "5e53d9e1c8646e44c14c1c2880d424af" , element="0.564956309 6161541-1")> <selenium.webdriver.remote.webelement.WebElement (session= "5e53d9e1c8646e44c14c1c2880d424af" , element="0.564956309 6161541-1")> |
可以看到,这3个节点都是WebElement类型,是完全一致的。
这里列出所有获取单个节点的方法:
1
2
3
4
5
6
7
8
|
find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector |