拉勾网爬虫与数据挖掘
描述
爬取拉勾网50万条职位信息,进行数据清洗,简单的数据分析。流程图如下:
一个demo展示外观:
环境
操作系统
- Ubuntu 16.04
- mac OS 10.13.3
数据获取
- Chrome
- Python3
数据清洗
- Excel
- DataGrip
- MySQL
- phpMyAdmin
- VScode
- Anaconda Jupyter Notebook
数据分析
- Excel
- DataGrip
- MySQL
- phpMyAdmin
- Anaconda Jupyter Notebook
数据可视化
- HTML
- Bootstrap
- JavaScript
- PHP
- Echarts
Python模块
- request
- BeautifulSoup
- Json
- numpy
- pandas
- matplotlib
- sklearn
- pymysql
文件描述
get_position.py
爬取拉勾网的爬虫程序position_name.txt
保存拉勾所有职位
数据获取
-
使用Chrom分析拉勾源码,发现拉勾网使用Ajax请求数据如下图所示:
-
返回的数据是Json格式,处理起来非常方便,如下图所示:
-
需要的职位信息在
object -> content -> positionResult -> result
-
使用多线程策略在mac中,校园网环境下进行职位详情页的爬取,并采用BeautifulSoup4提取出网页中需要的文字信息,以便后期大数据分析。处理速度达到了每秒20个职位。
-
拉勾的反爬虫策略
header不加session直接请求拉勾服务器,在请求数次之后就会被拒绝。手动注册账号登录拉勾网,利用Chrome开发工具将header的session后的字符串复制下载,加到程序的header中。这样再请求拉勾服务器就不会被拒绝了。注意超过一天之后session就失效了,登录账号更换一个新的session即可。
数据清洗
去重(SQL)
CREATE TABLE tmp2 as select min(id) as mid from tab3 group by 职位ID
CREATE TABLE lagou2 as SELECT * FROM lagou WHERE id in (SELECT mid from tmp2)
去重(Pandas)
- 经过手工的查看有大量的重复值,使用
pandas
的drop_duplicates(subset=['positionId'])
将重复的positionId
去掉,只保留一行重复记录。 - 用
pandas
的pandas.DataFrame.to_csv()
将去重的文件保存为csv文件 - Excel 2016打开去重的csv文件,利用快速填充提取字段的
4k-8k
等工资字段,取平均值。工作年限使用同样的操作提取 - 创建MySQL数据库以导入csv文件,创建数据库如下,这里用的是
phpMyAdmin
手动创建数据库字段,自动生成创建语句:
CREATE TABLE `LAGOU`.`position` ( `ID` INT NOT NULL AUTO_INCREMENT , `positionId` INT(10) NOT NULL , `positionLables` VARCHAR(20) NOT NULL , `positionName` VARCHAR(20) NOT NULL , `positionAdvantage` VARCHAR(20) NOT NULL , `firstType` VARCHAR(20) NOT NULL , `secondType` VARCHAR(20) NOT NULL , `workYear` INT(10) NOT NULL , `education` VARCHAR(20) NOT NULL , `salary` VARCHAR(20) NOT NULL , `isSchoolJob` VARCHAR(5) NOT NULL , `companyId` INT(10) NOT NULL , `companyShortName` VARCHAR(20) NOT NULL , `companyFullName` VARCHAR(20) NOT NULL , `companySize` VARCHAR(20) NOT NULL , `financeStage` VARCHAR(20) NOT NULL , `industryField` VARCHAR(20) NOT NULL , `industryLables` VARCHAR(20) NOT NULL , `createTime` VARCHAR(20) NOT NULL , `formatCreateTime` VARCHAR(20) NOT NULL , `city` VARCHAR(20) NOT NULL , `district` VARCHAR(20) NOT NULL , `businessZones&#