Python爬⾍⼩例⼦——爬取51job发布的⼯作职位
概述
不知从何时起,Python和爬⾍就如初恋⼀般,情不知所起,⼀往⽽深,相信很多朋友学习Python,都是从爬⾍开始,其实究其原因,不外两⽅⾯:其⼀Python对爬⾍的⽀持度⽐较好,类库众多。其⼆
Pyhton的语法简单,⼊门容易。所以两者形影相随,不离不弃,本⽂主要以⼀个简单的⼩例⼦,简述Python在爬⾍⽅⾯的简单应⽤,仅供学习分享使⽤,如有不⾜之处,还请指正。
涉及知识点
本例主要爬取51job发布的⼯作职位,⽤到的知识点如下:
开发环境及⼯具:主要⽤到Python3.7 ,IDE为PyCharm
requests类库:本类库封装了python的内置模块,主要⽤于⽹络的请求和获取数据,可以⽀持不同形式的请求。
BeautifulSoup库:主要⽤于解析获取的数据,包括Html,Xml,Json等不同的格式。
数据持久化:主要是将内存中的数据,保存到数据库或者⽂件中。
爬⾍的基本步骤
爬⾍的基本步骤,如下图所⽰:
爬取⽬标
如有要爬取相关内容,⾸先要对爬取的⽬标进⾏分析,了解其⽬录结构,才能进⾏解析。本例主要爬取51job中的⼯作列表,如下所⽰:
核⼼源码
1.获取数据
定义⼀个函数get_data,⽤于发起请求并获取数据,如下所⽰:
headers中的User-Agent主要⽤于模拟浏览器,不然会被反爬⾍程序屏蔽,http状态码为418,意思是被⽹站的反爬程序返回的。
encoding是要爬取的⽹站的编码为gbk,如果不加,会产⽣乱码,默认为utf-8
def get_data(req_url):
"""获取数据"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Accept-Language': 'zh-Hans-CN, zh-Hans;q=0.5'
}
resp = (req_url, headers=headers)
if resp.status_code == 200:
else:
return None
2.解析数据
定义⼀个函数parse_data,⽤于解析获取到的内容,如下所⽰:
采⽤BeautifulSoup,将返回的⽂本,解析成html对象,并获取对应的内容。本例主要获取⼯作的列表
def parse_data(resp_html):
"""解析数据,并返回列表"""
soup = BeautifulSoup(resp_html, features='html.parser')
job_table = soup.find('div', attrs={'class': 'dw_table'})
# print(job_table)
job_list = job_table.find_all('div', attrs={'class': 'el'})
# print(job_list)
# 循环列表,去掉第⼀个title和最后⼀个
res_list = []
for job in job_list[1: -1]:
job_name = job.find('p', attrs={'class': "t1"}).find('span').find('a').get_text()
job_name = place('\r\n', '').strip()
job_company = job.find('span', attrs={'class': "t2"}).find('a').get_text()
job_addr = job.find('span', attrs={'class': "t3"}).get_text()
job_salary = job.find('span', attrs={'class': "t4"}).get_text()
job_time = job.find('span', attrs={'class': "t5"}).get_text()
# print('⼯作信息:', job_name, '---', job_company, '---', job_addr, '---', job_salary, '---', job_time)
res_item = {
'⼯作名称': job_name,
'公司': job_company,
'⼯作地址': job_addr,
'薪资⽔平': job_salary,
'发布时间': job_time
}
res_list.append(res_item)
return res_list
3.保存数据
定义⼀个函数save_data,⽤于将获取到的内容保存到json⽂件中,如下所⽰:
with函数可以⾃动进⾏释放。因包含中⽂,所以json⽂件的编码为utf-8,否则会出现乱码
def save_data(res_list):
"""保存数据"""
with open('jobs.json', 'w', encoding='utf-8') as f:
res_list_json = json.dumps(res_list, ensure_ascii=False)
f.write(res_list_json)
4.整体调⽤步骤
依次调⽤定义的三个函数,如下所⽰:
if __name__ == '__main__':
"""如果是主程序⾃⼰调⽤"""
req_url = 'search.51job/list/040000,000000,0000,00,9,99,java,2,1.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&fromTyp # 获取数据
resp_html = get_data(req_url)
# print(html)
# 解析数据
res_list = parse_data(resp_html)
# 保存数据
save_data(res_list)
爬取结果展⽰
爬取的结果保存在jobs.json⽂件中,如下所⽰:
[
"公司": "深圳市钻⽊信息技术有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.8-3万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java实习⽣ 6k起",
"公司": "深圳市智玩创新科技有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "6-8千/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java实习⽣6k起",
"公司": "深圳市康姆达科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "6-8千/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市⽹新新思软件有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1.5-1.7万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市睿服科技有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.3-1.7万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发经理",
"公司": "深圳市聚惠企业登记代理有限公司",
"⼯作地址": "深圳-龙华新区",
"薪资⽔平": "1-3万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "⾼级JAVA",
"公司": "深圳易加油信息科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1.5-2.1万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "深圳市绿联科技有限公司",
"⼯作地址": "深圳-龙华新区",
"薪资⽔平": "2-3万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市博悦科创科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "易普森智慧健康科技(深圳)有限公...", "⼯作地址": "深圳",
"薪资⽔平": "1.5-2.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳易世通达科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1.2-1.8万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "苏州今融加科技有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.5-2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java后端开发⼯程师",
"公司": "深圳市长隆科技有限公司",
"⼯作地址": "深圳-龙岗区",
"薪资⽔平": "1.5-2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市元诺智能系统有限公司",
"⼯作地址": "深圳-龙华新区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "java 有物流类经验",
"公司": "深圳市欧恩德技术有限公司",
"⼯作地址": "深圳-罗湖区",
"薪资⽔平": "0.8-1.1万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师-2020校园招聘", "公司": "⾦蝶软件(中国)有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "0.8-1.6万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "丰疆智能科技股份有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "2.5-3万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "JAVA软件开发⼯程师",
"公司": "深圳市吉星时代科技有限公司",
"⼯作地址": "深圳-龙岗区",
},
{
"⼯作名称": "JAVA ⾼级软件⼯程师",
"公司": "相通⽹络技术有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.5-3万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "JAVA开发⼯程师(接受应届⽣)", "公司": "深圳市智岩科技有限公司",
"⼯作地址": "深圳-南⼭区",
oracle高级认证"薪资⽔平": "0.8-1万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java后台开发⼯程师",
"公司": "深圳市炬驰科技发展有限公司",
"⼯作地址": "深圳",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市韶⾳科技有限公司",
"⼯作地址": "深圳-宝安区",
"薪资⽔平": "0.8-1万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "JAVA 开发⼯程师",
"公司": "深圳市优科技股份有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市有⾖科技有限公司",
"⼯作地址": "深圳-宝安区",
"薪资⽔平": "1.8-3万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Saas平台架构师(Java⽅向)",
"公司": "深圳市智布互联纺织科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1.7-2.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发实习⽣",
"公司": "云软科技",
"⼯作地址": "深圳-宝安区",
"薪资⽔平": "6-9千/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "深圳市阿尔法智汇科技有限公司",
"⼯作地址": "深圳-宝安区",
"薪资⽔平": "2-4万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java 全栈开发⼯程师",
"公司": "深圳市杰纳斯科技有限公司",
"⼯作地址": "深圳-宝安区",对象图是什么
"薪资⽔平": "1-3.5万/⽉",
"发布时间": "06-13"
},
{
reserves"⼯作名称": "中⾼级java⼯程师",
"公司": "北京联创智融信息技术有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.3-1.8万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "得实信息科技(深圳)有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "0.6-1万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市联创科技集团有限公司",
"⼯作地址": "深圳-龙岗区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "中级JAVA(J13824)",
"公司": "银雁科技服务集团股份有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "java⼯程师",
"公司": "深圳市安思疆科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "0.8-1.6万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "JAVA ⾼级开发⼯程师",
"公司": "汇才保险代理(深圳)有限公司",
"⼯作地址": "深圳-罗湖区",
"薪资⽔平": "1.5-2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师(直连)",
"公司": "深圳市天泰国际航空旅⾏社有限公司...", "⼯作地址": "深圳",
"薪资⽔平": "2-4万/⽉",
"发布时间": "06-13"
js数组添加元素技巧},
{
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "0.8-1.2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "后台开发Leader(JAVA⽅向)",
"公司": "深圳⾦世纪保险经纪有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "3-4万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市中深⼒⼈⼒资源管理有限公司...",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "研祥⾼科技控股集团有限公司",
"⼯作地址": "深圳-光明新区",
"薪资⽔平": "0.9-1.8万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java(证券不加班)",
"公司": "上海华腾软件系统有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.8-2.2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "深圳⼤美商业地产管理有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "1.5-2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "资深/⾼级Java⼯程师",
"公司": "未来穿戴(深圳)有限公司",
python请求并解析json数据"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "3-4万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "深圳市太阳星通信科技有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "0.8-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java⾼级开发⼯程师",
"公司": "深圳市蓝鹰⽴德软件咨询有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1.5-1.8万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "JAVA(⾼级、架构)",
"公司": "深圳市⼏⽶物联有限公司",
"⼯作地址": "深圳-宝安区",
"薪资⽔平": "2.2-3.2万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "JAVA开发⼯程师",
"公司": "江苏康尚⽣物医疗科技有限公司",
"⼯作地址": "深圳-宝安区",
"薪资⽔平": "1-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "java架构师",
"公司": "深圳市泓齐⽹络科技有限公司",
"⼯作地址": "深圳",
"薪资⽔平": "1.5-1.8万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "深圳市智璟科技有限公司",
"⼯作地址": "深圳-福⽥区",
"薪资⽔平": "0.9-1.5万/⽉",
"发布时间": "06-13"
},
{
"⼯作名称": "Java开发⼯程师",
"公司": "上海⾈恩信息技术有限公司",
"⼯作地址": "深圳-南⼭区",
"薪资⽔平": "1.4-1.9万/⽉",
"发布时间": "06-13"
}
]
进⼀步思考
本例可以进⼀步优化的空间,如下所⽰:
逻辑符号xor本次爬⾍只是单次爬取,数据量相对⼩,如果要爬取⼤量数据的时候,则需要使⽤多线程相关的知识。
基础的爬⾍,只能爬取静态渲染的内容,如果是异步动态渲染的数据,如何爬取呢?
将爬取的结果保存到数据库如何操作呢?
以上就是Python爬⾍⼩例⼦——爬取51job发布的⼯作职位的详细内容,更多关于Python爬⾍爬取⼯作职位的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论