爬虫学习-04

news/2024/7/7 20:09:20

一、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

 


http://lihuaxi.xjx100.cn/news/327514.html

相关文章

不用USB,通过adb无线调试安卓手机页面

以前真机调试手机页面,都是使用数据线连接手机和电脑,近日身边没有USB数据线,折腾了下如何不依赖数据线只用无线调试手机页面,教程如下。 本教程适用于安卓11以及以上版本。否则应该使用USB数据线连接。一、安装adb工具 下载地址:https://developer.android.com/studio/re…

Unity【Multiplayer 多人在线】服务端、客户端通用架构的使用指南

文章目录&#x1f6a9; Import&#x1f680; protogen使用方法&#x1fa90; 客户端接口&#x1f308; 服务端接口&#x1f9ed; 数据处理&#x1f3a8; Example&#x1f6a9; Import 下载SKFramework框架&#xff0c;导入到Unity中&#xff1b; 在框架Package Manager中搜索并…

Java高效率复习-MySQL下篇[MySQL]

前言 本文章的语言描述会比上篇多一些 数据库的创建修改与删除 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量限制为29个必须只能包含A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;_等63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个My…

超透镜与超表面全息

超透镜和超表面因其操纵电磁场的独特特性而在科学上声名鹊起&#xff0c;如今它们的制造已经变得可行。但它们的设计难度远远超过了传统镜片&#xff0c;因为必须考虑到纳米级构件的特性。 VirtualLab Fusion的优势  统一的平台&#xff1a;具有将纳米级构建模块和大尺…

CUDA入门和网络加速学习(一)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. GPU与CPU区别 处理器指标一般主要分为两大类&…

彻底搞懂MySql的B+Tree

1.什么是索引 官方定义&#xff1a;一种能为mysql提高查询效率的数据结构&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如&#xff0c;一本书&#xff0c;你想找到自己想看的章节内容&#xff0c;直接查询目录就行。这里的目录就类似索引…

[附源码]计算机毕业设计勤工助学管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

(十四)笔记.net学习之RabbitMQ工作模式

RabbitMQ在.net中简单使用一、简单模式1.生产者2.消费者二、工作队列模式1.工作队列模式介绍2.生产者发送消息3.消费能力三、发布/订阅模式1.介绍2.生产者3.消费者四、Routing路由模式1.介绍2.生产着3.消费者五、topic 主题模式1.介绍2. 生产者3.消费者一、简单模式 1.生产者 …