百度微建站,群辉nas 做网站,郑州做网站推,百度ai智能搜索引擎文章目录2 网络爬虫进阶2.1 Xpath2.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 Selenium3.1.1 概述3.1.2 安装3.1.3 元素定位3.1.4 元素信息3.1.5 …
文章目录2 网络爬虫进阶2.1 Xpath2.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 Selenium3.1.1 概述3.1.2 安装3.1.3 元素定位3.1.4 元素信息3.1.5 交互3.1.6 Chrome handless2 网络爬虫进阶
2.1 Xpath
虽然正则表达式处理字符串的能力很强但是在编写正则表达式的时候代码还是比较麻烦的如果不小心写错一处那么将无法匹配页面中所需要的数据因为网页中包含大量的节点而节点中又包含id、class等属性。如果在解析页面中的数据时通过Xpath来定位网页中的数据将会更加简单有效。
相比于bs4Xpath功能更加强大不仅提供非常简洁明了的路径选择表达式还提供了超过 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 langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title心得体会——尘鱼/title
/head
bodyh1浮世三千/h1hrh2文章内容/h2p无非两种人一种是做了没成功所以焦虑一种是没做要迎接失败了所以焦虑。人常常会把自己的所得经验告诫未得之人就如同许久之前高中的恩师一般念叨人常常会抱怨世间的不公想要改变眼前的一切而人在经历了大起大落后回望他们总是能发现自己的付出不像童话里的那般美好总能得到意外的对待。很少有些许的沉思或者来自内心深处的拷问自己至此该干什么身边的人说了那么多自己该不该反思什么。致命的慵懒总是带来成堆的接口漫天的抱怨似乎幽怨的黑洞似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及避开自己心里的拷问避开一切的一切似乎拖着拖着生活的美好就能如期而至。/pimg srchttps://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg alt图片加载失败 title该图片来源于尘鱼好美 weight480 height360p“日常所得焦虑无非是三天打鱼两天晒网时而努力时而颓废所致。”/pp约莫些许人同此言却又忘却其 “人生的悲欢并不相同他们只觉得你吵闹。br弃浮沉往事探前方长路坎坷弃勿须情感奔自己心中所想。br繁琐的慥词现已无人愿细细品味只愿将心中所得能与伯乐共享足矣。/p如果喜欢该案例可以关注我的网站bra hrefhttps://www.cnblogs.com/ChengYuHaoMei/点此前往/aaudio srchttps://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcodee20e7d6d765a63dc97d12357a8578f3cc746bc4 controls autoplay loop
/body
/html
tree etree.HTML(Testhtml)
nodeall tree.xpath(//*)
print(数据内容, nodeall)out /和//的不同 /表示的是从根节点开始定位表示的是一个层级。 //表示的是多个层级可以表示从任意位置开始定位 比如说想要获取所有p标签则无需从body开始直接//p即可。 2.1.2.2 获取子节点
如果想要获取一个节点中的子节点则使用/可以实现定位如想要定位html标签下的head标签下的div标签则可以写成
//html/head/div我们试一下敲一下下面的代码
from lxml import etreeTesthtml !DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title心得体会——尘鱼/title
/head
bodyh1浮世三千/h1hrh2文章内容/h2p无非两种人一种是做了没成功所以焦虑一种是没做要迎接失败了所以焦虑。人常常会把自己的所得经验告诫未得之人就如同许久之前高中的恩师一般念叨人常常会抱怨世间的不公想要改变眼前的一切而人在经历了大起大落后回望他们总是能发现自己的付出不像童话里的那般美好总能得到意外的对待。很少有些许的沉思或者来自内心深处的拷问自己至此该干什么身边的人说了那么多自己该不该反思什么。致命的慵懒总是带来成堆的接口漫天的抱怨似乎幽怨的黑洞似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及避开自己心里的拷问避开一切的一切似乎拖着拖着生活的美好就能如期而至。/pimg srchttps://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg alt图片加载失败 title该图片来源于尘鱼好美 weight480 height360p“日常所得焦虑无非是三天打鱼两天晒网时而努力时而颓废所致。”/pp约莫些许人同此言却又忘却其 “人生的悲欢并不相同他们只觉得你吵闹。br弃浮沉往事探前方长路坎坷弃勿须情感奔自己心中所想。br繁琐的慥词现已无人愿细细品味只愿将心中所得能与伯乐共享足矣。/p如果喜欢该案例可以关注我的网站bra hrefhttps://www.cnblogs.com/ChengYuHaoMei/点此前往/aaudio srchttps://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcodee20e7d6d765a63dc97d12357a8578f3cc746bc4 controls autoplay loop
/body
/html
tree etree.HTML(Testhtml)
imgnode tree.xpath(//body/img)
print(数据内容, imgnode)
out 2.1.2.3 获取父节点
有时候从最外面的标签一步一步走里面可能会比较麻烦从里面的标签一步一步走外面也不失为一种较好的方法。当我们想要获取一个节点的父节点时可以使用..来实现。
from lxml import etreeTesthtml !DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title心得体会——尘鱼/title
/head
bodyh1浮世三千/h1hrh2文章内容/h2p无非两种人一种是做了没成功所以焦虑一种是没做要迎接失败了所以焦虑。人常常会把自己的所得经验告诫未得之人就如同许久之前高中的恩师一般念叨人常常会抱怨世间的不公想要改变眼前的一切而人在经历了大起大落后回望他们总是能发现自己的付出不像童话里的那般美好总能得到意外的对待。很少有些许的沉思或者来自内心深处的拷问自己至此该干什么身边的人说了那么多自己该不该反思什么。致命的慵懒总是带来成堆的接口漫天的抱怨似乎幽怨的黑洞似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及避开自己心里的拷问避开一切的一切似乎拖着拖着生活的美好就能如期而至。/pimg srchttps://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg alt图片加载失败 title该图片来源于尘鱼好美 weight480 height360p“日常所得焦虑无非是三天打鱼两天晒网时而努力时而颓废所致。”/pp约莫些许人同此言却又忘却其 “人生的悲欢并不相同他们只觉得你吵闹。br弃浮沉往事探前方长路坎坷弃勿须情感奔自己心中所想。br繁琐的慥词现已无人愿细细品味只愿将心中所得能与伯乐共享足矣。/p如果喜欢该案例可以关注我的网站bra hrefhttps://www.cnblogs.com/ChengYuHaoMei/点此前往/aaudio srchttps://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcodee20e7d6d765a63dc97d12357a8578f3cc746bc4 controls autoplay loop
/body
/html
tree etree.HTML(Testhtml)
imgnode tree.xpath(//img/..)
print(数据内容, imgnode)out 2.1.2.4 获取文本
如果想要使用XPath获取HTML代码中的文本时可以使用text()方法。
敲一下下面的代码体会上述的话。
from lxml import etreeTesthtml !DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title心得体会——尘鱼/title
/head
bodyh1浮世三千/h1hrh2文章内容/h2p无非两种人一种是做了没成功所以焦虑一种是没做要迎接失败了所以焦虑。人常常会把自己的所得经验告诫未得之人就如同许久之前高中的恩师一般念叨人常常会抱怨世间的不公想要改变眼前的一切而人在经历了大起大落后回望他们总是能发现自己的付出不像童话里的那般美好总能得到意外的对待。很少有些许的沉思或者来自内心深处的拷问自己至此该干什么身边的人说了那么多自己该不该反思什么。致命的慵懒总是带来成堆的接口漫天的抱怨似乎幽怨的黑洞似乎解决的方法就像是时光隧道中那一丝薄弱的亮光微不可及避开自己心里的拷问避开一切的一切似乎拖着拖着生活的美好就能如期而至。/pimg srchttps://images.cnblogs.com/cnblogs_com/blogs/710924/galleries/2086847/o_220115052557_5af17f7f881b11ebb6edd017c2d2eca2.jpg alt图片加载失败 title该图片来源于尘鱼好美 weight480 height360p“日常所得焦虑无非是三天打鱼两天晒网时而努力时而颓废所致。”/pp约莫些许人同此言却又忘却其 “人生的悲欢并不相同他们只觉得你吵闹。br弃浮沉往事探前方长路坎坷弃勿须情感奔自己心中所想。br繁琐的慥词现已无人愿细细品味只愿将心中所得能与伯乐共享足矣。/p如果喜欢该案例可以关注我的网站bra hrefhttps://www.cnblogs.com/ChengYuHaoMei/点此前往/aaudio srchttps://audio04.dmhmusic.com/71_53_T10051752137_128_4_4_0_sdk-cpm/cn/0103/M00/10/B5/ChR45F8hdhCAJ_unAAdXW5beNxE239.mp3?xcodee20e7d6d765a63dc97d12357a8578f3cc746bc4 controls autoplay loop
/body
/html
tree etree.HTML(Testhtml)
TextNode tree.xpath(//body/p/text())
print(数据内容, TextNode)out 2.1.3 属性匹配
2.1.3.1 单个属性匹配
如果想要获取通过标签中的属性来进行匹配可以使用[标签属性]来进行匹配。
敲一下下面的代码体会这里所讲的知识点。
from lxml import etreeTesthtml !DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/title
/head
bodydivh1《自然》评选改变科学的10个计算机代码项目/h1div classtopspan id time2077年01月28号日14:58/span span id source新浪科技 /span a href#收藏本文/ahrp classtext北京时间 1 月 26 日消息据国外媒体报道从 Fortran 到 arXiv.org这些计算机编码和平台让生物学、气候科学和物理学等学科的发展达到了真正 “日新月异”的速度。/pp class text2019 年事件视界望远镜团队让世界首次看到了黑洞的样子。不过研究人员公布的这张发光环形物体的图像并不是传统的图片而是经过计算获得的。利用位于美国、墨西哥、智利、西班牙和南极地区的射电望远镜所得到的数据研究人员进行了数学转换最终合成了这张标志性的图片。研究团队还发布了实现这一壮举所用的编程代码并撰文记录这一发现其他研究者也可以在此基础上进一步加以分析。/p/div/div
/body
/htmltree etree.HTML(Testhtml)
TextNode tree.xpath(//span[id time])
print(数据内容, TextNode)out 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 如果想要获取标签名则可以使用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浏览器爬的东西一般也不多所以关于这部分我就不细讲了如果有需要的自己查个博客学一学很简单的加油