Python爬取Boss直聘,获取全国Python薪酬榜
深感抱歉
本来这篇文章应该是在昨天发的,可是电脑出了问题蓝屏了。晚上回来重装了系统,结果还是搞到了现在。
今天想和大家聊聊Python与爬虫
python之所以能迅速风靡全国,和大街小巷各种的培训机构脱不开关系。
一会pythonAI未来以来,一会儿4个月培养人工智能与机器学习顶尖人才,更有甚者什么一周成就爬虫分析师…
我这一把年纪了,胆子小只敢在自己的公众号里说说。至于出去了,你们该实力互吹、生猛造势的,我看看就好不说话。
网上经常看到爬虫的文章,什么爬了几十万数据,一把撸下来几千万评论的,听起来高大上又牛逼。
但其实爬虫工程师,你看网上有几个招聘的?为什么,因为数据有价!
各大厂做什么网络解决方案的,怎么解决?不得先把各大运营商数据买回来分析了才去解决吗?天下哪有白吃的午餐。
爬虫面临的问题
不再是单纯的数据一把抓
多数的网站还是请求来了,一把将所有数据塞进去返回,但现在更多的网站使用数据的异步加载,爬虫不再像之前那么方便
很多人说js异步加载与数据解析,爬虫可以做到啊,恩是的,无非增加些工作量,那是你没遇到牛逼的前端,多数的解决办法只能靠渲染浏览器抓取,效率低下,接着往下走千姿百态的登陆验证
从12306的说说下面哪个糖是奶糖,到现在各大网站的滑动拼图、汉子点击解锁,这些操作都是在为了阻止爬虫的自动化运行。
你说可以先登录了复制cookie,但cookie也有失效期吧?反爬虫机制
何为反爬虫?犀利的解释网上到处搜,简单的逻辑我讲给你听。你几秒钟访问了我的网站一千次,不好意思,我把你的ip禁掉,一段时间你别来了。
很多人又说了,你也太菜了吧,不知道有爬虫ip代理池的开源项目**IPProxys
**吗?那我就呵呵了,几个人真的现在用过免费的ip代理池,你去看看现在的免费代理池,有几个是可用的!
再说了,你通过IPProxys代理池,获取到可用的代理访问人家网站,人家网站不会用同样的办法查到可用的代理先一步封掉吗?然后你只能花钱去买付费的代理数据源头封锁
平时大家看的什么爬爬豆瓣电影网站啊,收集下某宝评论啊…这些都是公开数据。但现在更多的数据逐步走向闭源化。数据的价值越来越大,没有数据获取的源头,爬虫面临什么问题?
个人面对爬虫的态度
学习爬虫,可以让你多掌握一门技术,但个人劝你不要在这条路走的太深。没事儿爬点小东西,学习下网络知识,掌握些网页解析技巧就好了。再牛逼的爬虫框架,也解决不了你没数据的苦恼。
说说今天内容
扯了一圈了,该回到主题了。
上面说了一堆的爬虫这不好那不好,结果我今天发的文章确是爬虫的,自己打自己的脸?
其实我只是想说说网站数据展示与分析的技巧…恰巧Boss直聘就做的很不错。怎么不错?一点点分析…
- 数据共享
先来看一张图:
我选择黑龙江省的大兴安岭,去看看那里有招聘python的没,多数系统查询不到数据就会给你提示未获取到相关数据,但Boss直聘会悄悄地吧黑龙江省的python招聘信息给你显示处理,够鸡~贼。 - 数据限制
大兴安岭没有搞python的,那我们去全国看看吧:
这里差一点就把我坑了,我开始天真的以为,全国只有300条(一页30条,共10也)python招聘信息。
然后我回过头去看西安的,也只有10页,然后想着修改下他的get请求parameters,没卵用。
这有啥用?仔细想…一方面可以做到放置咱们爬虫一下获取所有的数据,但这只是你自作多情,这东西是商机!
每天那么多的商家发布招聘信息,进入不了top100,别人想看都看不到你的消息,除非搜索名字。那么如何排名靠前?答案就是最后俩字,靠钱。你是Boss直聘的会员,你发布的就会靠前… - 偷换概念
依旧先看图:
我搜索的是ruby,你资料不够,其他来凑… - ip解析
老套路,再来看一张图:
感觉人生已经到达了高潮,感觉人生已经到达了巅峰
Boss直聘的服务器里,留着我的痕迹,多么骄傲的事情啊。你们想不想和我一样?只需要3秒钟…
三秒钟内你的访问量能超过1000,妥妥被封!
- 反反反爬虫
咱们正常的叫爬虫,它不让我们爬,这叫反爬虫,然后我们用ip代理池的ip,这叫反反爬虫。结果你发现,人家早就把可用的代理池先一步封了,这叫反反反爬虫…
免费代理池中,很多代理是不可用或者需要输入密码的。好不容易找到一些能用的列表,拉过来添加上发现早就被封掉了,也许是它提前禁掉,也许是别人用过被封了,但结局就是你千辛万苦找来的,往往最终还是失败的。
那么我们该怎么办
- 设置不同的User-Agent
使用pip install fake-useragent
安装后获取多种User-Agent,但其实本地保存上几十个,完全够了… - 不要太夯(大力)
适当的减慢你的速度,别人不会觉得是你菜…别觉得一秒爬几千比一秒爬几百的人牛逼(快枪手子弹打完的早…不算开车吧?)。 - 购买付费的代理
为什么我跳过了说免费的代理?因为现在搞爬虫的人太多了,免费的基本早就列入各大网站的黑名单了。
说书今天的内容
爬取全国热点城市的职业,然后对各大城市的薪资进行比较。
原始数据如下:
先来看看python的薪酬榜:
看一下西安的排位,薪资平均真的好低…
至于你说薪资范围:什么15-20K?放心90%的人入职都只会给你15K的,那10%的人不是你,不是你。
再来看看ruby的:
看这感觉比Python高很多啊…但其实呢?跟百度人均公司3W+一样,你拿人均算?光几个总裁年薪上亿的,就拉上去了…
但还是可以看到一点,西安的薪酬还是好低…
代码
代码其实没有太多讲的,篇幅最多的内容,估计就是我的User-Agent了…
# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清风Python
# @Date : 2019/6/14 22:23
# @Software : PyCharm
# @version :Python 3.6.8
# @File : BossCrawler.pyimport requests
from bs4 import BeautifulSoup
import csv
import random
import time
import argparse
from pyecharts.charts import Line
import pandas as pdclass BossCrawler:def __init__(self, query):self.query = queryself.filename = 'boss_info_%s.csv' % self.queryself.city_code_list = self.get_city()self.boss_info_list = []self.csv_header = ["city", "profession", "salary", "company"]@staticmethoddef getheaders():user_list = ["Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16","Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14","Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14","Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02","Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00","Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00","Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00","Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00","Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0","Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62","Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52","Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51","Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50","Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50","Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11","Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11","Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11","Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10","Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10","Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10","Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1","Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01","Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01","Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01","Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01","Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01","Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01","Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00","Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00","Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00","Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00","Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00","Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00","Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00","Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00","Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"]user_agent = random.choice(user_list)headers = {'User-Agent': user_agent}return headersdef get_city(self):headers = self.getheaders()r = requests.get("http://www.zhipin.com/wapi/zpCommon/data/city.json", headers=headers)data = r.json()return [city['code'] for city in data['zpData']['hotCityList'][1:]]def get_response(self, url, params=None):headers = self.getheaders()r = requests.get(url, headers=headers, params=params)r.encoding = 'utf-8'soup = BeautifulSoup(r.text, "lxml")return soupdef get_url(self):for city_code in self.city_code_list:url = "https://www.zhipin.com/c%s/" % city_codeself.per_page_info(url)time.sleep(10)def per_page_info(self, url):for page_num in range(1, 11):params = {"query": self.query, "page": page_num}soup = self.get_response(url, params)lines = soup.find('div', class_='job-list').select('ul > li')if not lines:# 代表没有数据了,换下一个城市returnfor line in lines:info_primary = line.find('div', class_="info-primary")city = info_primary.find('p').text.split(' ')[0]job = info_primary.find('div', class_="job-title").text# 过滤答非所谓的招聘信息if self.query.lower() not in job.lower():continuesalary = info_primary.find('span', class_="red").text.split('-')[0].replace('K', '')company = line.find('div', class_="info-company").find('a').text.lower()result = dict(zip(self.csv_header, [city, job, salary, company]))print(result)self.boss_info_list.append(result)def write_result(self):with open(self.filename, "w+", encoding='utf-8', newline='') as f:f_csv = csv.DictWriter(f, self.csv_header)f_csv.writeheader()f_csv.writerows(self.boss_info_list)def read_csv(self):data = pd.read_csv(self.filename, sep=",", header=0)data.groupby('city').mean()['salary'].to_frame('salary').reset_index().sort_values('salary', ascending=False)result = data.groupby('city').apply(lambda x: x.mean()).round(1)['salary'].to_frame('salary').reset_index().sort_values('salary', ascending=False)print(result)charts_bar = (Line().set_global_opts(title_opts={"text": "全国%s薪酬榜" % self.query}).add_xaxis(result.city.values.tolist()).add_yaxis("salary", result.salary.values.tolist()))charts_bar.render('%s.html' % self.query)if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument("-k", "--keyword", help="请填写所需查询的关键字")args = parser.parse_args()if not args.keyword:print(parser.print_help())else:main = BossCrawler(args.keyword)main.get_url()main.write_result()main.read_csv()
结尾说两句
- 关于爬虫的问题,可能言语有些偏激,觉得那里说的不对的,大家可以在评论区讨论。
- 如果大家觉得这种个人言论过多的帖子不适合你们学习,也可以评论或者私信我,我以后少说点。
- ** 这点最重要,如果你们觉得我的文章还看得过去,每天更新还算辛苦,就帮忙把公众号推荐给你身边同样喜欢python的朋友**
- 其实这点对我有些重要,如果你看过觉得有收获,可以点击文章右下角的**“在看”**让我知道。
- 代码和数据和html,老规矩公众号回复boss,即可获取文章的数据、代码及pyecharts生成好的html文件…
今天的内容就到这里,如果觉得有帮助,记得点赞支持。欢迎大家关注我的公众号【清风Python】
Python爬取Boss直聘,获取全国Python薪酬榜相关推荐
- python爬取boss直聘招聘信息_Python 爬取boss直聘招聘信息!
原标题:Python 爬取boss直聘招聘信息! 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求, ...
- python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息
Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...
- 使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)
使用python爬取BOSS直聘岗位数据并做可视化 结果展示 首页 岗位信息 岗位详情 薪资表 学历需求 公司排名 岗位关键词 福利关键词 代码展示 爬虫代码 一.导入库 二.爬取数据 1.爬取数据代 ...
- python爬取boss直聘招聘信息_年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备...
原标题:年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备 前言 为什么都说程序员的薪资高,但是刚开始入职的你,薪资并不是自己想象中的那样,首先是你的工作经验不足,其次就是需要不断的 ...
- 【数据分析项目实战】Python爬取BOSS直聘岗位和数据分析
说明:这是一个数据分析项目全流程(附带项目实例),本篇教程来源于网络,胖哥对此进行了完整的梳理,并把用到的数据+代码完全奉上.如需数据+完整代码可以直接到文章最后获取. 这里面的数据,我只爬取了部分, ...
- python爬取boss直聘招聘信息_python学习之路-爬取boss直聘的岗位信息
背景 想了解从事python相关岗位需要具备什么技能,于是就想从招聘网站上的职位需求入手,把信息获取下来后,生成词云,这样就能很直观的看出来哪些技能是python相关岗位需要具备的了. 技术概览 sc ...
- python 爬取boss直聘招聘信息实现
1.一些公共方法的准备 获取数据库链接: import pymysql ''' 遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载! ''' ...
- python爬取boss直聘招聘信息_Python笔记-爬取Boss直聘的招聘信息
2018-05-09笔记: 最近迷上了爬虫,爬取招聘信息,存在MongoDB上 代码思路和上一篇爬取酷狗TOP500差不多,但是在使用CSS选择器的时候,有两组信息是连在一起,所以使用正则来获取 本来 ...
- Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
今天想和大家聊聊Python与爬虫 python之所以能迅速风靡全国,和大街小巷各种的培训机构脱不开关系. 一会pythonAI未来以来,一会儿4个月培养人工智能与机器学习顶尖人才,更有甚者什么一周成 ...
最新文章
- 爬虫学习笔记(二十三)—— Appium+Mitmproxy
- 无监督特征学习——Unsupervised feature learning and deep learning
- laravel mysql增删改查_Laravel框架数据库操作的增删改三种方式 阿星小栈
- Node系列——Node第三方模块使用总结
- 恭迎万亿级营销(圈人)潇洒的迈入毫秒时代 - 万亿user_tags级实时推荐系统数据库设计...
- Python+OpenCV:摄像机标定(Camera Calibration)
- wls12C启用Gzip
- Windows 10 修复烦人 Bug:一个像素逼死强迫症
- 更改docker ip
- 取消全部呼叫转移代码_中国移动的卡取消呼叫转移的快捷方式是什么?
- 云服务器超级鸟,超级鸟的自述_A3_新浪游戏_新浪网
- 感受亮度与光强,及马赫带效应
- 小米MIUI手机adb连接教程
- AutoCAD .Net 创建直线Line
- 软件开发项目为什么要做第三方软件测试,软件测评机构怎么选择?
- Bing(必应)搜索,为什么用户越来越多?
- 如何获取目标基因的转录因子
- 【分屏】2秒钟实现 Windows窗口多分屏的进阶技巧
- OnlyOffice官方Demo必要的修改及参数解释
- 浏览器 弹广告 android,android手机 UC浏览器 时不时跳出广告 是不是中毒了
热门文章
- 如何方便有效的群发邮件,外贸公司群发邮件平台软件好用吗?
- Python-LBM(格子玻尔兹曼)程序源码实例分析—圆柱绕流篇
- Java基础——IO详解
- Transfer Learning for NLP with TensorFlow Hub
- 如何去除视频水印?分享两种去除视频水印的方法
- 《收获,不止Oracle》表的设计之五朵金花
- 【Python机器学习】决策树、逻辑回归、神经网络等模型对电信用户流失分类实战(附源码和数据集)
- 已解决EROR 1064 (42000): You have an error in. your SOL syntax. check the manual that corresponds to yo
- 知识图谱学习与实践(4)——通过例句介绍Sparql的使用
- vs2010不能正确加载 #39;VSTS for Database Professionals Sql Server Data-tier Application#39;包