python3爬虫学习笔记之分析动态渲染网页爬取Selenium+Chrome(九)

JavaScript动态渲染并不是只有Ajax这一种,一些页面并不能通过前面章节的分析方法分析并爬取数据,所以就有了模拟浏览器运行的方式来实现爬取,这样在浏览器中看到是什么样,抓取的源码就是什么样的,无需考虑用了什么方式渲染页面。Python提供了很多模拟浏览器的库,这里我们介绍selenium的使用。

Selenium是一个自动化测试工具,利用它就可以驱动浏览器执行特定的人任务,如点击、下拉等操作,同时还可获取浏览器当前呈现的页面的源代码。

1. 准备工作

以Chrome为例使用Selenium,所以在之前,确保安装好Chrome并配置好ChromeDriver,安装好selenium库。

2. 基本使用

确定环境安装完整之后,可以看一下selenium的一些功能。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
    input = browser.find_element_by_id('kw')
    input.send_keys('Python')
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser,10)
    wait.until(EC.presence_of_all_elements_located((By.ID,'content_left')))
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()
    browser.quit()

运行代码后发现,会自动弹出一个Chrome浏览器,浏览器首先跳转到百度首页,然后在搜索框中输入Python,接着跳转到搜索结果页。搜索结果加载出来后,控制台分别会输出当前的URL、当前的Cookies和网页源代码,最后关闭浏览器。

3. 声明浏览器对象

Selenium支持非常多的浏览器,如Chrome、Firefox、Edge、PhantomJS等,可以用如下方式声明浏览器对象:

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

接下来要做的就是调用浏览器对象,让其执行各个动作以模拟浏览器操作。

4. 访问页面

我们可以用get( )方法来请求网页,参数输入链接URL即可,如下:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()

运行之后,弹出了浏览器并且自动访问了淘宝,然后控制台输出淘宝页面的源码,随后关闭浏览器。

5. 查找节点

Selenium可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。比如,我们要向某个输入框中输入文字内容,总需要知道这个输入框在哪里?而Selenium提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便下一步执行一些动作或者提供信息。

·单个节点

比如,想要从淘宝页面中提取搜索框这个节点,首先观察它的源代码,

 

可以发现,它的id是mq,name是q。此外,还有其他属性,我们可以用多种方式获取它。find_element_by_name( )根据name值获取,find_element_by_id( )根据id值获取。另外还有XPath、CSS选择器等获取方式。

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://world.taobao.com')
input_first = browser.find_element_by_id('mq')
input_second = browser.find_element_by_name('q')
input_third = browser.find_element_by_xpath('//*[@id="mq"]')
input_fourth = browser.find_element_by_css_selector('#mq')
print(input_first,input_second,input_third,input_fourth)
browser.close()

运行结果如下,获取节点完全一致:

 

这里列出所有获取单个节点的方法:

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

另外,还提供了通用方法find_element( ),它需要出入两个参数:查找方式By和值。

·多个节点

如果查找的目标在网页中只有一个,那么可以用find_element( )方法。但如果有多个节点,需要用find_elements( )方法。

获取多个节点的方法:

find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
find_elements

6. 节点交互

Selenium可以驱动浏览器来执行一些操作,也就是可以让浏览器模拟执行一些操作。比较常见的有:输入文字时用send_keys( )方法,清空文字时用clear( )方法,点击按钮时用click( )方法。示例:

from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
#input.send_keys(Keys.ENTER)
button = browser.find_element_by_class_name('btn-search')
button.click()browser.close()

以上是一个简单的输入框输入文字和点击按钮的操作,更多的操作可以查看文档。

7. 动作链

8. 执行JavaScript

对于某些操作,Selenium API没有提供,如下拉进度条,可以直接模拟运行JavaScript,此时使用execute_script( )方法即可实现,如下:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

9. 获取节点信息

a. 获取属性

get_attribute()

b. 获取文本

节点text属性

c. id、位置、标签和大小

 

如果对你有用,点个赞  手动笑脸(*_*)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章