Python爬虫系列之二:爬取2018公务员招考职位信息

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 数据结果

  • 省 / 市区及访问路径
    Python爬虫系列之二:爬取2018公务员招考职位信息_第1张图片

  • 招聘单位及访问路径信息
    Python爬虫系列之二:爬取2018公务员招考职位信息_第2张图片

  • 招聘岗位详细信息
    Python爬虫系列之二:爬取2018公务员招考职位信息_第3张图片


5 下载链接

  • Download the spider_huatu_civil_servant_post_metas.ipynb
  • Download the civil servant post datas

你可能感兴趣的:(Anaconda系列,Python系列,Jupyter,Notebook)