爬虫实战(二) 51job移动端数据采集

2023-10-30 13:10

本文主要是介绍爬虫实战(二) 51job移动端数据采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    在上一篇51job职位信息的爬取中,对岗位信息div下各式各样杂乱的标签,简单的Xpath效果不佳,加上string()函数后,也不尽如人意。因此这次我们跳过桌面web端,选择移动端进行爬取。

 

一、代码结构

    按照下图所示的爬虫基本框架结构,我将此份代码分为四个模块——URL管理、HTML下载、HTML解析以及数据存储。

 

二、URL管理模块

    这个模块负责搜索框关键词与对应页面URL的生成,以及搜索结果不同页数的管理。首先观察某字段(大数据, UTF-8为'E5A4A7 E695B0 E68DAE') 全国范围内的结果,前三页结果的URL如下:

    URL前半部分:

    这部分中我们可以看到两处处不同,第一处为编码后'2,?.html'中间的数字,这是页数。另一处为参数stype的值,除第一页为空之外,其余都为1。另外,URL中有一连串的数字,这些是搜索条件,如地区、行业等,在这儿我没有用上。后面的一连串字符则为搜索关键词的字符编码。值得注意的是,有些符号在URL中是不能直接传输的,如果需要传输的话,就需要对它们进行编码。编码的格式为'%'加上该字符的ASCII码。因此在该URL中,%25即为符号'%'。

    URL后半部分:

    后半部分很明显的就能出首页与后面页面的URL参数相差很大,非首页的URL后半部分相同。

    因此我们需要对某关键字的搜索结果页面分两次处理,第一次处理首页,第二次可使用循环处理后续的页面。

  1. if __name__ == '__main__':  
  2.     key = '数据开发'  
  3.     第一页  
  4.     url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,'+key+',2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='  
  5.     getUrl(url)  
  6.     后页[2,100)  
  7.     urls = ['https://search.51job.com/list/000000,000000,0000,00,9,99,'+key+',2,{}.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='.format(i) for i in range(2,30)]  
  8.     for url in urls:  
  9.         getUrl(url)  

 

三、HTML下载模块

    下载HTMl页面分为两个部分,其一为下载搜索结果某一页的HTML页面,另一部分为下载某一岗位具体页面。由于页面中具体岗位URL需要从搜索结果页面中获取,所以将下载搜索结果页面及获取具体岗位URL放入一个函数中,在提取到具体岗位URL后,将其传入至另一函数中。

3.1搜索结果页面下载与解析

    下载页面使用的是requests库的get()方法,得到页面文本后,通过lxml库的etree将其解析为树状结构,再通过Xpath提取我们想要的信息。在搜索结果页面中,我们需要的是具体岗位的URL,打开开发者选项,找到岗位名称。

    我们需要的是<a>标签里的href属性。右键,复制——Xpath,得到该属性的路径。

  1. //*[@id="resultList"]/div/p/span/a/@href  

    由于xpath返回值为一个列表,所以通过一个循环,将列表内URL依次传入下一函数。

  1. def getUrl(url):  
  2.     print('New page')  
  3.     res = requests.get(url)  
  4.     res.encoding = 'GBK'  
  5.     if res.status_code == requests.codes.ok:  
  6.         selector = etree.HTML(res.text)  
  7.         urls = selector.xpath('//*[@id="resultList"]/div/p/span/a/@href')  
  8.         #                      //*[@id="resultList"]/div/p/span/a  
  9.         for url in urls:  
  10.             parseInfo(url)  
  11.             time.sleep(random.randrange(1, 4))  

 

3.2具体岗位信息页面下载

    该函数接收一个具体岗位信息的参数。由于我们需要对移动端网页进行处理,所以在发送请求时需要进行一定的伪装。通过设置headers,使用手机浏览器的用户代理,再调用get()方法。

  1. def parseInfo(url):  
  2.     headers = {  
  3.         'User-Agent''Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/ADR-1301071546) Presto/2.11.355 Version/12.10'  
  4.     }  
  5.     res = requests.get(url, headers=headers)  

 

四、HTML解析模块

    在3.2中,我们已经得到了岗位信息的移动端网页源码,因此再将其转为etree树结构,调用Xpath即可得到我们想要的信息。

    需要注意的是页面里岗位职责div里,所有相关信息都在一个<article>标签下,而不同页面的<article>下层标签并不相同,所以需要将该标签下所有文字都取出,此处用上了string()函数。

 

  1. selector = etree.HTML(res.text)  
  2. title = selector.xpath('//*[@id="pageContent"]/div[1]/div[1]/p/text()')  
  3. salary = selector.xpath('//*[@id="pageContent"]/div[1]/p/text()')  
  4. company = selector.xpath('//*[@id="pageContent"]/div[2]/a[1]/p/text()')  
  5. companyinfo = selector.xpath('//*[@id="pageContent"]/div[2]/a[1]/div/text()')  
  6. companyplace = selector.xpath('//*[@id="pageContent"]/div[2]/a[2]/span/text()')  
  7. place = selector.xpath('//*[@id="pageContent"]/div[1]/div[1]/em/text()')  
  8. exp = selector.xpath('//*[@id="pageContent"]/div[1]/div[2]/span[2]/text()')  
  9. edu = selector.xpath('//*[@id="pageContent"]/div[1]/div[2]/span[3]/text()')  
  10. num = selector.xpath('//*[@id="pageContent"]/div[1]/div[2]/span[1]/text()')  
  11. time = selector.xpath('//*[@id="pageContent"]/div[1]/div[1]/span/text()')  
  12. info = selector.xpath('string(//*[@id="pageContent"]/div[3]/div[2]/article)')  
  13. info = str(info).strip()  

 

五、数据存储模块

    首先创建.csv文件,将不同列名称写入首行。

  1. fp = open('51job.csv','wt',newline='',encoding='GBK',errors='ignore')  
  2. writer = csv.writer(fp)  
  3. writer.writerow(('职位','薪资','公司','公司信息','公司地址','地区','工作经验','学历','人数','时间','岗位信息'))  

    再在解析某一页面数据后,将数据按行写入.csv文件。

  1. writer.writerow((title,salary,company,companyinfo,companyplace,place,exp,edu,num,time,info))  

 

 

源码:爬取51job移动端源码(12月)

 

相关:智联招聘源码分析

    贪吃蛇链表实现及部分模块优化

转载于:https://www.cnblogs.com/magicxyx/p/10128914.html

这篇关于爬虫实战(二) 51job移动端数据采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308147

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文