简单动态页面的爬取
ch6&7 动态渲染页面的爬取
- ajax数据爬取
- 动态渲染页面的爬取
- selenium的使用
- splash的使用
1. ajax数据爬取
ajax数据的爬取主要依靠分析XHR请求,利用resquests库构造响应来完成。
2. 动态渲染页面的爬取
0. intro
动态渲染页面技术不止XHR一种,而在一些情况下利用AJAX的爬取是十分困难的。而模拟浏览器运行的方式就可以很好地解决这一问题。
模拟浏览器的运行方式下,模拟出的浏览器中看到的是什么样,代码爬取的就是什么样,做到了可见即可爬。这样一来便不用管ajax的实现到底有哪些参数。
1. selenium
1. 基本使用方法
-
br = webdriver.browser()
: 申明了一个浏览器对象,其中browser
字段是下列中的一个,表示选择相对应的浏览器Chrome
Firefox
Edge
Safari
PhantomJS
该函数完成了浏览器对象的初始化,并将之赋值给变量br
-
br.get(URLlink)
: 用于请求网页,URLlink即为需要访问的页面 -
br.close()
: 关闭浏览器
2. 对节点进行的操作
-
a. 查找结点
对于节点的查找可以按照查到结果的个数分为: 对单个节点的查找, 对多个节点的查找
-
对单节点的查找
br.find_element(By.con, val)
: 其中con
为选择字段,可以为id, name, xpath, link_text, partial_link_text, tag_name, class_name, css_selector
。val
为要传入的参数值。
-
对多个节点的查找
br.find_elements(By.con, val)
: 参数与单节点的查找一致
-
单节点查找方法返回值为
WebElement
, 多节点查找方法返回值为列表,列表中的元素类型为WebElement
查找示例
-
from selenium import webdriver
from selenium.webdriver.common.by import By
br = webdriver.Firefox()
br.get('https://www.baidu.com')
ele = br.find_element(By.ID, 'q')
print(res)
br.close()
按照ID
属性,找到了ID为q
的节点并输出。结果如下:
-
b. 操作节点
在对结点的操作前,需要先通过查找结点来选定操作的对象。常见的操作有:
ele.send_keys('content')
: 表示向该节点输入文字ele.clear()
: 表示清空输入的文字ele.click()
: 表示点击节点
-
c. 动作链
动作链与对结点的操作类似,但它不需要选择节点。常见的动作链操作有:鼠标拖拽、键盘按键等。
from selenium import webdriver from selenium.webdriver imposr ActionChains br = webdriver.Firefox() url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' br.get(url) br.switch_to.frame('iframeResult') sou = br.find_element_by_css_selector('#draggable') tar = br.find_element_by_css_selector('#droppable') act = ActionChains(br) act.drag_and_drop(sou, tar) act.perform()
- 该url是一个用于测试拖拽测试的页面
- 用
find_element()
方法选择了拖拽的目的地和终点,但是动作链对象本身并没有需要选择节点对象
-
d. 获取节点信息
获取节点信息同样也需要首先选中需要操作的节点
ele.get_attribute('content')
: 获取节点的属性,content为要获取的节点的属性,如class
ele.text
: 获取节点的文本内容ele.id
: 获取idele.location
: 获取该节点在网页中的相对位置ele.tag_name
: 获取该节点的标签名称ele.size
: 获取该节点的宽和高
-
e. 对于子页面iframe特殊结点的处理
iframe节点是一种特殊的节点,相当于页面的子页面。在父页面中查询节点时,是无法查找到子节点中节点的信息的。这时就需要使用切换父子页面的方法
br.switch_to.frame('name')
: 切换至该页面的子页面,且子页面的名称为name
br.switch_to.parent_frame()
: 切换至该页面的父页面
3. 其他操作
-
a. 延时等待
selenium中的get方法会在网页框架加载完毕后就执行,如果此时就获取源代码可能会找不到需要的节点,所以需要等待一段时间后再获取代码。
- 隐式等待
br.implicitly_wait(num)
: 在查找节点而没有找到时等待num
秒。与br.get()
方法搭配使用,且在该方法之前使用。
- 显式等待
- 隐式等待
-
b. 前进与后退
br.back()
br.forward()
-
c. cookies
br.get_cookies()
: 获取所有cookiesbr.add_cooke({dic})
: 添加一个cookies,传入内容为字典br.delete_all_cookies()
: 删除所有cookies
-
d. 异常处理
常用的异常及其处理如下
try: br.get('http://www.baidu.com') except TimeoutException: print('time out') try: br.find_element_by_id('hello') except NoSuchElementException: print('no such element found') finally: br.close()