入门小远学爬虫(二)(三)简单GET型网页爬虫实战——“前程无忧”爬虫岗位信息的爬取之与Xpath相关的知识以及Python中lxml库的简单应用


前言

这是本系列第一个实战项目的第三课,有关前两课“网页分析”与“requests库使用”相关的内容请访问小远的主页。(上一课的链接

上一节我们已经利用requests库将https://jobs.51job.com/pachongkaifa/p1/的数据给拿下来了,现在开始今天的知识学习。


一、Xpath是什么?

隐藏了三篇文章的Xpath终于要在本文中揭开神秘的面纱,那么Xpath到底是一个什么东西呢?

如果学过正则表达式的同学就会知道,对一段比较短的字符串,如果需要格式化地提取某些有用的信息,那么直接用正则会十分方便。但是,由于稍微复杂一些的网页的源代码会非常地长(像本项目中提取的代码就有1240多行),且结构较为复杂,再加之需要提取的内容比较多,直接用正则解析对于初学者来说不太友好。

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。利用好Xpath,可以大大减少HTML源代码的阅读量,更加方便快捷地完成爬虫程序的编写。顺带一提,XML指的就是可扩展标记语言(Extensible Markup Language),很类似HTML,有兴趣的话可以上网搜教学视频,因篇幅原因博主就不多介绍了,【附:W3School官方文档

关于Xpath的语法,各大网站已经总结得非常到位了,W3School上面的内容讲得就非常完整且详细,我在此狗尾续貂实在没有意义。如果确实看不明白,可以去B站上搜索关于Xpath的教学视频,在此推荐UP主“大大的小番茄”制作的视频(博主就是跟着他学的)。

所以,这里引入Xpath+正则的爬虫方法,本篇文章只介绍Xpath的部分。

二、lxml库

现行流行的针对XML文件的Python解析库中,比较方便也比较常见的绝对有lxml库的一席之地。它能帮助我们解析HTML、XML文件,快速定位,搜索、获取特定内容。

1、安装

lxml库的安装方法可参考上一课中requests库的安装,链接

2、lxml基础使用介绍

利用lxml库,可以非常方便的解析XML文件。etree是lxml库中的一个非常重要的模块,此处需要用到它,初学者在大多数情况下也只要掌握好这个模块,所以etree模块的使用将作为重点讲解说明。【高版本lxml库(lxml4.2之后)的用法有所变动,经测试,现在直接from lxml import etree会报错】有很多网站说Python3.5之后就不再有etree,其实这个说法是有问题的,它的用法只是被更新了而已。

如果想通过Xpath获取html源码中的内容,就要先将html源码转换成_Element对象,然后再使用xpath()方法进行解析。如何转换成_Element对象?为方便理解,我自己编一段HTML语句,临时代替网页数据:

# -*- coding: utf-8 -*-
# @Time: 2020/11/30 15:56
# @Author: 胡志远
# @Software: PyCharm

from lxml import html

# 模拟一段网页源代码
html_str = '''
<html>
    <head>
        <title>这是标题</title>
    </head>
    <body>
        <p>这是内容</p>
    </body>
</html>
'''
# 以下式就是新版本lxml中etree中的使用方法
etree = html.etree
html_elements = etree.HTML(html_str)
print(html_elements)

【已经将字符串转化成了_Element对象】
创造Element对象

3、Xpath正式登场

本章的压轴戏终于上来了,在这个项目第一篇文章中写的要提取的Xpath路径还记得是什么吗,没错,就是

//div[@class=“detlist gbox”]/div

将测试程序略加修改,加入本项目的正式程序中,有

# -*- coding: utf-8 -*-
# @Time: 2020/11/29 14:21
# @Author: 胡志远
# @Software: PyCharm

# 导入requests包
import requests
# 导入lxml中的html模块
from lxml import html
# 网页链接
url = "https://jobs.51job.com/pachongkaifa/p1/"
# 请求头
headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Cookie": "guid=7e8a970a750a4e74ce237e74ba72856b; partner=blog_csdn_net",
    "Host": "jobs.51job.com",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
# 有请求头写法
res = requests.get(url=url, headers=headers)
res.encoding = "gbk"
# 生成Element对象
etree = html.etree
html_elements = etree.HTML(res.text)
# 根据Xpath路径获取每一个工作岗位的对象
Jobs_element = html_elements.xpath('//div[@class="detlist gbox"]/div')
print(Jobs_element)

【运行截图】
截图
获得了20个_Element对象组成的列表,打开网页,发现一版正好是20个工作岗位。基本可以确定Xpath路径没有写错了。

以防万一,进一步确认一下
将print(Jobs_element)改成如下代码

for aJob in Jobs_element:
    print("{:-^25}".format("第{}个工作".format(Jobs_element.index(aJob)+1)))
    print(etree.tostring(aJob, encoding="utf-8").decode())

【运行截图】
每一个工作

显然每一个单独的工作就被单独的拿下来了,再对其进行统一的正则匹配将会方便很多,关于正则表达式的相关知识将在之后推出,敬请期待。

下一课已经更新


小结

使用lxml的步骤:
1、引入包(import)
2、将返回的响应转换成_Element对象
3、对_Element对象使用Xpath()获取所需要每个板块的信息

如果觉得博主写的还不错的,欢迎点赞、评论、加关注,大家的访问就是博主更新文章不竭的源动力!

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远哥挺乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值