python抓取动态网页(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和chromedriver)

优采云 发布时间: 2022-02-14 00:18

  python抓取动态网页(什么是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。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线