1、项目要求

内容完整程度、可用性(可操作、易操作、美观)、时间先后、先进性等。


2、项目内容

爬取前程无忧网站(网址:https://www.51job.com/)上的工作招聘信息(截止2018年11月5日),分析工作需求量、工作地点等数据。

工作招聘种类众多,为简化数据量,我在这里选取的是上海地区的互联网/电子商务行业的工作招聘,以此来分析上海地区的互联网行业招聘状况。


3、项目准备

(1)Python库的安装:

在该项目中,我使用到了如下python库:

Requsts库和BeautifulSoup库都是比较常见的Python库,而xlwt库是支持对Excel文件格式为xls文件的写入的库。安装  比较方便,不再赘述。

(2)了解HTML:

为爬取前程无忧网站的数据,我们要先观察一下它的HTML,以下是代码截图:

将右边放大:

我们可以观察到每一行招聘信息都在其各自的<div class=”el mk”>中,在每一个<div class=”el mk”>中,“职位名称”位于<p class=”t1 tg1”>,在<span>的子标签<a>中,作为title属性,同样的,“公司名称”位于<span class=”t2”>中,工作地点在<span class=”t3”>中,“薪资”在<span class=”t4”>,而t5是这条招聘信息的上传时间,不属于我们爬取数据的范围。


4、构建爬虫

总的来说,爬虫的代码并不难写。

我设计了四个函数,如下:

(1)get_one_page(url)函数:

该函数是将用BeautifulSoul解析传进来的url,并返回一个soup。

(2)get_info(soup)函数:

该函数是获取一页的数据。由网站截图可知,其信息展示是翻页式的,所以每一获取一页的内容。

这里分别定义了职位、公司、工作地点和薪资的列表,用来存储爬取到的数据。

(3)write_to_excel()函数:

该函数是将四个存储数据的列表写入excel表格。

(4)main()函数:

主函数,根据参数决定爬取多少页内容,将爬取的内容全都存储在列表中,最后再写入excel表格中。

这里刚开始我没找到网站的规律,因为太长了(所以截图也截不全),后来突然发现其中某一个数字代表第几页,就可以直接将该数字替换为循环变量i。


5、执行爬虫,爬取数据

本次爬取数据爬取了20页,共1004条数据。数据截图如下:


6、分析数据

对工作地点进行词频整理,代码如下:

我取了前十五名,结果如下:

绘制柱状图,因为一张柱状图最多显示十个数据,所以我们选择前十名进行绘制:

同样的,我们可以分析职位数量,大概重复了六七次,终于把一些无关紧要的词剔除了,剩下了一些还算是比较明确的职位词语。(左边为代码,右边为输出结果):

 

数量排在前10名的职位饼图:

数量排在前20名的职位(在输出结果中筛选了一下更符合“职业”的关键词)饼图:

由此可见,上海地区的Java语言在岗位需求占有巨大的比例,发展前景相当可观。

【Ps:因为我做实验比较慢哦,所以更新也比较慢,请见谅~      笔芯!(´▽`ʃ♡ƪ)】

因为有很多人要,所以把代码贴在这里。但是这是我一年之前写的代码了,也是我好不容易翻出来的,据说前程无忧的反爬也有所变化,所以不确定还能不能行。

贴在这里,仅供大家学习参考用。

import requests
from bs4 import BeautifulSoup
from lxml import html
import pymysql
import time# url = "https://search.51job.com/list/020000,000000,0100,32,9,99,%2520,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="
# 各项信息均不在同一个类中
job_name = []  # 职位名
company_name = []  # 公司名
work_place = []  # 工作地点
salary = []  # 薪资
education = []  # 学历
experience = []  # 经验
welfare = [] # 福利
job_href = []  # 该职位对应的链接
company_href = []  # 该公司对应的链接xueli = ""
jingyan = ""
fuli = []def deal_salary(string):# 51job的薪资都是0.5-1万/月或者5-9千/月的形式# 这里我们将转变成5K-10K的形式(默认为月薪)# 我们找到“-”这个符号的位置index = string.find("-")# -前面的即为薪资的最小值min = string[0:index]min_value = eval(min)print(type(min_value))print("薪资最小值:"+min)# -后面的即为薪资的最大值max = string[index+1:-3]max_value = eval(max)print("薪资最大值:"+max)# 取倒数第三位(“万”或者“千”)s = string[-3]print("倒数第三位:"+s)result = ""if s =="万":min_value = int(min_value*10)max_value = int(max_value*10)print(str(min_value))result = str(min_value)+"K-"+str(max_value)+"K"print(result)if s =="千":result = str(min_value) + "K-" + str(max_value) + "K"return resultdef get_one_page(url):  # 一页r = requests.get(url, headers={'User-Agent': 'Baiduspider'},timeout=10)  # 伪装成百度爬虫r.encoding = 'gb18030'soup = BeautifulSoup(r.text, "html.parser")return soupdef get_subpage(url):  # 一页r = requests.get(url, headers={'User-Agent': 'Baiduspider'},timeout=10)  # 伪装成百度爬虫r.encoding = 'gb18030'result = html.fromstring(r.text)return resultdef get_subinfo(result):# 前程无忧网站的职位首页没有显示学历、经验和福利等信息,# 所以要通过获取职位的链接查看职位的详情页# 在详情页获得这些信息# 这里的jingyan、xueli、fuli是全局变量,是暂时存储信息的,最后都会汇总到对应的列表中jingyan = result.xpath('//p[@class="msg ltype"]/text()')[1] # 经验xueli = result.xpath('//p[@class="msg ltype"]/text()')[2]  # 学历fuli = result.xpath('//div[@class="t1"]//span/text()')  # 福利#print(xueli)#result = get_subpage('https://jobs.51job.com/suzhou/110841344.html?s=01&t=0')
#get_subinfo(result)def get_info(soup):  # 获取一页的信息p1_tag = soup.find_all("p", class_="t1")  # 获得带有职位名的所有p标签p2_tag = soup.find_all("span", class_="t2")  # 获得带有公司名的所有标签p3_tag = soup.find_all("span", class_="t3")  # 获得带有工作地点的所有标签p4_tag = soup.find_all("span", class_="t4")  # 获得带有薪资的所有标签p5_tag = soup.find_all()a1_tag = []a2_tag = []# job对应的职位名以及hreffor i in p1_tag:a1_tag.append(i.find('a', target='_blank'))for j in a1_tag:job_name.append(j.get("title"))job_href.append(j.get("href"))result = get_subpage(j.get("href"))# get_subinfo(result)try:# 经验数组越界jingyan = result.xpath('//p[@class="msg ltype"]/text()')[1]  # 经验jingyan = "".join(jingyan.split())  # 去掉\xa0except:print("经验出现问题")jingyan = " "try:# 学历数组越界xueli = result.xpath('//p[@class="msg ltype"]/text()')[2]  # 学历xueli = "".join(xueli.split())except:print("学历出现问题")xueli = " "fuli = result.xpath('//div[@class="t1"]//span/text()')  # 福利education.append(xueli)experience.append(jingyan)welfare.append(fuli)# print(xueli)# company对应的名称以及hreffor i in p2_tag:a2_tag.append(i.find('a', target='_blank'))for j in a2_tag:if j is None:continueelse:company_name.append(j.get("title"))company_href.append(j.get("href"))#print(company_name)#for i in p3_tag:if i.string == "工作地点":continueelse:work_place.append(i.string)#print(work_place)for i in p4_tag:if i.string == "薪资":continueelse:salary.append(i.string)#print(salary)def text_save(filename, data):file = open(filename, 'a', encoding="utf-8")for i in range(len(data)):# s = str(data[i]).replace('[', '').replace(']', '')  # 去除[],这两行按数据不同,可以选择# s = s.replace("'", '').replace(',', '') + '\n'  # 去除单引号,逗号,每行末尾追加换行符s = str(data[i]) + '\n'file.write(s)file.close()print("保存文件成功")def write_to_sql():# 创建连接conn = pymysql.connect('localhost','root','123456','web_crawler')# 创建游标cursor = conn.cursor()query = "insert jobsearch(Job,Company,WorkPlace,Salary,Education,Experience,Welfare,Job_Link,Company_Link) values (%s,%s,%s,%s,%s,%s,%s,%s,%s)"i = 0while i < len(job_name):doc = []doc.append(job_name[i])doc.append(company_name[i])place = work_place[i]print(type(place))index = place.find("-")if index != -1:place_str = place[0:index]doc.append(place_str)else:doc.append(place)if salary[i] == None or salary[i] == "" or salary[i].find("-")==-1:doc.append(salary[i])else:sal = deal_salary(str(salary[i]))doc.append(sal)doc.append(education[i])doc.append(experience[i])string = ','.join(welfare[i])doc.append(string)doc.append(job_href[i])doc.append(company_href[i])print(doc)row = cursor.execute(query, tuple(doc))conn.commit()# print(row)i = i+1# 主函数,参数为爬取多少页信息
def main(page_number):for i in range(31, page_number):soup = get_one_page("https://search.51job.com/list/000000,000000,0000,01%252C32,9,99,%25E5%25BC%2580%25E5%258F%2591,2,"+str(i)+".html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=")time.sleep(3)get_info(soup)print(salary)#print(education)#print(welfare)write_to_sql()main(40)

通过爬取前程无忧网站数据分析上海互联网行业招聘状况相关推荐

  1. Python爬虫(三)Beautiful Soup 实战,爬取前程无忧网站

    Beautiful Soup介绍 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能. Beautiful Soup自动将输入文档转换为Unicode ...

  2. 使用Selenium爬取前程无忧网站最新发布的前五页招聘信息

    本文主要使用Selenium调用谷歌浏览器,爬取前程无忧(https://mkt.51job.com)网站最近发布的招聘信息的前五页内容(本文以数据分析师为例子进行爬取),完整代码如下. from s ...

  3. 爬取前程无忧网站数据

    1.爬取中华英才网,前程无忧网站的数据. spiders下: # -*- coding: utf-8 -*- import scrapy,copy from ..items import QcwyIt ...

  4. Python爬取某网站数据分析报告,不满十八岁禁止观看

    声明:此文并不是标题党,如果你不满18岁,请马上关闭,在父母陪同下观看也不行. 本文的数据抓取自国内最大的亚文化视频社区网站(不,不是 B 站),其中用户出于各种目的会在发帖的标题中加入城市名称,于是 ...

  5. 手把手Selenium安装使用及实战爬取前程无忧招聘网站(一)

    目录 一.安装浏览器驱动器 1. 下载驱动器 2. 启动驱动器 二 .selenium的使用 1. 启动驱动器加载网页 2. 八大元素定位 (1)id 定位 (2)name定位 (3)link_tex ...

  6. selenium+scrapy爬取前程无忧职位

    目标: 爬取前程无忧网站职位关键字为python的职位信息 分析 首页的链接地址: 'https://search.51job.com/list/000000,000000,0000,00,9,99, ...

  7. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  8. 爬虫实战:过年你被催婚啦吗?爬取相亲网站,看看当下年轻小姐姐的择偶观。

    前言 到了一定年龄,父母可能会催你找女朋友,结婚. 大多数的父母催婚,是父母渐渐老了,想让你找个人照顾你,有热饭吃,生病了有人照顾.在外面不被人欺负. 当然,也有一部分来自周围人的压力,跟你同龄的孩子 ...

  9. Python3爬取前程无忧招聘数据教程

    文章来自群友 易某某 的投稿,在此表示感谢! 原文链接:https://blog.csdn.net/weixin_42572590/article/details/103443213 前几天,我发表了 ...

最新文章

  1. DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
  2. lightroom安卓_安卓可以用的一款PS
  3. 缅甸、老挝出入证可在西双版纳办
  4. 图例符号居中显示_R可视化08|ggplot2图层-标度图层(scale layer)-图例篇
  5. 学术好帮手Publons使用指南
  6. SpringCloud动态获取yml文件里面的自定义配置
  7. 论数据集成技术的演变和发展 3/3
  8. martin_pthread_pool
  9. 最小生成树——Prim(普利姆)算法
  10. 小米MIX 4内部代号曝光:“众神之王”三季度降临
  11. 微课|中学生可以这样学Python(5.5.3节):字符串格式化1
  12. vue前端验证输入_Vue-Element之vue-element 输入框验证
  13. 路径取值之含正则表达式的的取值方法
  14. XWiki 6.3 M1 发布,Java 的 Wiki 系统
  15. 蓝牙mesh_什么是蓝牙mesh,蓝牙mesh特征,蓝牙mesh应用
  16. 参数估计:文本分析的参数估计方法
  17. vscode 搭建SSM项目环境
  18. Win10家庭版使用gpedit.msc方法
  19. 解决microsoft store需要联网 你似乎没有联网
  20. 黑马程序员2022新版python教程补充(P61)

热门文章

  1. 【jmeter】--- jmeter汉化方式
  2. 星辰天合参加首届数字驱动创新峰会 强调以 SDS 加速数据基础设施建设
  3. PAT甲级——1166 Summit (25 分)
  4. 为什么大部分人都喜欢使用通达信行情接口?
  5. 黑猫白猫----读《大话设计模式》
  6. 【python】datetime模块计算时间差
  7. MiniGUI Lite 版本
  8. php按中文排序,php按照中文首字母排序
  9. 太力科技冲刺上市:石正兵为实控人,股东刘健为失信被执行人
  10. 伪彩色、真彩色和直接色区别与联系