1 开发场景
- 爬取公务员招考职位(2018)信息,积累知识、锻炼动手能力等等。
2 详细描述
- 基于 Python 爬取 华图教育 官网有关公务员招考职位信息数据。
- 通过request请求数据,利用bs4进行解析;由于实现较简单,请(bu)参(zai)考(zhui)代(su)码。
3 具体代码
# coding: utf-8
# ### 爬取浙江公务员职位信息
import urllib
import pandas as pd
from bs4 import BeautifulSoup
# ### 1 爬取页面
api = 'http://zw.huatu.com'
base='/2018/'
url=api+base
header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3236.0 Safari/537.36'}
request = urllib.request.Request(url,headers=header)
response = urllib.request.urlopen(request).read()
content=BeautifulSoup(response, 'lxml')
# ### 2 内容解析
# - 省/市 : 对应 URL [32个]
areas_txt=content.find_all('p', attrs={'id':'ydiqu'})[0]
area_metas_lis=[]
counter=0
for i in areas_txt.find_all('a', attrs={'target':'_blank'}):
url=api+i.get_attribute_list('href')[0][2:]
area=i.get_text()
counter+=1
area_metas_lis.append([counter,area,url])
df=pd.DataFrame(area_metas_lis, columns=['no','area', 'url'])
# ### 3 以浙江为例,通过省份查询招聘单位及具体信息访问途径(URL)
query_area='浙江'
df[df.area==query_area]
url2=df[df.area==query_area].url.values[0]
request2 = urllib.request.Request(url2,headers=header)
response2 = urllib.request.urlopen(request2).read()
content2=BeautifulSoup(response2, 'lxml')
tmp2=content2.find_all('table', attrs={'cellspacing':'0','width':'100%'})[0]
unit_lis=[] # 存储职位列表
for i in tmp2.find_all('a'):
t_url=api+'/2018'+i.get_attribute_list('href')[0][2:]
unit_lis.append([i.get_text().strip(),t_url]) # strip 去除空格
unit_df=pd.DataFrame(unit_lis,columns=['unit_name','url'])
# ### 4 查询所有部门的招聘岗位等详细信息
'''
获取岗位详细信息
url :
访问路径
'''
def get_post_metas(url):
tmp_request = urllib.request.Request(url,headers=header)
tmp_response = urllib.request.urlopen(tmp_request).read()
tmp_content=BeautifulSoup(tmp_response, 'lxml')
td_lis=[i.get_text() for i in tmp_content.find_all('td')]
internal=[]
for i in range(len(td_lis)):
if i%10==0: # 生成间隔区间
internal.append([i,i+10])
row_lis=[]
for lt,rt in internal: # 根据间隔区间,将数据分行
row_lis.append(td_lis[lt:rt])
return row_lis
post_metas_lis=[]
for unit_name,url in unit_lis: # 循环,加工招聘单位所招岗位详细信息
post_metas_lis+=get_post_metas(url)
# 将 list 转换为 DataFrame 格式
# '部门名称','用人用司','职位名称','要求专业','招考人数','报考人数','历年分数线','历年竞争比','录取概率','对比'
post_metas_df=pd.DataFrame(post_metas_lis, columns=['unit_name','employee_unit','post_name','professional','person_num','person_num2','view','view2','detail','compare'])
post_metas_df[post_metas_df.unit_name=='中国保险监督管理委员会宁波监管局']
# 5 保存数据信息
post_metas_df.to_csv('./post_metas.csv')
4 数据结果
省 / 市区及访问路径
招聘单位及访问路径信息
招聘岗位详细信息