入门小远学爬虫(二)(四)简单GET型网页爬虫实战——“前程无忧”爬虫岗位信息的爬取之正则概念以及Python中re库的简单应用


前言

这是本系列第一个实战项目的第四课,有关前三课相关的内容请访问小远的主页。(上一课的链接

上一节我们已经利用lxml库将https://jobs.51job.com/pachongkaifa/p1/中的工作一条一条列好了,但是发现拿下来的数据并不能很直观的显示出来,比如

----------第1个工作----------

<div class="e ">&#13;
                <em class="check" name="delivery_em" onclick="checkboxClick(this)"/>&#13;
                <input class="checkbox" type="checkbox" name="delivery_jobid" value="127214253" style="display:none" jt="0"/>&#13;
                <p class="info"><span class="title"><a title="爬虫工程师 实习生" target="_blank" href="https://jobs.51job.com/nantong/127214253.html?s=02">爬虫工程师 实习生</a></span><a title="南通伊奈贸易有限公司" target="_blank" class="name" href="https://jobs.51job.com/nantong/co4347673.html">南通伊奈贸易有限公司</a><span class="location name">南通</span><span class="location">0.3-1万/月</span><span class="time">12-01</span></p>&#13;
                <p class="order">学历要求:本科<span>|</span>工作经验:在校生/应届生<span>|</span>公司性质:民营公司<span>|</span>公司规模:50-150人</p>&#13;
                <p class="text" title=" 1.全日制本科以以上学历,统计学或计算机相关专业毕业,有数据分析/数据挖掘工作经验优先;2.扎实的数理统计理论知识,熟悉数据挖掘理论与方法,突出的逻辑分析和归纳能力,优秀的业务洞察力与执行力,主观能动性强;3.熟练使用Python语言,掌握numpy、pandas、sklearn、selenium、scrapy、sqlalchemy等包的用法4. 熟悉掌握sql语言,包括但不限于mysql,SqlServer等关系型数据库5.良好的沟通能力,乐于接受新鲜事物,学习能力强,优秀的团队合作精神。 ***"> 1.全日制本科以以上学历,统计学或计算机相关专业毕业,有数据分析/数据挖掘工作经验优先;2.扎实的数理统计理论知识,熟悉数据挖掘理论与方法,突出的逻辑分析和归纳能力,优秀的业务洞察力与执行力,主观能动性强;3.熟练使用Python语言,掌握numpy、pandas、sklearn、selenium、scrapy、sqlalchemy等包的用法4. 熟悉掌握sql语言,包括但不限于mysql,SqlServer等关系型数据库5.良好的沟通能力,乐于接受新鲜事物,学习能力强,优秀的团队合作精神。 ***</p>&#13;
                <p class="opat">&#13;
                    <input value="127214253" name="hidJobID127214253" id="hidJobID127214253" type="hidden" jt="0"/>&#13;
                    <a class="sq sicon Dm" href="javascript:void(0);" onclick="delivery('hidJobID127214253', '1', '//i.51job.com', 'c', '', '02', '02', '//img02.51jobcdn.com');return false;">立即申请</a><br/><a class="sc sicon Dm" href="javascript:void(0);" onclick="saveCollection('127214253');">收藏</a>&#13;
                </p>&#13;
            </div>&#13;

对这一大段字符串中数据的提取,最常用的就是正则了,那么马上进入今天的分享:


一、正则表达式是什么?

英语好的同学可以挑战观看一下这个视频,如果你看懂了基本上就可以直接跳过这一大段了。

估计99.99999%的中国人都不知道,其实这个只看字面意思的话完全看不明白的词语——“正则”,是一个地道的中国原创词汇。
比如屈原的《离骚》中:

名余曰正则兮,字余曰灵均。

翻译成现代汉语的意思就是:“把我的名取为正则啊,把我的字叫作灵均”。
大家都知道,屈原名平,字原,而“正则”是对“平”字进行的解释(就像诸葛亮字孔明一样,孔之明者,亮也)。”正则“拆分理解就是公正而有法则。简单来说,就是屈原他们家长辈给他取名字的时候希望“正其礼仪法则”,故曰“正则”。

那么前面解释了那么一通,再在这里讲计算机里的“正则”就好理解了。在各种编程语言中,正则代表“正则表达式”。从最早的Perl到后来的Java、.NET,都提供了这种文本分析的高级工具。在Python中,正则表达式是特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。换句话说,计算机的“正则表达式”就是要公正而有法则地检查一个字符串是否符合编程者所指定的某个规则

二、正则表达式语法

1、简介

老实说,这篇文章我真的不知道要写些什么,网上的各路大神都已经把正则语法翻来覆去讲了不知道多少遍了,截至2020-12-1,仅仅B站上面用“正则”做关键字搜出来的相关视频就有50多页!!!
50多页
这还不包括其他网站的视频还有相关的文件,简直不计其数。小远想找到我当时学的时候看的教学视频与大家分享,但是找了半天发现它已经被大量优质的视频资源埋没在了茫茫的互联网中。没办法了,只能找两个我认为比较有用的视频推荐给大家

想快速上手,看
正则表达式15分钟速成

想稳打稳扎,看
《孙兴华讲正则表达式》基于Python【已完结】

2、干货分享

当然在这里,除了视频之外,我还要推荐一些其他的干货,这都是小远在真实的爬虫开发实战中总结出的一些经验:

首先,推荐一个非常方便的在线正则表达式测试网站

有的时候正则不能保证100%一写就能用,就像Xpath路径一样,有时候要反复的试才知道写得对不对。但某些网站的反爬做得挺好,反爬较为强大,它会检测你的访问次数,就是说,在一段时间内哪怕你十分注意但还是会有封号之类的风险[就是用你的ID暂时性的访问不了这个网站了,哪怕这个时候你用回正规浏览器去访问这个网站都不行],这就很麻烦。

这个网站就能很好的解决问题,先跑一遍程序把数据拿下来,然后复制粘贴到这个网站里,正则在里面反复试就行了,试通了就往Python程序里面一贴,完事。美中不足的是有一个毛病,就是这个网站不能匹配换了行的字符串,没理解这句话的话你用着用着就理解了。

第二个小干货就是小远在实战中总结出的一些正则语句,挺有用的

> 英文字符串:^[A-Za-z]+$ 
> 英文字符数字串:^[A-Za-z0-9]+$ 
> 汉字:^[\u4e00-\u9fa5]{0,}$
> 手机号:^1[34578]\d{9}$
> qq号验证(5-11位):^[1-9][0-9]{4,10}$
> E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ 
> ……

尽管有些可能不甚完美,但是大多数场景下是可以用的了,还有哪些欢迎在下方评论区补充留言。

三、re库

re的名取自英语regex【regular expression的简写,短语的意思为规则的表达方式,不过regex已经单独成为了一个词语,译为“正则表达式”】,re库是Python处理正则用的库

1、安装

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

2、用法

这个库的用法网上实在太多,小远自觉才疏德薄,也讲不出什么新东西来。

所以老规矩,既然人家讲得好,那就看人家的。

文章-python之re模块详解
文章-Python小知识-正则表达式和Re库(二)
视频-Python爬虫re模块的使用,也许你掌握的并不全面!

小平爷爷说:“不管黑猫白猫,能捉老鼠的就是好猫”。博主真的不想水文章,但是实在是人家写得太好了而且太全面了,反复一点东西讲来讲去也没有意思,我比较喜欢分享一些自己总结出来的东西,网页中的链接都是博主精心反复挑选过的,质量挺高。插一句题外话,学电脑就是这样,人家好,就学人家的,然后再找机会超越人家,如果真的有小白通过我的文章学会了爬虫这个技能,那就是小远最开心的了,毕竟大家都是要为中国电子信息技术的发展出力的一份子,建设一个更加美丽的中国需要大家共同的努力,分什么你我呢?

四、终于进入正题

前面铺垫了一箩筐,终于来到了正题

将我们上一节课拿到的一条工作信息复制进那个在线正则匹配的网页中,如图:
(网页代码在文章开始的地方有,如果仅为了尝试的话复制即可。)
(注意复制进去后手动删除所有换行)
正则
这里博主写好的正则是:(仅供参考)

.*href="(.*)">(.*)</a.*href=.*">(.*)</a.*me">(.*)</span.*on">(.*)</span.*me">(.*)</span.*(.*)<s.*(.*)<s.*(.*)<s.*(.*)</p.*title=

将其写入Python项目中

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

# 导入re包
import re
# 导入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')
# 正则
regex = '.*href="(.*)">(.*)</a.*href=.*">(.*)</a.*me">(.*)</span.*on">(.*)</span.*me">(.*)</span.*:(.*)<s.*:(.*)<s.*:(.*)<s.*:(.*)</p.*title='
for aJob in Jobs_element:
    print("{:-^25}".format("第{}个工作".format(Jobs_element.index(aJob)+1)))
    print(re.findall(regex, etree.tostring(aJob, encoding="utf-8").decode(), re.S))

【运行截图】
截图

【!!!】
这个时候发现一个问题,第十二个工作的数据没匹配出来,往前找原因,发现它的数据是拿得下来的。查看网页,发现第十二个岗位确实与众不同
没有工资水平

由于我后面需要分析的数据就有工资水平,如果没有工资,那么这条数据就没有意义了,所以,索性不要了。我们用一个总列表来存储所有的数据。将部分代码修改如下

Information = list()
for aJob in Jobs_element:
    Information += re.findall(regex, etree.tostring(aJob, encoding="utf-8").decode(), re.S)
# 查看总列表
for item in Information:
    print(item)

【运行截图】
截图2

至此,一页的数据基本就被拿下来了,但是我要的是所有的岗位,据了解,前程无忧岗位信息每天都会刷新,第一课说要13页数据,小远今天一看只有12页了,为了方便起见,我们拿十页的数据算了。

修改代码:

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

# 导入re包
import re
# 导入requests包
import requests
# 导入lxml中的html模块
from lxml import html
# 请求头
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"
}
Information = list()
for i in range(1, 11):
    # 网页链接
    url = "https://jobs.51job.com/pachongkaifa/p{}/".format(i)
    # 有请求头写法
    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')
    # 正则
    regex = '.*href="(.*)">(.*)</a.*href=.*">(.*)</a.*me">(.*)</span.*on">(.*)</span.*me">(.*)</span.*:(.*)<s.*:(.*)<s.*:(.*)<s.*:(.*)</p.*title='
    for aJob in Jobs_element:
        Information += re.findall(regex, etree.tostring(aJob, encoding="utf-8").decode(), re.S)
# 查看总列表
for item in Information:
    print(item)

【运行结果】前十页的信息
完成

还没有结束,还有可以继续改进的地方,比如说,如果要对各单位薪资进行统计分析的话,单位最好要统一。对于数据的详细处理将会在之后推出,敬请期待。

下一节已更新


小结

使用re的步骤:
1、引入包(import)
2、写好正则表达式
3、使用re模块匹配

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

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

远哥挺乐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值