最近想要做一个“嵌入式技能回报率”的分析,本来想使用网上现成的spider,但好像没有满足需要的,只能自己写了。
本51job数据抓取程序包含以下功能:
- 根据传入参数进行搜索、抓取数据
- 根据关键词搜索
- 根据地理位置(城市)搜索
- 根据月薪范围、工作年限、学历要求、公司性质、公司规模搜索
- 以CSV格式保存
- 也可以作为库被调用
代码
使用说明
1 | usage: spider_51job.py [-h] [-v] [-u URL] [-c CITIES] [-smin SALARY_MIN] |
代码说明
URL关键字参数
带有1个关键字参数(嵌入式)的URL:
带有3个关键字参数(嵌入式 软件 STM32)的URL:
可以看出,前面的https://search.51job.com/list/000000,000000,0000,00,9,99,
和后面的,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=
是相同的,提取出不同的是:
%25E5%25B5%258C%25E5%2585%25A5%25E5%25BC%258F
%25E5%25B5%258C%25E5%2585%25A5%25E5%25BC%258F%2520%25E8%25BD%25AF%25E4%25BB%25B6%2520STM32
在这里,中文被转成了url编码。以第2条为例,使用UrlEncode编码/UrlDecode解码 - 站长工具解码,第一次解码之后得%E5%B5%8C%E5%85%A5%E5%BC%8F%20%E8%BD%AF%E4%BB%B6%20STM32
,再解码之后得嵌入式 软件 STM32
。
所以,在Python中把关键词参数加入URL时,可以使用以下方法:
1 | url = "https://search.51job.com/list/000000,000000,0000,00,9,99," \ |
URL城市参数
URL(keywords=”Linux” --city=”全国”):
URL(keywords=”Linux” --city=”南京”):
URL(keywords=”Linux” --city=”北京”):
当我们打开--city=”北京”的这个页面的时候,我们可以看到,在这上面还可以指定到某个区:
当选择“上城区”的时候,URL变成了:
当同时选择南京、北京(最多选择5项)时,URL变成了:
可以看到,在上面的这些URL里仅仅改变了2个地方,list/
之后的两个字符串,第1个代表城市,而第2个地方表示区号,多个城市之间用%252c
分隔(选择多个城市时不可选择区号,至多选择5个城市)。51job对每个城市、分区都编了号。
肯定有一个存储这些城市编码的地方,最后找到了这个文件:
而在代码中,get_city_code()
函数就是用来获取这个列表的。
URL薪酬范围参数
URL(keywords=”Linux” -srs=3000):
URL(keywords=”Linux” -sre=10000):
URL(keywords=”Linux” -srs=3000 -sre=10000):
从上可以看出,薪资范围在关键词前面一个字段,最低值和最高值之间用’-‘分隔,忽略时为99,当范围起始值大于范围结束值时也会自动忽略。
URL工作年限参数
51job支持使用工作年限来搜索:
URL(keywords=”Linux” 工作年限=”在校生/应届生”):
URL(keywords=”Linux” 工作年限=”1-3年”&”5-10年”):
在URL中使用了参数workyear来指定工作年限,有6个可选项(”在校生/应届生”, “1-3年”, “3-5年”, “5-10年”, “10年以上”, “无需经验”),分别用(01, 02, 03, 04, 05, 06)来表示。多选用%252c
分隔。’=99’时忽略此参数。
URL学历要求参数
同工作年限一样,学历要求使用参数degree_from添加在URL的参数列表里,(01-07)分别表示以下意思:
URL公司性质参数
同工作年限一样,公司性质使用参数cotype添加在URL的参数列表里,(01-11)分别表示(“外资(欧美)”, “外资(非欧美)”, “合资”, “国企”, “民营企业”, “外企代表处”, “政府机关”, “事业单位”, “非营利组织”, “上市公司”, “创业公司”):
URL公司规模参数
同工作年限一样,公司性质使用参数companysize添加在URL的参数列表里,(01-07)分别表示以下意思:
作为库使用
作为库被其它程序引用,传入argv参数,来抓取数据。
1 | #!/usr/bin/env python3 |