做网站个网站要多少钱中国企业网站开发

news/2025/9/23 23:18:52/文章来源:
做网站个网站要多少钱,中国企业网站开发,北京公司logo制作,保险代理公司爬虫专栏#xff1a;http://t.csdnimg.cn/WfCSx 前言 在前一章中#xff0c;我们了解了 Ajax 的分析和抓取方式#xff0c;这其实也是 JavaScript 动态渲染的页面的一种情形#xff0c;通过直接分析 Ajax#xff0c;我们仍然可以借助 requests 或 urllib 来实现数据爬取…爬虫专栏http://t.csdnimg.cn/WfCSx 前言 在前一章中我们了解了 Ajax 的分析和抓取方式这其实也是 JavaScript 动态渲染的页面的一种情形通过直接分析 Ajax我们仍然可以借助 requests 或 urllib 来实现数据爬取。 不过 JavaScript 动态渲染的页面不止 Ajax 这一种。比如中国青年网详见 国内_新闻频道_中国青年网它的分页部分是由 JavaScript 生成的并非原始 HTML 代码这其中并不包含 Ajax 请求。比如 ECharts 的官方实例详见 http://echarts.baidu.com/demo.html其图形都是经过 JavaScript 计算之后生成的。再有淘宝这种页面它即使是 Ajax 获取的数据但是其 Ajax 接口含有很多加密参数我们难以直接找出其规律也很难直接分析 Ajax 来抓取。 为了解决这些问题我们可以直接使用模拟浏览器运行的方式来实现这样就可以做到在浏览器中看到是什么样抓取的源码就是什么样也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面不用管网页后台的 Ajax 接口到底有哪些参数。 Python 提供了许多模拟浏览器运行的库如 Selenium、Splash、PyV8、Ghost 等。本章中我们就来介绍一下 Selenium 和 Splash 的用法。有了它们就不用再为动态渲染的页面发愁了。 Selenium 的使用 Selenium 是一个自动化测试工具利用它可以驱动浏览器执行特定的动作如点击、下拉等操作同时还可以获取浏览器当前呈现的页面的源代码做到可见即可爬。对于一些 JavaScript 动态渲染的页面来说此种抓取方式非常有效。本节中就让我们来感受一下它的强大之处吧。 1. 准备工作 本节以 Chrome 为例来讲解 Selenium 的用法。在开始之前请确保已经正确安装好了 Chrome 浏览器并配置好了 ChromeDriver。另外还需要正确安装好 Python 的 Selenium 库详细的安装和配置过程可以参考Python爬虫请求库安装#1-CSDN博客 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_element_located((By.ID, content_left)))print(browser.current_url)print(browser.get_cookies())print(browser.page_source) finally:browser.close() 运行代码后发现会自动弹出一个 Chrome 浏览器。浏览器首先会跳转到百度然后在搜索框中输入 Python接着跳转到搜索结果页。 此时在控制台的输出结果如下 https://www.baidu.com/s?ieutf-8f8rsv_bp0rsv_idx1tnbaiduwdPythonrsv_pqc94d0df9000a72d0rsv_t07099xvun1ZmC0bf6eQvygJ43IUTTUOl5FCJVPgwG2YREs70GplJjH2F%2BCQrqlangcnrsv_enter1rsv_sug36rsv_sug20inputT87rsv_sug487 [{secure: False, value: B490B5EBF6F3CD402E515D22BCDA1598, domain: .baidu.com, path: /, httpOnly: False, name: BDORZ, expiry: 1491688071.707553}, {secure: False, value: 22473_1441_21084_17001, domain: .baidu.com, path: /, httpOnly: False, name: H_PS_PSSID}, {secure: False, value: 12883875381399993259_00_0_I_R_2_0303_C02F_N_I_I_0, domain: .www.baidu.com, path: /, httpOnly: False, name: __bsi, expiry: 1491601676.69722}] !DOCTYPE html!--STATUS OK--.../html 源代码过长在此省略。可以看到我们得到的当前 URL、Cookies 和源代码都是浏览器中的真实内容。 所以说如果用 Selenium 来驱动浏览器加载网页的话就可以直接拿到 JavaScript 渲染的结果了不用担心使用的是什么加密系统。 下面来详细了解一下 Selenium 的用法。 3. 声明浏览器对象 Selenium 支持非常多的浏览器如 Chrome、Firefox、Edge 等还有 Android、BlackBerry 等手机端的浏览器。另外也支持无界面浏览器 PhantomJS。 此外我们可以用如下方式初始化 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() 方法访问淘宝然后打印出源代码代码如下 from selenium import webdriver ​ browser webdriver.Chrome() browser.get(https://www.taobao.com) print(browser.page_source) browser.close() 运行后发现弹出了 Chrome 浏览器并且自动访问了淘宝然后控制台输出了淘宝页面的源代码随后浏览器关闭。 通过这几行简单的代码我们可以实现浏览器的驱动并获取网页源码非常便捷。 4. 查找节点 Selenium 可以驱动浏览器完成各种操作比如填充表单、模拟点击等。比如我们想要完成向某个输入框输入文字的操作总需要知道这个输入框在哪里吧而 Selenium 提供了一系列查找节点的方法我们可以用这些方法来获取想要的节点以便下一步执行一些动作或者提取信息。 单个节点 比如想要从淘宝页面中提取搜索框这个节点首先要观察它的源代码。 可以发现它的 id 是 qname 也是 q。此外还有许多其他属性此时我们就可以用多种方式获取它了。比如find_element_by_name() 是根据 name 值获取find_element_by_id() 是根据 id 获取。另外还有根据 XPath、CSS 选择器等获取的方式。 我们用代码实现一下 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(//*[idq]) print(input_first, input_second, input_third) browser.close() 这里我们使用 3 种方式获取输入框分别是根据 ID、CSS 选择器和 XPath 获取它们返回的结果完全一致。运行结果如下 selenium.webdriver.remote.webelement.WebElement (session5e53d9e1c8646e44c14c1c2880d424af, element0.5649563096161541-1) selenium.webdriver.remote.webelement.WebElement (session5e53d9e1c8646e44c14c1c2880d424af, element0.5649563096161541-1) selenium.webdriver.remote.webelement.WebElement (session5e53d9e1c8646e44c14c1c2880d424af, element0.5649563096161541-1) 可以看到这 3 个节点都是 WebElement 类型是完全一致的。 这里列出所有获取单个节点的方法 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 另外Selenium 还提供了通用方法 find_element()它需要传入两个参数查找方式 By 和值。实际上它就是 find_element_by_id() 这种方法的通用函数版本比如 find_element_by_id(id) 就等价于 find_element(By.ID, id)二者得到的结果完全一致。我们用代码实现一下 from selenium import webdriver from selenium.webdriver.common.by import By ​ browser webdriver.Chrome() browser.get(https://www.taobao.com) input_first browser.find_element(By.ID, q) print(input_first) browser.close() 实际上这种查找方式的功能和上面列举的查找函数完全一致不过参数更加灵活。 多个节点 如果查找的目标在网页中只有一个那么完全可以用 find_element() 方法。但如果有多个节点再用 find_element() 方法查找就只能得到第一个节点了。如果要查找所有满足条件的节点需要用 find_elements() 这样的方法。注意在这个方法的名称中element 多了一个 s注意区分。 比如要查找淘宝左侧导航条的所有条目。 就可以这样来实现 from selenium import webdriverbrowser webdriver.Chrome() browser.get(https://www.taobao.com) lis browser.find_elements_by_css_selector(.service-bd li) print(lis) browser.close() 运行结果如下 [selenium.webdriver.remote.webelement.WebElement (sessionc26290835d4457ebf7d96bfab3740d19, element0.09221044033125603-1), selenium.webdriver.remote.webelement.WebElement (sessionc26290835d4457ebf7d96bfab3740d19, element0.09221044033125603-2), selenium.webdriver.remote.webelement.WebElement (sessionc26290835d4457ebf7d96bfab3740d19, element0.09221044033125603-3)...selenium.webdriver.remote.webelement.WebElement (sessionc26290835d4457ebf7d96bfab3740d19, element0.09221044033125603-16)] 这里简化了输出结果中间部分省略。 可以看到得到的内容变成了列表类型列表中的每个节点都是 WebElement 类型。 也就是说如果我们用 find_element() 方法只能获取匹配的第一个节点结果是 WebElement 类型。如果用 find_elements() 方法则结果是列表类型列表中的每个节点是 WebElement 类型。 这里列出所有获取多个节点的方法 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() 方法来选择这时可以这样写 lis browser.find_elements(By.CSS_SELECTOR, .service-bd li) 结果是完全一致的。 6. 节点交互 Selenium 可以驱动浏览器来执行一些操作也就是说可以让浏览器模拟执行一些动作。比较常见的用法有输入文字时用 send_keys 方法清空文字时用 clear 方法点击按钮时用 click 方法。示例如下 from selenium import webdriver import timebrowser 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) button browser.find_element_by_class_name(btn-search) button.click() 这里首先驱动浏览器打开淘宝然后用 find_element_by_id() 方法获取输入框然后用 send_keys() 方法输入 iPhone 文字等待一秒后用 clear() 方法清空输入框再次调用 send_keys() 方法输入 iPad 文字之后再用 find_element_by_class_name() 方法获取搜索按钮最后调用 click() 方法完成搜索动作。 通过上面的方法我们就完成了一些常见节点的动作操作更多的操作可以参见官方文档的交互动作介绍 7. WebDriver API — Selenium Python Bindings 2 documentation。 7. 动作链 在上面的实例中一些交互动作都是针对某个节点执行的。比如对于输入框我们就调用它的输入文字和清空文字方法对于按钮就调用它的点击方法。其实还有另外一些操作它们没有特定的执行对象比如鼠标拖曳、键盘按键等这些动作用另一种方式来执行那就是动作链。 比如现在实现一个节点的拖曳操作将某个节点从一处拖曳到另外一处可以这样实现 from selenium import webdriver from selenium.webdriver import ActionChainsbrowser webdriver.Chrome() url http://www.runoob.com/try/try.php?filenamejqueryui-api-droppable browser.get(url) browser.switch_to.frame(iframeResult) source browser.find_element_by_css_selector(#draggable) target browser.find_element_by_css_selector(#droppable) actions ActionChains(browser) actions.drag_and_drop(source, target) actions.perform() 首先打开网页中的一个拖曳实例然后依次选中要拖曳的节点和拖曳到的目标节点接着声明 ActionChains 对象并将其赋值为 actions 变量然后通过调用 actions 变量的 drag_and_drop() 方法再调用 perform() 方法执行动作此时就完成了拖曳操作 以上两图分别为在拖曳前和拖曳后的结果。 更多的动作链操作可以参考官方文档的动作链介绍7. WebDriver API — Selenium Python Bindings 2 documentation。 8. 执行 JavaScript 对于某些操作Selenium API 并没有提供。比如下拉进度条它可以直接模拟运行 JavaScript此时使用 execute_script() 方法即可实现代码如下 from selenium import webdriverbrowser webdriver.Chrome() browser.get(https://www.zhihu.com/explore) browser.execute_script(window.scrollTo(0, document.body.scrollHeight)) browser.execute_script(alert(To Bottom)) 这里就利用 execute_script() 方法将进度条下拉到最底部然后弹出 alert 提示框。 所以说有了这个方法基本上 API 没有提供的所有功能都可以用执行 JavaScript 的方式来实现了。 9. 获取节点信息 前面说过通过 page_source 属性可以获取网页的源代码接着就可以使用解析库如正则表达式、Beautiful Soup、pyquery 等来提取信息了。 不过既然 Selenium 已经提供了选择节点的方法返回的是 WebElement 类型那么它也有相关的方法和属性来直接提取节点信息如属性、文本等。这样的话我们就可以不用通过解析源代码来提取信息了非常方便。 接下来就看看通过怎样的方式来获取节点信息吧。 获取属性 我们可以使用 get_attribute() 方法来获取节点的属性但是其前提是先选中这个节点示例如下 from selenium import webdriver from selenium.webdriver import ActionChainsbrowser webdriver.Chrome() url https://www.zhihu.com/explore browser.get(url) logo browser.find_element_by_id(zh-top-link-logo) print(logo) print(logo.get_attribute(class)) 运行之后程序便会驱动浏览器打开知乎页面然后获取知乎的 logo 节点最后打印出它的 class。 控制台的输出结果如下 selenium.webdriver.remote.webelement.WebElement (sessione08c0f28d7f44d75ccd50df6bb676104, element0.7236390660048155-1) zu-top-link-logo 通过 get_attribute() 方法然后传入想要获取的属性名就可以得到它的值了。 获取文本值 每个 WebElement 节点都有 text 属性直接调用这个属性就可以得到节点内部的文本信息这相当于 Beautiful Soup 的 get_text() 方法、pyquery 的 text() 方法示例如下 from selenium import webdriverbrowser webdriver.Chrome() url https://www.zhihu.com/explore browser.get(url) input browser.find_element_by_class_name(zu-top-add-question) print(input.text) 这里依然先打开知乎页面然后获取 “提问” 按钮这个节点再将其文本值打印出来。 控制台的输出结果如下 提问 获取 ID、位置、标签名、大小 另外WebElement 节点还有一些其他属性比如 id 属性可以获取节点 idlocation 属性可以获取该节点在页面中的相对位置tag_name 属性可以获取标签名称size 属性可以获取节点的大小也就是宽高这些属性有时候还是很有用的。示例如下 from selenium import webdriverbrowser webdriver.Chrome() url https://www.zhihu.com/explore browser.get(url) input browser.find_element_by_class_name(zu-top-add-question) print(input.id) print(input.location) print(input.tag_name) print(input.size) 这里首先获得 “提问” 按钮这个节点然后调用其 id、location、tag_name、size 属性来获取对应的属性值。 10. 切换 Frame 我们知道网页中有一种节点叫作 iframe也就是子 Frame相当于页面的子页面它的结构和外部网页的结构完全一致。Selenium 打开页面后它默认是在父级 Frame 里面操作而此时如果页面中还有子 Frame它是不能获取到子 Frame 里面的节点的。这时就需要使用 switch_to.frame() 方法来切换 Frame。示例如下 import time from selenium import webdriver from selenium.common.exceptions import NoSuchElementExceptionbrowser webdriver.Chrome() url http://www.runoob.com/try/try.php?filenamejqueryui-api-droppable browser.get(url) browser.switch_to.frame(iframeResult) try:logo browser.find_element_by_class_name(logo) except NoSuchElementException:print(NO LOGO) browser.switch_to.parent_frame() logo browser.find_element_by_class_name(logo) print(logo) print(logo.text) 控制台输出 NO LOGO selenium.webdriver.remote.webelement.WebElement (session4bb8ac03ced4ecbdefef03ffdc0e4ccd, element0.13792611320464965-2) RUNOOB.COM 这里还是以前面演示动作链操作的网页为实例首先通过 switch_to.frame() 方法切换到子 Frame 里面然后尝试获取子 Frame 里的 logo 节点这是不能找到的如果找不到的话就会抛出 NoSuchElementException 异常异常被捕捉之后就会输出 NO LOGO。接下来重新切换回父级 Frame然后再次重新获取节点发现此时可以成功获取了。 所以当页面中包含子 Frame 时如果想获取子 Frame 中的节点需要先调用 switch_to.frame() 方法切换到对应的 Frame然后再进行操作。 11. 延时等待 在 Selenium 中get() 方法会在网页框架加载结束后结束执行此时如果获取 page_source可能并不是浏览器完全加载完成的页面如果某些页面有额外的 Ajax 请求我们在网页源代码中也不一定能成功获取到。所以这里需要延时等待一定时间确保节点已经加载出来。 这里等待的方式有两种一种是隐式等待一种是显式等待。 隐式等待 当使用隐式等待执行测试的时候如果 Selenium 没有在 DOM 中找到节点将继续等待超出设定时间后则抛出找不到节点的异常。换句话说当查找节点而节点并没有立即出现的时候隐式等待将等待一段时间再查找 DOM默认的时间是 0。示例如下 from selenium import webdriverbrowser webdriver.Chrome() browser.implicitly_wait(10) browser.get(https://www.zhihu.com/explore) input browser.find_element_by_class_name(zu-top-add-question) print(input) 在这里我们用 implicitly_wait() 方法实现了隐式等待。 显式等待 隐式等待的效果其实并没有那么好因为我们只规定了一个固定时间而页面的加载时间会受到网络条件的影响。 这里还有一种更合适的显式等待方法它指定要查找的节点然后指定一个最长等待时间。如果在规定时间内加载出来了这个节点就返回查找的节点如果到了规定时间依然没有加载出该节点则抛出超时异常。示例如下 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECbrowser webdriver.Chrome() browser.get(https://www.taobao.com/) wait WebDriverWait(browser, 10) input wait.until(EC.presence_of_element_located((By.ID, q))) button wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, .btn-search))) print(input, button) 这里首先引入 WebDriverWait 这个对象指定最长等待时间然后调用它的 until() 方法传入要等待条件 expected_conditions。比如这里传入了 presence_of_element_located 这个条件代表节点出现的意思其参数是节点的定位元组也就是 ID 为 q 的节点搜索框。 这样可以做到的效果就是在 10 秒内如果 ID 为 q 的节点即搜索框成功加载出来就返回该节点如果超过 10 秒还没有加载出来就抛出异常。 对于按钮可以更改一下等待条件比如改为 element_to_be_clickable也就是可点击所以查找按钮时查找 CSS 选择器为.btn-search 的按钮如果 10 秒内它是可点击的也就是成功加载出来了就返回这个按钮节点如果超过 10 秒还不可点击也就是没有加载出来就抛出异常。 运行代码在网速较佳的情况下是可以成功加载出来的。 控制台的输出如下 selenium.webdriver.remote.webelement.WebElement (session07dd2fbc2d5b1ce40e82b9754aba8fa8, element0.5642646294074107-1) selenium.webdriver.remote.webelement.WebElement (session07dd2fbc2d5b1ce40e82b9754aba8fa8, element0.5642646294074107-2) 可以看到控制台成功输出了两个节点它们都是 WebElement 类型。 如果网络有问题10 秒内没有成功加载那就抛出 TimeoutException 异常此时控制台的输出如下 TimeoutException Traceback (most recent call last) ipython-input-4-f3d73973b223 in module()7 browser.get(https://www.taobao.com/)8 wait WebDriverWait(browser, 10) ---- 9 input wait.until(EC.presence_of_element_located((By.ID, q))) 关于等待条件其实还有很多比如判断标题内容判断某个节点内是否出现了某文字等。表中列出了所有的等待条件。 等待条件及其含义 等待条件含义title_is标题是某内容title_contains标题包含某内容presence_of_element_located节点加载出传入定位元组如 (By.ID, p)visibility_of_element_located节点可见传入定位元组visibility_of可见传入节点对象presence_of_all_elements_located所有节点加载出text_to_be_present_in_element某个节点文本包含某文字text_to_be_present_in_element_value某个节点值包含某文字frame_to_be_available_and_switch_to_it frame加载并切换invisibility_of_element_located节点不可见element_to_be_clickable节点可点击staleness_of判断一个节点是否仍在 DOM可判断页面是否已经刷新element_to_be_selected节点可选择传节点对象element_located_to_be_selected节点可选择传入定位元组element_selection_state_to_be传入节点对象以及状态相等返回 True否则返回 Falseelement_located_selection_state_to_be传入定位元组以及状态相等返回 True否则返回 Falsealert_is_present是否出现 Alert 更多详细的等待条件的参数及用法介绍可以参考官方文档7. WebDriver API — Selenium Python Bindings 2 documentation。 12. 前进后退 平常使用浏览器时都有前进和后退功能Selenium 也可以完成这个操作它使用 back() 方法后退使用 forward() 方法前进。示例如下 import time from selenium import webdriverbrowser webdriver.Chrome() browser.get(https://www.baidu.com/) browser.get(https://www.taobao.com/) browser.get(https://www.python.org/) browser.back() time.sleep(1) browser.forward() browser.close() 这里我们连续访问 3 个页面然后调用 back() 方法回到第二个页面接下来再调用 forward() 方法又可以前进到第三个页面。 13. Cookies 使用 Selenium还可以方便地对 Cookies 进行操作例如获取、添加、删除 Cookies 等。示例如下 from selenium import webdriverbrowser webdriver.Chrome() browser.get(https://www.zhihu.com/explore) print(browser.get_cookies()) browser.add_cookie({name: name, domain: www.zhihu.com, value: germey}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies()) 首先我们访问了知乎。加载完成后浏览器实际上已经生成 Cookies 了。接着调用 get_cookies() 方法获取所有的 Cookies。然后我们添加一个 Cookie这里传入一个字典有 name、domain 和 value 等内容。接下来再次获取所有的 Cookies。可以发现结果就多了这一项新加的 Cookie。最后调用 delete_all_cookies() 方法删除所有的 Cookies。再重新获取发现结果就为空了。 控制台的输出如下 [{secure: False, value: NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY|1491604091|236e34290a6f407bfbb517888849ea509ac366d0, domain: .zhihu.com, path: /, httpOnly: False, name: l_cap_id, expiry: 1494196091.403418}] [{secure: False, value: germey, domain: .www.zhihu.com, path: /, httpOnly: False, name: name}, {secure: False, value: NGM0ZTM5NDAwMWEyNDQwNDk5ODlkZWY3OTkxY2I0NDY|1491604091|236e34290a6f407bfbb517888849ea509ac366d0, domain: .zhihu.com, path: /, httpOnly: False, name: l_cap_id, expiry: 1494196091.403418}] [] 通过以上方法来操作 Cookies 还是非常方便的。 14. 选项卡管理 在访问网页的时候会开启一个个选项卡。在 Selenium 中我们也可以对选项卡进行操作。示例如下 import time from selenium import webdriverbrowser webdriver.Chrome() browser.get(https://www.baidu.com) browser.execute_script(window.open()) print(browser.window_handles) browser.switch_to_window(browser.window_handles[1]) browser.get(https://www.taobao.com) time.sleep(1) browser.switch_to_window(browser.window_handles[0]) browser.get(https://python.org) 控制台输出如下 [CDwindow-4f58e3a7-7167-4587-bedf-9cd8c867f435, CDwindow-6e05f076-6d77-453a-a36c-32baacc447df] 首先访问了百度然后调用了 execute_script() 方法这里传入 window.open() 这个 JavaScript 语句新开启一个选项卡。接下来我们想切换到该选项卡。这里调用 window_handles 属性获取当前开启的所有选项卡返回的是选项卡的代号列表。要想切换选项卡只需要调用 switch_to_window() 方法即可其中参数是选项卡的代号。这里我们将第二个选项卡代号传入即跳转到第二个选项卡接下来在第二个选项卡下打开一个新页面然后切换回第一个选项卡重新调用 switch_to_window() 方法再执行其他操作即可。 15. 异常处理 在使用 Selenium 的过程中难免会遇到一些异常例如超时、节点未找到等错误一旦出现此类错误程序便不会继续运行了。这里我们可以使用 try except 语句来捕获各种异常。 首先演示一下节点未找到的异常示例如下 from selenium import webdriverbrowser webdriver.Chrome() browser.get(https://www.baidu.com) browser.find_element_by_id(hello) 这里首先打开百度页面然后尝试选择一个并不存在的节点此时就会遇到异常。 运行之后控制台的输出如下 NoSuchElementException Traceback (most recent call last) ipython-input-23-978945848a1b in module()3 browser webdriver.Chrome()4 browser.get(https://www.baidu.com) ---- 5 browser.find_element_by_id(hello) 可以看到这里抛出了 NoSuchElementException 异常这通常是节点未找到的异常。为了防止程序遇到异常而中断我们需要捕获这些异常示例如下 from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElementExceptionbrowser webdriver.Chrome() try:browser.get(https://www.baidu.com) except TimeoutException:print(Time Out) try:browser.find_element_by_id(hello) except NoSuchElementException:print(No Element) finally:browser.close() 这里我们使用 try except 来捕获各类异常。比如我们对 find_element_by_id() 查找节点的方法捕获 NoSuchElementException 异常这样一旦出现这样的错误就进行异常处理程序也不会中断了。 控制台的输出如下 No Element 关于更多的异常类可以参考官方文档7. WebDriver API — Selenium Python Bindings 2 documentation。 现在我们基本对 Selenium 的常规用法有了大体的了解。使用 Selenium处理 JavaScript 不再是难事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广东品牌网站设计专家鹿寨建设局网站

本次实验将采用docker部署zabbix 5.2平台监控ESXI 6.5虚拟化系统—————————————————————————— 请自行准备环境: 关于docker部署方案请参考: docker之核心概念与安装 关于docker部署zabbix方案请参考: docker容器方式部署zabbix监控平台 关于ESXI安…

网站建设完成后期维护网站的seo

前言:本文会介绍 Android 与 iOS 两个平台的处理方式 一、Android高版本在应用退到后台时,系统为了省电会限制应用的后台活动,因此我们需要开启一个前台服务,在前台服务中发送常驻任务栏通知,以此来保证App 退到后台时不会被限制活动. 前台服务代码如下: package com.notify…

长春市长春网站建设高端型网站制作

什么是 resolvectl “resolvectl” 是一个用于管理系统 DNS 解析配置的命令行工具。它是 systemd-resolved 服务的一部分,该服务是在许多基于 Systemd 的 Linux 发行版中用于管理网络配置和 DNS 解析的系统服务。 通过 resolvectl 命令,可以查看当前系…

建设银行官方网站首页入口购物网站排名大全

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9…

平台类网站有哪些广州市网站开发

-- 日、时、分、秒,这是计时的单位,惜时就应该惜日、惜时、惜分、惜秒。 用 Java 来读取 Excel 文件,检查每一行中的 URL,并将不符合条件的行标记为红色。以下是一个简单的示例,使用 Apache POI 进行 Excel 操作&#…

02020405 EF Core基础05-EF Core反向工程、EF Core和ADO.NET Core的联系、EF Core无法做到的事情

02020405 EF Core基础05-EF Core反向工程、EF Core和ADO.NET Core的联系、EF Core无法做到的事情 1. 数据库设计的三种形式(视频3-9)DB First → 先在数据库中将数据表建好了,然后再反向生成实体类。简单,但是不适…

02020406 EF Core基础06-EF Core生成的SQL

02020406 EF Core基础06-EF Core生成的SQL 1. 通过代码查看EF Core的SQL语句(视频3-12) 1.1 方法1:标准日志 // 标准日志用法示例 public static readonly ILoggerFactory MyLoggerFactory= LoggerFactory.Create(b…

北京网站建设工作南京专业做网站的公司有哪些

面试中的收获: 优点: 1. 设计用例考虑较为全面。 2. 自动化,性能都有涉猎,但不深入。 3. 对业务理解较深入。 缺点: 1. 接口自动化停留在初级阶段。 2. UI自动化了解较少。 3. 性能压测缺少数据清洗等步骤。 4. 算法还…

菲斯曼售后服务中心贵港seo关键词整站优化

拦截器-interceptor 在现代的一些前端框架上,拦截器基本上是很基础但很重要的一环,比如Angular原生就支持拦截器配置,VUE的Axios模块也给我们提供了拦截器配置,那么拦截器到底是什么,它有什么用?拦截器能帮…

网站打不开服务器错误建手机网站多少钱

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。 …

温州专业网站建设公司wordpress的链接怎么设置

把这个项目的文档迁入到SVN Server上的库中 【1】首先右键点击projectAdmin目录,这时候的右键菜单例如以下图看到的:选择copy URL toCLipboard,就是复制统一资源定位符(URL)到剪贴板中 https://KJ-AP01.中国.corpnet:8443/svn/pro…

中山建设监理有限公司 网站扁平化网站首页

随着数字化时代的来临,装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序,装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…

服装商城网站模板wordpress极简模板

前言 整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

网站编程培训班开发微信商城平台

串的概念:串(字符串):是由 0 个或多个字符组成的有限序列。 通常记为:s ‘ a1 a2 a3 … ai …an ’ ( n≥0 )。 串的逻辑结构和线性表极为相似。 一些串的类型: 空串:不含任何字符的串&#x…

信阳公司做网站托管管理系统app

目录 主要内容 模型研究 1.模型总览 2.boost模块 3.Inverter模块 4.控制模块 5.信号模块 结果一览 下载链接 主要内容 该模型为光伏逆变器低电压穿越仿真模型,采用boost加NPC拓扑结构,基于MATLAB/Simulink建模仿真。模型具备中点平衡…

网页设计动态效果怎么制作西安seo优化公司

本问题已经有最佳答案,请猛点这里访问。下面两个SQL查询有什么区别和号根据以下两个测试结果速度更快(237比460)。据我所知,这是一个标准。。氧化镁不,有细微的差别,你不能说没有差别除了语法之外没有别的区别。虽然只有一个简短的…

用于做网站的软件wordpress微信公众号开发

MR混合现实情景实训教学系统是一种将虚拟现实(VR)、增强现实(AR)相结合的先进技术。在法律教学课堂上,MR教学系统为学生模拟模拟法庭、案例分析等多种形式,让学生在实践中掌握法律知识,提高法律…

新余 网站建设做手机网站多少钱

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题,进一步提高网络的表现。下面是一个ResNet模型实现,使用PyTorch框架来展示如何实现基本的…

甘肃省建设工程网上投标网站成都住房和城乡建设局网站首页

背景: staticMesh 会根据业务需要随时变化,然后通过staticMesh的大小自适应相机位置,捕捉画面用来预览该模型,使模型在画布中不会太大导致显示不全,也不会太小 参考: UE实现相机聚焦物体功能_右弦GISer的…