python抓取动态网页(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和chromedriver)
优采云 发布时间: 2022-02-14 00:18python抓取动态网页(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和chromedriver)
什么是阿贾克斯:
Ajax (Asynchronouse JavaScript And XML) 异步 JavaScript 和 XML。Ajax 可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为以传统的数据格式进行传输,使用 XML 语法。所谓AJAX,其实数据交互基本都是用JSON。AJAX加载的数据,即使是用JS渲染数据到浏览器,右键->查看网页源代码,还是看不到ajax加载的数据,只能看到使用此 url 加载的 html 代码。
ajax数据获取方式:
1、直接分析ajax调用的接口。然后通过代码请求这个接口。
2、使用 Selenium+chromedriver 模拟浏览器行为获取数据。
Selenium+chromedriver 获取动态数据:
Selenium 相当于一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击、填充数据、删除cookies等。chromedriver是驱动Chrome浏览器的驱动,可以用来驱动浏览器。当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
1、铬:
2、火狐:
3、边缘:
4、Safari:
安装 Selenium 和 chromedriver:
安装 Selenium:Selenium 支持多种语言,包括 java、ruby、python 等,我们可以下载 python 版本。
点安装硒
安装chromedriver:下载完成后,放到一个不需要权限的纯英文目录下。
快速开始:
下面我们以一个简单的获取百度主页的例子来谈谈如何快速上手 Selenium 和 chromedriver:
selenium的常用操作:
关闭页面:
1、driver.close():关闭当前页面。
2、driver.quit():退出整个浏览器。
定位要素:
需要注意的是find_element是获取第一个满足条件的元素。find_elements 是获取所有满足条件的元素。
作为表单元素:
1、操作输入框:分两步。第一步:找到元素。第 2 步:使用 send_keys(value) 填写数据。示例代码如下:
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
使用 clear 方法清除输入框的内容。示例代码如下:
inputTag.clear()
2、操作复选框:因为需要选中复选框标签,所以在网页中用鼠标点击。所以如果要选中checkbox标签,先选中标签,然后执行click事件。示例代码如下:
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
3、Select select:选择元素不能直接点击。因为点击后需要选择元素。这时,selenium 提供了一个类 selenium.webdriver.support.ui.Select 专门用于 select 标签。将获取的元素作为参数传递给此类以创建此对象。您可以稍后使用此对象进行选择。示例代码如下:
4、操作按钮:操作按钮的方式有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数即可。示例代码如下:
inputTag = driver.find_element_by_id('su')
inputTag.click()
行为链:
有时候页面上的操作可能会有很多步骤,这时可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移到一个元素上并执行一个单击事件。那么示例代码如下:
还有更多与鼠标相关的操作。
1、click_and_hold(element):在不释放鼠标的情况下单击。
2、context_click(element):右键单击。
3、double_click(element):双击。更多方法请参考:
Cookie操作:
获取所有 cookie:
对于 driver.get_cookies() 中的 cookie:
打印(饼干)
根据cookie的key获取值:
value = driver.get_cookie(key)
删除所有 cookie:
driver.delete_all_cookies()
要删除 cookie:
driver.delete_cookie(键)
页面等待:
今天的网页越来越多地使用 Ajax 技术,因此程序无法确定元素何时完全加载。如果实际页面等待的时间过长,一个dom元素还没有出来,但是你的代码直接使用了这个WebElement,就会抛出NullPointer异常。来解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待,另一种是显式等待。
隐式等待:调用 driver.implicitly_wait。然后它将等待 10 秒,然后再获取不可用的元素。示例代码如下:
显式等待:显式等待是表示在执行获取元素的操作之前满足一定条件。还可以指定等待的最长时间,超过这个时间就抛出异常。显示等待应使用 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 预期的条件完成。示例代码如下:
其他一些等待条件:
1、presence_of_element_located:元素已加载。
2、presence_of_all_emement_located:页面中所有满足条件的元素都被加载。
3、element_to_be_cliable:一个元素是可点击的。
切换页面:
有时窗口中有很多子标签页。肯定是时候换了。Selenium 提供了一个叫做 switch_to_window 的开关来切换,可以从 driver.window_handles 中找到要切换到哪个页面。示例代码如下:
self.driver.switch_to_window(self.driver.window_handles[1])
设置代理ip:
有时某些网页被频繁爬取。服务器发现你是爬虫后,会屏蔽你的IP地址。这时候我们可以更改代理ip。更改代理ip,不同的浏览器有不同的实现。以下是 Chrome 浏览器的示例:
WebElement 元素:
from selenium.webdriver.remote.webelement import WebElement 类是每个检索到的元素所属的类。
有一些常用的属性:
1、get_attribute:这个标签的一个属性的值。
2、screentshot:获取当前页面的截图。此方法只能在驱动程序上使用。
驱动的对象类也是继承自WebElement。