13. 实战:XPath法抓取某网站外包信息

2023-11-10

目录 

前言

思路

代码实现

第一步,先获取页面源代码

第二步,交给XPath的HTML解释器进行解析

第三步,通过源代码检查并获取XPath路径

第四步,创建csv文件,准备写入数据

第五步,遍历所有的div,获取我们需要的信息

完整代码

运行结果

总结


前言

我们通过前面小节的学习已经了解了XPath的基本语法,这一节我们将以一个比较复杂的网站来试水,它的标签嵌套十分多而且复杂,足够让我们来练习。


思路

1. 拿到页面源代码

2. 提取和解析数据

3. 把数据保存为csv文件


代码实现

第一步,先获取页面源代码

url = "见评论区"
resp = requests.get(url)
# print(resp.text)

第二步,交给XPath的HTML解释器进行解析

# 解析
html = etree.HTML(resp.text)

第三步,通过源代码检查并获取XPath路径

注意,这一步很有可能出现问题,因为这个网站是一直在动态变化的,所以不能直接用绝对路径,而要用一些唯一的属性来标定才能精准定位。当然,我们也可以先检查源代码并复制XPath路径,再进行微调。

右击查询到的服务商板块,单击检查,即可跳转到源代码对应的代码段中,并且移动鼠标可以观察到每个标签包裹的板块。

通过观察发现这里是我们需要的标签,所以复制绝对路径后再把最后一个标签的[1]删掉,就可以获取本页面上所有类似的服务商板块了,也就是所有的查询结果。但是根据实际我们需要修改一些前置标签的属性值来定位,否则很有可能抓到空列表。

最后拿到的效果是这样的:

# 拿到每一个服务商的div
divs = html.xpath("/html/body/div[@id='__nuxt']/div[@id='__layout']/div[@class='app-page-layout']/div[3]/div[@class='s50-search-list-page']/div[4]/div[4]/div[1]/div[@class='service-card-wrap']")
# print(len(divs))

打印列表长度是为了debug,在源代码中查找最后的属性值为51个,除去我们查找范围外的一个正好为50个,而我们打印出来的列表长度也是50,说明找到了50个子项,是对应的。

第四步,创建csv文件,准备写入数据

with open("猪八戒Java.csv", mode="a+", newline='', encoding="utf-8") as f:
    csvwriter = csv.writer(f)

第五步,遍历所有的div,获取我们需要的信息

    for div in divs:  # 每一个服务商信息
        price = div.xpath("./div/div[@class='bot-content']/div/span/text()")[0].strip("¥")
        title = "Java".join(div.xpath("./div/div[@class='bot-content']/div[2]/a/text()"))
        score = div.xpath("./div/div[@class='bot-content']/div[4]/div[@class='fraction']/span[1]/text()")[0]
        sales = div.xpath("./div/div[@class='bot-content']/div[4]/div[@class='sales']/div/span[2]/text()")[0]
        evaluate = div.xpath("./div/div[@class='bot-content']/div[4]/div[@class='evaluate']/div/span[2]/text()")[0]
        company_name = div.xpath("./div/a/div[2]/div[1]/div/text()")[0]
        csvwriter.writerow([title, price, score, sales, evaluate, company_name])
f.close()
print("Over!")

同理,需要一层一层去找,配合网页开发工具的高亮提示对应模块快速找到,或者在网页中将鼠标移动到对应元素上右击检查找到目标。此时我们要用相对路径来找,否则太长了。注意这里也要适当的修改一些属性值来精准定位,但不是每一条都要修改属性值,这就需要经验和试错了。

当然,最后别忘记关闭文件和关闭网络请求。


完整代码

# Created at UESTC
# Author: Vector Kun
# Time: 2023/1/2 23:55

# 拿到页面源代码
# 提取和解析数据
import requests
from lxml import etree
import csv

url = "见评论区"
resp = requests.get(url)
# print(resp.text)

# 解析
html = etree.HTML(resp.text)

# 拿到每一个服务商的div
divs = html.xpath("/html/body/div[@id='__nuxt']/div[@id='__layout']/div[@class='app-page-layout']/div[3]/div[@class='s50-search-list-page']/div[4]/div[4]/div[1]/div[@class='service-card-wrap']")
# print(len(divs))
with open("猪八戒Java.csv", mode="a+", newline='', encoding="utf-8") as f:
    csvwriter = csv.writer(f)
    for div in divs:  # 每一个服务商信息
        price = div.xpath("./div/div[@class='bot-content']/div/span/text()")[0].strip("¥")
        title = "Java".join(div.xpath("./div/div[@class='bot-content']/div[2]/a/text()"))
        score = div.xpath("./div/div[@class='bot-content']/div[4]/div[@class='fraction']/span[1]/text()")[0]
        sales = div.xpath("./div/div[@class='bot-content']/div[4]/div[@class='sales']/div/span[2]/text()")[0]
        evaluate = div.xpath("./div/div[@class='bot-content']/div[4]/div[@class='evaluate']/div/span[2]/text()")[0]
        company_name = div.xpath("./div/a/div[2]/div[1]/div/text()")[0]
        csvwriter.writerow([title, price, score, sales, evaluate, company_name])
f.close()
print("Over!")

resp.close()

运行结果

 可以看到我们成功抓取了50条结果,结果十分准确。


总结

XPath解析方法可以和文件路径与bs4作类比,我个人觉得它特别像两者的结合体,把他们的优点集合到一起,取长补短进行互补。我们本节通过一个比较复杂的实战案例实现外包网站报价等信息的获取,巩固了XPath解析的知识和运用能力。下一节开始我们将对requests模块进行进阶学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

13. 实战:XPath法抓取某网站外包信息 的相关文章

随机推荐

  • 链式输送机传动装置设计(说明书+CAD图纸+PPT)

    摘要 齿轮传动是应用极为广泛和特别重要的一种机械传动形式 它可以用来在空间的任意轴之间传递运动和动力 目前齿轮传动装置正逐步向小型化 高速化 低噪声高可靠性和硬齿面技术方向发展 齿轮传动具有传动平稳可靠 传动效率高 一般可以达到94 以上
  • Qt中opengl使用swapBuffers()函数报错解决办法

    swapBuffers qt文档中方的翻译 用屏幕外缓冲区交换屏幕内容 仅当窗口小部件的格式指定双缓冲模式时 此方法才有效 通常 不需要显式调用此函数 因为它是在每个小部件重新绘制后 即每次执行paintGL 之后 自动完成的 我是在线程中
  • Visual Studio(VS) 编程推荐字体及设置

    菜单栏 工具 选项 选择Consolas就是最常见的编码字体了 在这个字体下的中英文标点和半角圆角符号也能有比较明显的区别
  • YARN之Container-什么是Container?

    在最基本的层面上 Container是单个节点上如RAM CPU核核磁盘等物理资源的集合 单个节点上 或者单个大节点 可以有多个Container 系统中的每个节点可以认为是由内存 如512MB或者1GB 和CPU的最小容量的多个Conta
  • gin-巧用Context传递多种参数

    目录 引言 1 巧妙包装gin Context为NewContext 2 在使用gin Use对每一个请求的Context进行组装 3 在路由绑定时解析出NewContext来为应用层函数提供参数 并且调用应用层函数 4 总结 引言 首先给
  • wget

    参考 http apple stackexchange com questions 100570 getting files all at once from a web page using curl 一份份的下载文件有点麻烦 所以 wg
  • 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构 除了头结点和尾节点 线性表的每个元素都只有一个前取节点和一个后继节点 而树结构则相较于线性表更加复杂 它描述的关系为数据元素之间的父子关系 也是现实世界父子关系的缩影 一个父亲节点可以有零个或者多个子节点 而每个
  • 解决tensorflow没有compat的问题

    经过我多年的产bug经验判断 一般这种情况出现在anaconda下载的tensorflow2 x版本中 如果知道自己的tensorflow环境地址的话可以进去检查一下当前版本的tensorflow缺以下哪几个包 不知道也没关系 直接无脑下载
  • 机器学习-GBDT

    GBDT gbdt是一种以CART树 通常 为基分类器的boosting算法 大家可以仔细查一下boosting的介绍 这里不再赘述 gbdt通过多轮迭代 每轮迭代产生一个弱分类器 每个分类器在上一轮分类器的残差基础上进行训练 对弱分类器的
  • @apinote_新的Javadoc标签@ apiNote,@ implSpec和@implNote

    apinote 如果您已经在使用Java 8 则可能会看到一些新的Javadoc标签 apiNote implSpec和 implNote 他们怎么了 如果要使用它们 该怎么办 总览 该帖子将快速查看标签的来源和当前状态 然后 它将解释它们
  • R语言中基本图形的绘制

    条形图 简单的垂直条形图和水平条形图 函数barplot gt library vcd 载入需要的程辑包 grid gt counts lt table Arthritis Improved gt counts None Some Mark
  • matlab插值:拉格朗日插值

    拉格朗日插值即对所要插值的函数进行拉格朗日多项式拟合 这是matlab插值系列的第二期 第一期 数值分析拟合 Matlab三次样条插值拟合数据 以后会有时间的时候再更新更多的插值方法 这篇文章我推导过程参考过了一些其他文章 代码是自己写的
  • HTML5滑动(swipe)事件,移动端触摸(touch)事件

    目有个交互需要实现手指滑动的交互 pc端使用mousedown mousemove mouseup监听实现 但在ios设备上mousemove是不好监听的 同类的方法是touchstart touchmove touchend 项目需求 需
  • 快速搞懂无偏估计及样本方差中的n-1

    期望EX 方差DX 我们知道任一样本和总体是同分布的 所以任一样本的期望即总体期望 均值 任一样本的方差即总体方差 所以对于任一样本X 有 E X E
  • 移动支付行业发展和商业模式迭代孕育新商机

    在短短十几年的时间当中 PC互联网 移动互联网 以及风头正盛的物联网所引发的三次技术浪潮彻底颠覆了人们沿袭数千年的交易支付模式 也让交易介质从实物货币 到数字流转 再到如今更为便捷和安全的刷脸支付 这便是科技改变社会 成为第一生产力的缩影
  • QTabWidget移除部分分页的方法

    1 将各分页保存起来 QList
  • Hands-On Hyperledger Fabric——Byzantine-fault tolerant(BFT)过程详解

    文章目录 拜占庭问题描述 分布式架构遭遇的问题 Practical Byzantine Fault Tolerance PBFT PBFT过程详解 拜占庭问题描述 拜占庭将军问题是分布式计算中的一个经典问题 拜占庭将军问题是Leslie L
  • http协议各个版本

    一 HTTP协议版本更替 http 0 9 1991 原型版本 功能简陋 只有一个命令GET GET index html 服务器只能回应HTML格式字符 串 不能回应别的格式 http 1 0 每个TCP连接只能发送一个请求 发送数据完毕
  • osgEarth的Rex引擎原理分析(六)earth文件如何解析成Config

    目标 解决 一 中的问题 构建地图节点的依据是Config osgEarthDrivers earth EarthFileSerialize2 cpp osg Node EarthFileSerializer2 deserialize co
  • 13. 实战:XPath法抓取某网站外包信息

    目录 前言 思路 代码实现 第一步 先获取页面源代码 第二步 交给XPath的HTML解释器进行解析 第三步 通过源代码检查并获取XPath路径 第四步 创建csv文件 准备写入数据 第五步 遍历所有的div 获取我们需要的信息 完整代码