# Python_Data_Mining_51job **Repository Path**: Daisy-X/python_-data_-mining_51job ## Basic Information - **Project Name**: Python_Data_Mining_51job - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-21 - **Last Updated**: 2021-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python数据挖掘期中项目介绍 >- 项目任务:挖取 51job 招聘网站 职位搜索 页面信息 >- 撰写人:陈希 >- 撰写日期:2021年5月21日 ## 一、项目介绍: 1. 可选择的分类部分(任选3个构建参数模板(希望有工作职能))。 2. url模板可以自动生成关键词 (构建参数模板)。 3. 页面内容(页面展示的所有简要的招聘信息)。 4. 实现翻页爬取。 5. 详细页内容(页面中所有招聘链接里的详细内容)。 ## 二、过程: ### 2.1 前期准备(调用基本模块) ``` from requests_html import HTMLSession import requests_html import pandas as pd import urllib.parse ``` ### 2.2 相关参数(字典)的建立 #### 2.2.1 关键词keyword 1. 观察链接规律 - 进入[51job网站](https://www.51job.com/) ,点击页面中“职能搜索” - 在“职能搜索”页面中的搜索框输入关键词(如“UI设计师”) - 观察链接变化,得出关键词在链接中对应位置/参数 ``` UI设计师_url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,UI%25E8%25AE%25BE%25E8%25AE%25A1%25E5%25B8%2588,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=' # 将用户输入的关键词二进制码提取出来 UI设计师_url_list = UI设计师_url.split(",")[6] UI设计师_url_list # 观察得,关键词的位置在'https://search.51job.com/list/000000,000000,0000,00,9,99,' 和 ',2,1.html?'之间 UI设计师相对应的二进制码为 UI%25E8%25AE%25BE%25E8%25AE%25A1%25E5%25B8%2588 ``` 2. 构建参数模板 ``` 参数模版 = urllib.parse.urlparse(UI设计师_url) 参数模版_list = pd.Series(参数模版).tolist() print(参数模版_list[2]) 参数 = 参数模版_list[2].split(',')[6] print(参数) ``` 运行结果 参数=`/list/000000,000000,0000,00,9,99,UI%25E8%25AE%25BE%25E8%25AE%25A1%25E5%25B8%2588,2,1.html UI%25E8%25AE%25BE%25E8%25AE%25A1%25E5%25B8%2588` #### 2.2.2 抓取js文件,获取相关参数 1. 获取链接请求 ``` 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=' session = HTMLSession() r = session.get(url) ``` 2. 获取页面内容 ``` r.html.html ``` 3. 获取相关参数 由于51job网站是动态加载的,网页中所保存的动态信息内容在js文件中,因此我们首先要抓取其对应的js文件,再从其中获取相关的参数内容 ``` # 查看页面中的所有js文件 script_list = r.html.xpath('//script') script_list ``` ``` # 提取所需的js文件,并请求响应 script_url = "http:"+script_list[-3].html.split("\"")[3] script_url res = session.get(script_url) res ``` ``` # 将js文件中的内容解码成'gbk'格式 js = res.content.decode('gbk') js ``` #### 2.2.3 参数(以“工作年限”为例) ``` # 观察得 工作年限的参数为 workyear 工作年限 = js.split('workyear=')[1].split(',window.d_search_providesalary=')[0] 工作年限.strip('[]') ``` 返回结果:`'{k:"99",v:"请选择"},{k:"01",v:"在校生/应届生"},{k:"02",v:"1-3年"},{k:"03",v:"3-5年"},{k:"04",v:"5-10年"},{k:"05",v:"10年以上"},{k:"06",v:"无需经验"}'` ``` # 建立工作年限参数的字典 工作年限_dict = { '请选择':'99', '在校生/应届生':'01', '1-3年':'02', '3-5年':'03', '5-10年':'04', '10年以上':'05', '无需经验':'06' } 工作年限_dict ``` 返回结果 工作年限_dict=`{'请选择': '99', '在校生/应届生': '01', '1-3年': '02', '3-5年': '03', '5-10年': '04', '10年以上': '05', '无需经验': '06'}` “学历要求”等标签的字典建立都可用如上方法,其中“学历要求”的字典返回结果为`{'请选择': '99', '初中及以下': '01', '高中/中技/中专': '02', '大专': '03', '本科': '04', '硕士': '05', '博士': '06', '无学历要求': '07'}` ### 2.3 总参数模板生成 #### 2.3.1 观察链接,找到链接异同之处 ``` # 解析链接 base_url = 'https://search.51job.com/list/000000,000000,7801,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=' r = session.get(base_url) # 查看链接的每个部分(以path为例) job_url_query = urllib.parse.urlparse(base_url).path job_url_query ``` 运行结果 job_url_query=`'/list/000000,000000,7801,00,9,99,+,2,1.html'` ``` # 观察链接,找到链接异同之处 same_query1 = 'lang=c&postchannel=0000' same_query2 = '&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=' dict_url = { 'scheme':'https', 'netloc':'search.51job.com', 'path':'/list/000000,000000,7801,00,9,99,+,2,1.html', 'params':'', 'query':'', 'fragment':'' } # 重组链接 partial_url = urllib.parse.urlunparse(dict_url.values()) partial_url ``` #### 2.3.2 创建总url参数模板 ``` def url_参数模板生成(workyear,degreefrom,keyword): for key in 工作年限_dict: if workyear in key: wy_query = '&workyear='+工作年限_dict[key] for key in 学历要求_dict: if degreefrom in key: d_query = '°reefrom='+学历要求_dict[key] url_01 = partial_url+'?'+same_query1+wy_query+'&cotype=99'+d_query+same_query2 keyword_参数模版 = urllib.parse.urlparse(url_01) keyword_参数模版_list = pd.Series(keyword_参数模版).tolist() 参数 = keyword_参数模版_list[2].split(',')[6] # 对二进制形式的关键词进行解码 keyword_values = urllib.parse.quote(keyword) keyword_values1 = urllib.parse.quote(keyword_values) 参数 = 参数模版_list[2].split(',')[6] 参数 = keyword_values1 keyword_参数模版_list[2] = 'list/000000,000000,0000,00,9,99,'+参数+',2,1.html' url_参数 = urllib.parse.urlunparse(keyword_参数模版_list) return (url_参数) ``` 运行结果 url_参数=`'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%25B8%25B8%25E6%2588%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E5%25B8%2588,2,1.html?lang=c&postchannel=0000&workyear=03&cotype=99°reefrom=04&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='`