专栏首页数据云团Python-数据解析-职位信息-中

Python-数据解析-职位信息-中

上一节代码如下

import urllib.request

class Spider(object):
  def __init__(self):
    # 起始页位置
    self.begin_page = int(input("请输入起始页:"))
    # 终止页位置
    self.end_page = int(input("请输入终止页:"))
    # 基本 URL
    self.base_url = "http://hr.tencent.com/"
  
  def load_page(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    for page in range(self.begin_page, self.end_page + 1):
      url = self.base_url + "position.php?&start=" + str((page -1)*10 + "#a")
      request = urllib.request.Request(url, headers=headers)
      # 获取每页 HTML 源代码字符串
      response = urllib.request.urlopen(request)
      html = response.read().decode("utf-8")
      return html

一、使用正则、lxml、bs4 解析职位数据

在爬取了整个网页之后,下一步就是从整个 HTML 中提取目标数据。

在 Spider 类中,定义一个用于解析网页的方法 parse_page(),分别使用 re 模块、lxml 和 bs4 库进行实现。

① 使用 re 模块解析网页数据

根据前面所分析的网页源代码;

  • 查找所有的职位名称。

在 HTML 源代码中,职位名称对应的文本位于标签 <a> 中。首先,以 (.*?)</a> 表达式在线测试,匹配到的结果大于预期的10条。由于每个标签 href 属性值的末尾是一样的,可以在表达式的括号前面加上这部分与其它标签进行区分。

lid=0">(.*?)</a>
  • 查找所有的职位详情链接。

职位详情链接的文本位于开始标签 <a> 中,且 <a> 中有着唯一的属性,可以与其它 <a> 进行区分。

<a target="_blank" href="(.*?)">
  • 查找职位类别、招聘人数、地点、发布时间。

职位类别、招聘人数、地点、发布时间对应的文本都位于开始标签 <td> 和结束标签 </td> 中。

<td>(.*?)</td>

会发现,HTML 的源代码中表格的表头文本也位于 <td> 和 </td> 中,且位于匹配结果的前4个。因此,后期要从这些匹配结果中剔除前4个结果。

② 在 parse_page() 方法中实现

import re

def parse_page(self, html):
  """
  定义一个解析网页的方法
  html 服务器返回的网页 HTML
  """
  # 查找所有的职位名称
  names_list = re.findall(r'lid=0">(.*?)</a>', html)
  
  # 查找所有详情链接
  links_list = re.findall(r'<a target="_blank" href="(.*?)">', html)
  
  # 查找其它元素
  temp_list = re.findall(r'<td>(.*?)</td>)', html)
  
  # 去除表格标题
  others_list = temp_list[4:]
  
  # 从 others_list 中截取所有职位类别
  category_list = others_list[0::4]
  
  # 从others_list 中截取所有招聘人数
  counts_list = others_list[1::4]
  
  # 从 others_list 中截取所有工作地点
  location_list = others_list[2::4]
  
  # 从 others_list 中截取所有发布时间
  publish_time_list = others_list[3::4]
  
  # 定义空列表,以保存元素的信息
  items = []
  for i in range(0, len(names_list)):
    item = {}
    item['职位名称'] = names_list[i]
    item['详情链接'] = self.base_url + links_list[i]
    item['职位类别'] = category_list[i]
    item['招聘人数'] = counts_list[i]
    item['工作地点'] = location_list[i]
    item['发布时间'] = publish_time_list[i]
    items.append(item)

通过观察可以看出,使用正则表达式虽然能解析网页,但是使用起来非常麻烦,一旦网页发生变化,程序很有可能会失效。

本文分享自微信公众号 - 数据云团(SmartData)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 8 个常用的 Python 爬虫技巧,分分钟提高效率!!

    在urllib2包中有ProxyHandler类,通过此类可以设置代理访问网页,如下代码片段:

    昱良
  • Memcached三种客户端的使用

    注:该方式与第一种类似,只是在set方法的时候,传入参数顺序调换。缓存时间需注意,若memcached的服务端装在windows上,可能会出现运行错误。

    一觉睡到小时候
  • 微信小程序web-view实例

    达达前端
  • Json格式的转换

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据...

    一觉睡到小时候
  • 使用simple transformation查找xml file内某个节点的attribute是否存在指定value

    下列report实现通过simple transformation查找xml 文件内下列路径的节点ds其attribute uri的值是否等于指定值:

    Jerry Wang
  • Android获取已连接wifi的热点信息(上位机开发学习之多个界面切换编程)

    在企业级应用产品开发中,通常一个APP都是由多个复杂的页面来构成的。我们将它适当性的扩展为两个界面,其中第一个界面是这样的:

    morixinguan
  • 基于maven的项目脚手架,一键创建项目的项目模板

    Springboot的出现极大的简化了项目开发的配置,然而,到真实使用的时候还是会有一堆配置需要设定。比如依赖管理,各种插件,质量扫描配置,docker配置,持...

    Ryan-Miao
  • SpringCloud之服务调用

    SpringCloud的服务调用有两个东西: Ribbon是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制。Feign也是用的Ribbo...

    用户3467126
  • 天气API

    网上找了很多的接口很多都是没有pm2.5这个指数。偶然发现了一个带pm指数的接口。拿来试了一下,还不错,在此跟大家分享一下。

    一觉睡到小时候
  • 使用TestNG listener实现Case失败重跑功能

    Case失败了,想自动再跑一遍确认到底是不稳定还是真bug? 这可咋整啊? 使用testng的listener

    软测小生

扫码关注云+社区

领取腾讯云代金券