首页 > 其他分享 >爬虫学习-04

爬虫学习-04

时间:2022-12-06 19:00:17浏览次数:46  
标签:xpath body 04 text 爬虫 学习 html div 节点

一、xpath的使用

html中选择标签,可以使用的通用方式

  • css选择
  • xpath选择

1.1介绍

XPath 即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言,Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致如下

1.2语法的简单介绍

表达式 描述
nodename(写个什么标签就拿什么标签) 选取此节点的所有子节点(写个div标签就拿div标签,p标签就拿p标签)
/ 从当前节点选取直接子节点(html是个文档结构所以从根开始往下拿)
// 从当前节点选取子孙节点
. 选取当前节点
. . 选取当前节点的父节点
@ 选取属性

拓展:

1.3小案例实践

两个记住掌握的

  • 获取文本   text()
  • 获取属性   @属性
doc='''
<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html' id='id_a'>Name: My image 1 <br/><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
   <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
  </div>
 </body>
</html>
'''

from lxml import etree

html=etree.HTML(doc)
# html=etree.parse('search.html',etree.HTMLParser())
# 1 所有节点
# a=html.xpath('//*')
# 2 指定节点(结果为列表)
# a=html.xpath('//head')

# 3 子节点,子孙节点
# a=html.xpath('//div/a')
# a=html.xpath('//body/a') #无数据
# a=html.xpath('//body//a')
# 4 父节点
# a=html.xpath('//body//a[@href="image1.html"]/..')
# a=html.xpath('//body//a[1]/..')
# 也可以这样
# a=html.xpath('//body//a[1]/parent::*')
# a=html.xpath('//body//a[1]/parent::div')
# 5 属性匹配
# a=html.xpath('//body//a[@href="image1.html"]')

# 6 文本获取  text()    ********
# a=html.xpath('//body//a[@href="image1.html"]/text()')

# 7 属性获取            ******
# a=html.xpath('//body//a/@href')
# a=html.xpath('//body//a/@id')
# # 注意从1 开始取(不是从0)
# a=html.xpath('//body//a[1]/@id')
# 8 属性多值匹配
#  a 标签有多个class类,直接匹配就不可以了,需要用contains
# a=html.xpath('//body//a[@class="li"]')
# a=html.xpath('//body//a[@name="items"]')
# a=html.xpath('//body//a[contains(@class,"li")]')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 9 多属性匹配
# a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
# a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')

# 10 按序选择
# a=html.xpath('//a[2]/text()')
# a=html.xpath('//a[3]/@href')
# 取最后一个
# a=html.xpath('//a[last()]/@href')
# 位置小于3的
# a=html.xpath('//a[position()<3]/@href')
# 倒数第二个
# a=html.xpath('//a[last()-2]/@href')
# 11 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
# a=html.xpath('//a/ancestor::*')
# # 获取祖先节点中的div
# a=html.xpath('//a/ancestor::div')
# attribute:属性值
# a=html.xpath('//a[1]/attribute::*')
# a=html.xpath('//a[1]/attribute::href')
# child:直接子节点
# a=html.xpath('//a[1]/child::*')
# descendant:所有子孙节点
# a=html.xpath('//a[6]/descendant::*')

# following:当前节点之后所有节点
# a=html.xpath('//a[1]/following::*')
# a=html.xpath('//a[1]/following::*[1]/@href')
# following-sibling:当前节点之后同级节点
# a=html.xpath('//a[1]/following-sibling::*')
# a=html.xpath('//a[1]/following-sibling::a')
# a=html.xpath('//a[1]/following-sibling::*[2]')
a=html.xpath('//a[1]/following-sibling::*[2]/@href')

print(a)

1.4终极大招

复制

  • 像你要扒的地址发送一个get请求,转成文本
  • 用xpath去选择
  • 页面右键点检查——>控制台——>右键——>Copy Xpath 粘贴到代码里
import requests

res=requests.get('https://www.w3cschool.cn/xpath/xpath-syntax.html')
print(res.text)

from lxml import etree
html=etree.HTML(res.text)
res=html.xpath('//*[@id="pro-mian"]/div[1]/div[3]/div[1]/table[3]/tbody/tr[2]/td[2]/text()')
print(res)

二、selenium动作链

网站中有些按住鼠标,滑动的效果

  • 滑动验证码

两种形式

测试拖动的网页:https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

形式一:说白了一次性滑过去

  • 基于同一个动作链串行执行
    • actions是一个类,drag_and_drop是拖动与松开,从sourse拖动到target松开
        actions=ActionChains(bro) #拿到动作链对象
        actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行
        actions.perform()

形式二:一点一点挪过去

  • 不同的动作链,每次移动的位移都不同 
    • click_and_hold鼠标点住的效果,perform点住不动
    • 然后终点位置的X轴减去起始位置的X轴
    • move_by_offset一次性挪几个位置
ActionChains(bro).click_and_hold(sourse).perform()
distance=target.location['x']-sourse.location['x']
track=0
while track < distance:
    ActionChains(bro).move_by_offset(xoffset=2,yoffset=0).perform()
    track+=2

 

标签:xpath,body,04,text,爬虫,学习,html,div,节点
From: https://www.cnblogs.com/zzjjpp/p/16955836.html

相关文章

  • MarkDown学习
    Markdown学习二级标题三级标题四级标题五级标题字体斜体加粗斜体横线划去加粗引用MarkDown语法练习分割线图片网络壁纸超链接蓝桥杯官网表格姓......
  • Ubuntu22.04下安装docker启动失败 报:start request repeated too quickly for docker.
      在网上查了解决办法,基本都是/etc/docker/daemon.json里面出现格式错误或者docker的数据目录是挂载出来的但是没有自动挂载,重启服务器后,docker无法启动。确实大部......
  • django学习笔记-ORM
    0.安装第三方模块pipinstallmysqlclient1.ORM1.1.创建数据库启动mysql服务自带工具创建数据库createdatabasedemo01DEFAULTCHARSETutf8COLLATEutf8_gene......
  • Canvas学习笔记(四)线条操作
    在Canvas中,常见的线条操作属性有:属性说明lineWidth定义线条宽度lineCap定义线帽样式lineJoin定义两个线条交接处的样式常见的线条操作方法有:方......
  • 金蝶云苍穹的简单学习
    金蝶云苍穹的简单学习简介云苍穹是一套管理控制台云星瀚是一套带各种app的ERP应用。服务管理方式虽然使用的是ubuntu2204的系统.但是都是使用的systemd的管理......
  • Python异步爬虫(aiohttp版)
    异步协程不太了解的话可以去看我上篇博客:https://www.cnblogs.com/Red-Sun/p/16934843.htmlPS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的(如果外站需要加群或关......
  • 强化学习如何自定义环境?【写代码的时候如何与标准接轨】
    还是需要学习如何自定义一个可以交互的环境,走上标准的道路,才能调用很多东西。摸清楚套路,然后一步一步跟着实现。Justgetclosetoyouraim!这次的环境搭建主要模......
  • 爬虫从入门到入狱之入门(2)
    1 css选择器bs4可以通过遍历,搜索,css选择器选择标签frombs4importBeautifulSouphtml_doc="""<html><head><title>TheDormouse'sstory</title></head><body>......
  • vulkan 学习
    vukan兼容性https://vulkan.gpuinfo.org/listdevicescoverage.php?extension=VK_KHR_external_memory_win32&platform=allvulkan最早可以支持GTX680(2012年)参考N卡......
  • NetBackup 学习记录
    NetBackup学习记录一、简介   NetBackup(简称:NBU)是Symantec公司提供的企业级备份管理软件,它支持多种操作系统,包括UNIX、MicrosoftWindows、OS/2以及Macintos......