网络爬虫(二)——Xpath和Selenium的使用

文章目录

  • 2 网络爬虫进阶
    • 2.1 Xpath
      • 2.1.1 Xpath解析原理
      • 2.1.2 信息提取
        • 2.1.2.1 获取所有结点
        • 2.1.2.2 获取子节点
        • 2.1.2.3 获取父节点
        • 2.1.2.4 获取文本
      • 2.1.3 属性匹配
        • 2.1.3.1 单个属性匹配
        • 2.1.3.2 多个属性匹配
    • 3.1 Selenium
      • 3.1.1 概述
      • 3.1.2 安装
      • 3.1.3 元素定位
      • 3.1.4 元素信息
      • 3.1.5 交互
      • 3.1.6 Chrome handless

2 网络爬虫进阶

2.1 Xpath

虽然正则表达式处理字符串的能力很强,但是在编写正则表达式的时候代码还是比较麻烦的,如果不小心写错一处,那么将无法匹配页面中所需要的数据,因为网页中包含大量的节点,而节点中又包含id、class等属性。如果在解析页面中的数据时,通过Xpath来定位网页中的数据,将会更加简单有效。

相比于bs4,Xpath功能更加强大,不仅提供非常简洁明了的路径选择表达式,还提供了超过 100 个内建函数,用于字符串、数值、时间比较、序列处理、逻辑值等,几乎所有定位的节点都可以用 Xpath 来选择。

2.1.1 Xpath解析原理

在使用Xpath解析时,我们首先要做的是导入etree模块,且需要使用etree下的方法将被解析的页面源码数据加载到etree对象中。在实例化完成后,我们可以调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的捕获。

这里需要注意的是,etree模块是在lxml包下的模块,导入方式为:

from lxml import etree

如何将HTML数据加载到etree模块中?

  • 如果是本地的html文档,那么通过etree.parse(filepath)方法可以将源码数据加载到etree对象中。
  • 如果是互联网的源码数据,则使用etree.HTML(‘page_text’),其可以将源码数据加载到etree对象中。

2.1.2 信息提取

当将解析后的HTML页面加载到etree对象后,想要获取某个标签的信息,就需要用到定位。

2.1.2.1 获取所有结点

如果不加筛选,想要获取所有信息,则xpath方法中的表达式只需填入//*即可。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
nodeall = tree.xpath("//*")
print("数据内容:", nodeall)

out:

image-20220501101853137

/和//的不同

/表示的是从根节点开始定位,表示的是一个层级。

//表示的是多个层级,可以表示从任意位置开始定位

比如说想要获取所有p标签,则无需从body开始,直接//p即可。

2.1.2.2 获取子节点

如果想要获取一个节点中的子节点,则使用/可以实现定位,如想要定位html标签下的head标签下的div标签,则可以写成

//html/head/div

我们试一下敲一下下面的代码:

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
imgnode = tree.xpath("//body/img")
print("数据内容:", imgnode)

out:

image-20220501102516884

2.1.2.3 获取父节点

有时候从最外面的标签一步一步走里面可能会比较麻烦,从里面的标签一步一步走外面也不失为一种较好的方法。当我们想要获取一个节点的父节点时,可以使用..来实现。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
imgnode = tree.xpath("//img/..")
print("数据内容:", imgnode)

out:

image-20220501103345351

2.1.2.4 获取文本

如果想要使用XPath获取HTML代码中的文本时,可以使用text()方法。

敲一下下面的代码,体会上述的话。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>心得体会——尘鱼</title>
</head>
<body><h1>浮世三千</h1><hr><h2>文章内容</h2><p>无非两种人:一种是做了,没成功,所以焦虑;一种是没做,要迎接失败了,所以焦虑。人常常会把自己的所得经验告诫未得之人,就如同许久之前高中的恩师一般念叨;人常常会抱怨世间的不公,想要改变眼前的一切;而人在经历了大起大落后回望,他们总是能发现:自己的付出不像童话里的那般美好,总能得到意外的对待。很少有些许的沉思,或者来自内心深处的拷问:自己至此,该干什么,身边的人说了那么多,自己该不该反思什么。致命的慵懒总是带来成堆的接口,漫天的抱怨似乎幽怨的黑洞,似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及;避开自己心里的拷问,避开一切的一切,似乎拖着拖着生活的美好就能如期而至。</p><img src="https://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg" alt="图片加载失败" title="该图片来源于尘鱼好美" weight="480" height="360"><p>“日常所得焦虑,无非是三天打鱼两天晒网,时而努力时而颓废所致。”</p><p>约莫些许人同此言,却又忘却其 “人生的悲欢并不相同,他们只觉得你吵闹。<br>弃浮沉往事,探前方长路坎坷;弃勿须情感,奔自己心中所想。<br>繁琐的慥词现已无人愿细细品味,只愿将心中所得能与伯乐共享,足矣。</p>如果喜欢该案例可以关注我的网站<br><a href="https://www.cnblogs.com/ChengYuHaoMei/">点此前往</a><audio src="https://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcode=e20e7d6d765a63dc97d12357a8578f3cc746bc4" controls autoplay loop>
</body>
</html>
"""tree = etree.HTML(Testhtml)
TextNode = tree.xpath("//body/p/text()")
print("数据内容:", TextNode)

out:

image-20220501103653202

2.1.3 属性匹配

2.1.3.1 单个属性匹配

如果想要获取通过标签中的属性来进行匹配,可以使用[@标签属性]来进行匹配。

敲一下下面的代码,体会这里所讲的知识点。

from lxml import etreeTesthtml = """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div><h1>《自然》评选改变科学的10个计算机代码项目</h1><div class="top"><span id = "time">2077年01月28号日14:58</span> <span id = "source">新浪科技 </span>     <a href="#">收藏本文</a><hr><p class="text">北京时间 1 月 26 日消息,据国外媒体报道,从 Fortran 到 arXiv.org,这些计算机编码和平台让生物学、气候科学和物理学等学科的发展达到了真正 “日新月异”的速度。</p><p class = "text">2019 年,事件视界望远镜团队让世界首次看到了黑洞的样子。不过,研究人员公布的这张发光环形物体的图像并不是传统的图片,而是经过计算获得的。利用位于美国、墨西哥、智利、西班牙和南极地区的射电望远镜所得到的数据,研究人员进行了数学转换,最终合成了这张标志性的图片。研究团队还发布了实现这一壮举所用的编程代码,并撰文记录这一发现,其他研究者也可以在此基础上进一步加以分析。</p></div></div>
</body>
</html>"""tree = etree.HTML(Testhtml)
TextNode = tree.xpath("//span[@id ='time']")
print("数据内容:", TextNode)

out:

image-20220501104623878

2.1.3.2 多个属性匹配

如果你匹配的标签上面有多个属性,那么你可以通过@[属性1 and 属性2]来实现更加精确的定位,这个很简单,自己试试即可,这里不过多赘述。

3.1 Selenium

3.1.1 概述

Selenium是一个用于web应用程序测试的工具,其测试直接运行在浏览器中,就像真正的用户在操作一样。

Selenium还支持各种驱动,如IE驱动,谷歌驱动,火狐驱动等等,驱动真实浏览器完成测试。当然,其也支持无界面浏览器操作。

使用selenium可以达到真实打开浏览器操作的效果,还能使得网页中的js代码自动执行,实现动态加载。

3.1.2 安装

由于edge近年来给程序员的体验不错,故这里采用我使用edge而不是谷歌。

edge安装官方有详细介绍,这里不过多赘述。详见使用 WebDriver 自动执行 Microsoft Edge - Microsoft Edge Development | Microsoft Docs

如果看不懂也可以在这个博主里面学着安装(1条消息) Selenium驱动Edge浏览器_snrxian的博客-CSDN博客_edge selenium驱动

安装完成后试着打开一个py文件输出下面的代码运行一下。

from selenium import webdriver//创建驱动对象
browser = webdriver.Edge()
browser.get('https://www.baidu.com')
browser.quit()

如果可以让脚本自己打开一个浏览器就安装成功了。

如果你想要返回浏览器打开页面后加载的源码,可以使用其驱动对象.page_source属性,可以返回源码。

3.1.3 元素定位

Selenium可以自动化模拟鼠标和键盘来操作这些元素,点击、输入等。而操作这些元素前需要先找到它们,WebDriver提供很多定位元素的方法。

方法 解释 find_element_by_class_name() 通过节点的 class 属性值定位 find_element_by_name() 通过节点的 name 属性名定位 find_element_by_id() 通过节点的 id 属性值定位 find_element_by_link_text() 通过超链接节点的文本定位 find_element_by_partial_link_text() 通过超链接节点包含的部分文本定位 find_element_by_tag_name() 通过节点名定位 find_element_by_xpath() 通过 Xpath 语法定位 find_element_by_css_selector() 通过 CSS 选择器定位

实际上,在以前老版本中find_element_by_[标签] ()可以用于查找对应的web表单组件,但是现在统一被归结为find_element("标签","标签值")

如果你还是听不懂,可以试着敲一下下面的代码,体会我说的意思。

from selenium import webdriver# 1 创建对象
browser = webdriver.Edge()# 2 获取网页
url = "https://www.baidu.com/"
browser.get(url)# 3 元素定位
button = browser.find_element("id", "su")
print(button)

甚至于你前面学过了Xpath,你还可以使用find_element_by_xpath(“xpath表达式”)来进行定位。

如果你要获取多个表单组件,可以使用find_elements(“标签”,“标签值”),这里就不一一介绍了,在自己的脚本中改一改试一试就能懂了。

3.1.4 元素信息

如果想要获取某个表单组件的属性值,可以使用get_attribute(属性值)方法。演示如下:

from selenium import webdriver# 1 创建对象
browser = webdriver.Edge()# 2 获取网页
url = "https://www.baidu.com/"
browser.get(url)button1 = browser.find_element_by_id("su")print(button1.get_attribute("class"))

out:

image-20220503191946839

如果想要获取标签名,则可以使用tag_name()方法。

如果想要获取元素文本,则可以使用text()方法。这里需要稍加说明,元素文本指的是开始标签和结束标签中间夹着的文本。

3.1.5 交互

Selenium允许对Web页面进行简单的交互,如点击、滑动鼠标、前进、后退等操作。其适用于爬取一些滑到底部才能加载下一页的一些页面。

这里的知识点我也不做讲解,试着敲一下下面的脚本,你可以体会到点击、文本框输出、滑动页面等诸多操作。

from selenium import webdriver
import time# 1 创建对象
browser = webdriver.Edge()# 2 获取网页
url = "https://www.baidu.com/"
browser.get(url)# 3 睡眠几秒
time.sleep(2)# 4 获取文本框对象
input = browser.find_element("id", "kw")
time.sleep(2)# 输入文本“周杰伦”
input.send_keys("周杰伦")
time.sleep(2)# 5 获取百度一下的按钮
button = browser.find_element("id", "su")# 6 点击百度一下按钮
button.click()
time.sleep(2)# 7 滑到底部
js_bottom = 'document.documentElement.scrollTop = 100000'
browser.execute_script(js_bottom)
time.sleep(2)# 8 获取下一页按钮
next = browser.find_element("xpath", "//a[@class = 'n']")# 9 点击下一页
next.click()
time.sleep(2)# 10 回到上一页
browser.back()
time.sleep(2)# 11 回去
browser.forward()
time.sleep(3)# 12 退出
browser.quit()

3.1.6 Chrome handless

Chrome-headless模式是Google针对其浏览器59版新增加的一种模式,可以让你在不打开UI界面的情况下使用Chrome浏览器,这无疑为Selenium的使用提高了运行速度。

由于我使用的是Edge浏览器,爬的东西一般也不多,所以关于这部分我就不细讲了,如果有需要的,自己查个博客学一学,很简单的,加油!

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

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

相关文章

lintcode:买卖股票的最佳时机 III

买卖股票的最佳时机 III 假设你有一个数组&#xff0c;它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。 样例 给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6 解题 尝试参考买卖股票的最佳时机 II 提交运行发现错误&#…

团队项目计划BACKLOG

团队名称&#xff1a; 铁大老司机 团队成员&#xff1a; 组长&#xff1a;杨超群 组员&#xff1a;杨涛 杜文星 张家军 计划会议过程&#xff1a; 我们小组在周三下午进行了团队会议&#xff0c;会议召开在图书馆大厅&#xff0c;主要内容是进行项目的总体计划安排&#xff0…

C++从0到1的入门级教学(八)——通讯录管理系统

文章目录8 通讯录管理系统8.1 系统需求8.2 菜单功能8.3 退出功能8.4 添加联系人8.4.1 设计联系人结构体8.4.2 设计通讯录结构体8.4.3 main函数中创建通讯录8.4.4 封装添加联系人函数8.5 显示联系人8.5.1 封装显示联系人函数8.5.2 调用显示联系人函数8.6 删除联系人8.6.1 封装检…

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…

Hadoop总结

目录 大数据概述 Hadoop大数据开发平台 资源管理YARN 分布式文件系统HDFS 非关系型数据库NOSQL 分布式数据库HBASE 批处理和MapReduce 数据仓库查询分析和Hive 基于内存计算的Spark 流计算和Flink 图计算和PREGEL Hadoop常用命令总结 大数据概述 大数据的4V&#x…

HDFS的常用操作

1、HDFS文件的权限以及读写操作 HDFS文件的权限&#xff1a; •与Linux文件权限类似 •r: read; w:write; x:execute&#xff0c;权限x对于文件忽略&#xff0c;对于文件夹表示是否允许访问其内容 •如果Linux系统用户zhangsan使用hadoop命令创建一个文件&#xff0c;那么这个文…

并行计算总结

作者&#xff1a;ArimaMisaki 目录 1 并行计算概述. 2 1.1 基本概念. 2 1.2 存储器的层次结构. 3 1.3 并行计算. 3 1.4 动态互连网络. 4 1.5 并行计算机结构模型. 5 1.6 并行算法的基本设计策略. 6 1.7 并行编程风范. 6 1.8 单核多线程和并发执行. 7 1.9 拓展&#x…

基础总结篇之中的一个:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;能够為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就全然掌握&#xff0c;那基本不大可能&#xff0c;所以我们须要常常回过头再细致研读几遍&#xff0c;以领悟到作者的思想精…

数据结构杂谈(九)——二叉树的遍历

9 二叉树的遍历 文章目录9 二叉树的遍历9.1 递归函数基础9.2 深度优先遍历的实现9.3 二叉树层次遍历9.1 递归函数基础 什么是递归&#xff1f;调用自身就是叫递归&#xff0c;如下所示&#xff1a; void r(){r(); }我们习惯借用阶梯图来帮助我们理解这些知识。如果是同一层函数…

洛谷 P3750 [六省联考2017]分手是祝愿

传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> const int N100000,mod100003; #define For(i,a,b)…

解决 error: command 'swig' failed with exit status 1

2019独角兽企业重金招聘Python工程师标准>>> # pip install docker-registry 分析&#xff1a;观察出现的错误&#xff0c;发现最开始报错的地方提示不能找到openssl的.h头文件。一般.h头文件都是放到/usr/inclue目录下的&#xff0c;而且头文件所在的安装包一般叫…

Android安全-SO动态库注入

2019独角兽企业重金招聘Python工程师标准>>> 关于这方面技术&#xff0c;网上已经有大把的实现。在此&#xff0c;我只是记录下自己的学习过程。 0x1 原理 所谓的SO注入就是将代码拷贝到目标进程中&#xff0c;并结合函数重定向等其他技术&#xff0c;最终达到监控或…

BUG日志-2022.7.12——关于VSCode感叹号无法生成HTML骨架问题

解决办法&#xff1a;放弃使用多年的!&#xff0c;而采用html:5的形式。 原因&#xff1a;好像是因为VScode已经更新了 好多扩展也失效了。

hadoop 入门实例【转】

原文链接&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1、数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据…

AWS安装CDH5.3-CentOS6.4中关键操作步骤

1、在AWS masternode 上下载cloudera-manager-installer.bin安装包 [rootip-172-21-42-114 ~]# wget http://archive.cloudera.com/cm5/installer/latest/coludera-manager-installer.bin 此时会提示&#xff1a;-bash: wget: command not find 所以要现安装wget命令 [rootip-1…

You have an error in your SQL syntax; check the manual that corresponds to...

问题缘由&#xff1a; 使用datagrip插入数据时发生报错 使用插入语句为&#xff1a; insert into ev_name (‘username’,‘password’) values (‘admin’,‘123456’); 错误提示&#xff1a; You have an error in your SQL syntax; check the manual that corresponds to …