确定网页的加载方式是JavaScript加载

通过谷歌浏览器开发者工具分析和寻找网页的真实请求,确定真实数据在position.Ajax开头的链接里,请求方式是POST

使用requests的post方法获取数据,发现并没有返回想要的数据,说明需要加上headers和每隔多长时间爬取

我们可以看到拉勾网列表页的信息一般js加载的都在xhr和js中,通过发送ajax加载POST请求,获取页面信息。

这个是ajax的头信息,通过Form Data中的的信息获取页面

下面是scrapy爬虫的 代码部分

1 importscrapy2 importjson3 from lagou.items importLagouItem4 classLagoupositionSpider(scrapy.Spider):5 name = 'lagouposition'

6 allowed_domains = ['lagou.com']7 kd = input('请输入你要搜索的职位信息:')8 ct =input('请输入要搜索的城市信息')9 page=1

10 start_urls = ["https://www.lagou.com/jobs/list_"+str(kd)+"&city="+str(ct)]11 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",12 'Referer': 'https://www.lagou.com/jobs/list_'+str(kd)+'?labelWords=&fromSearch=true&suginput=',13 'Cookie':'_ga=GA1.2.1036647455.1532143907; user_trace_token=20180721113217-aacd6291-8c96-11e8-a020-525400f775ce; LGUID=20180721113217-aacd667e-8c96-11e8-a020-525400f775ce; index_location_city=%E5%8C%97%E4%BA%AC; _gid=GA1.2.1320510576.1532272161; WEBTJ-ID=20180723084204-164c4960832159-09bf89fcd2732e-5e442e19-1049088-164c496083348; JSESSIONID=ABAAABAABEEAAJAC7D58B57D1CAE4616ED47AACF945615E; _gat=1; LGSID=20180723203627-04b27de6-8e75-11e8-9ee6-5254005c3644; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DYhfCtaCVlOHCdncJxMCMMS3PB1wGlwfw9Yt2c_FXqgu%26wd%3D%26eqid%3D8f013ed00002f4c7000000035b55cbc4; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1532306722,1532306725,1532306732,1532349358; SEARCH_ID=cdd7822cf3e2429fbc654720657d5873; LGRID=20180723203743-3221dec8-8e75-11e8-a35a-525400f775ce; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1532349434; TG-TRACK-CODE=search_code'

14 }15

16

17 defparse(self, response):18 with open('lagou.html','w') as f:19 f.write(response.text)20 url="https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"

21 formdata={'first':'true','kd':str(self.kd),'pn':'1','city':str(self.ct)}22 yield scrapy.FormRequest(url,formdata=formdata,callback=self.parse_detail,headers=self.headers)23

24 defparse_detail(self,response):25 text=json.loads(response.text)26 res=[]27 try:28 res = text["content"]["positionResult"]["result"]29 print(res)30 except:31 pass

32 if len(res)>0:33 item =LagouItem()34 for position inres:35 try:36 item['title']=position['positionName']37 item['education']=position['education']38 item['company']=position['companyFullName']39 item['experience']=position['workYear']40 item['location']=position['city']41 item['salary'] = position['salary']42 print(item)43 except:44 pass

45 yielditem46 self.page+=1

47 url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false

48 formdata={'first':'false','kd':str(self.kd),'pn':str(self.page),'city':str(self.ct)}49 print('===========================',formdata)50 yield scrapy.FormRequest(url, callback=self.parse_detail, formdata=formdata,headers=self.headers)51 else:52 print("爬取结束!")

注意拉钩网有反爬措施, 我们在Formreqest提交POST请求消息必须携带kd等键值对,在setting中也许设置

1 DOWNLOAD_DELAY = 20

2 #设置爬取时间

3 ROBOTSTXT_OBEY =False4 #是否遵循发爬虫协议

5 DEFAULT_REQUEST_HEADERS ={6 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',7 'Accept-Language': 'zh-CN,zh;q=0.8',8 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',9 'Host': 'www.lagou.com',10 'Origin': 'https://www.lagou.com',11 'Referer': 'https://www.lagou.com/jobs',12 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',13 'X-Anit-Forge-Code': '0',14 'X-Anit-Forge-Token': 'None',15 'X-Requested-With': 'XMLHttpRequest'

16 }17 #请求头信息headers

接下来就是在items中设置爬取信息的字段

1 importscrapy2

3

4 classLagouItem(scrapy.Item):5 #define the fields for your item here like:

6 #name = scrapy.Field()

7 #pass

8

9 education=scrapy.Field()10 company=scrapy.Field()11 experience=scrapy.Field()12 location=scrapy.Field()13 salary=scrapy.Field()14 title= scrapy.Field()

在Pipeline.py文件中设置保存爬取文件的格式等

1 importjson2 classLagouPipeline(object):3 defopen_spider(self,spider):4 self.file=open('pythonposition.json','w',encoding='utf-8')5 defprocess_item(self, item, spider):6 python_dict=dict(item)7 content=json.dumps(python_dict,ensure_ascii=False)+'\n'

8 self.file.write(content)9 returnitem10 defclose_spider(self,spider):11 self.file.close()

注意一定要把setting中的ITEM_PIPELINES解注释,接下来就是跑起我们的项目,通过input输入想要爬取的职位和城市,

上面就是爬取到的信息总共是855条招聘消息,接下来就是用jumpter-notebook打开爬取到的csv文件用pandas,numpy,和mupltlib进行分析

1 importpandas as pd2 importnumpy as np3 importseaborn as sns4 lagou=pd.read_csv('./examples/lagou.csv')5 lagou.info()6 #查看缺失值情况

通过读取文件并显示出855条招聘信息是否有缺失值

1 city=lagou['location']2 city=pd.DataFrame(city.unique())3 city

通过上面可以看到招聘python职位的城市,总共有38城市

1 education=lagou['education']2 education=pd.DataFrame(education.unique())3 lagou['education'] = lagou['education'].replace('不限','unlimited')4 lagou['education'] = lagou['education'].replace('大专','junior')5 lagou['education'] = lagou['education'].replace('本科','regular')6 lagou['education'] = lagou['education'].replace('硕士','master')7 lagou['education'] = lagou['education'].replace('博士','doctor')8 #seaborn不支持中文需将对应的中文替换

9 importseaborn as sns10 sns.set_style('whitegrid')11 sns.countplot(x='education',data=lagou,palette='Greens_d')

通过上图可以看到大多数的Python职位招聘还是本科学历为主

1 experience=lagou['experience']2 experience=pd.DataFrame(experience.unique())3 lagou['experience'] = lagou['experience'].replace('不限','unlimited')4 lagou['experience'] = lagou['experience'].replace('3-5年','3-5')5 lagou['experience'] = lagou['experience'].replace('1-3年','1-3')6 lagou['experience'] = lagou['experience'].replace('5-10年','5-10')7 lagou['experience'] = lagou['experience'].replace('1年以下','<1')8 lagou['experience'] = lagou['experience'].replace('应届毕业生','intern')9 experience10 sns.countplot(x="experience", data=lagou,palette="Blues_d")

上图是招聘的工作经验的人数分布图,可以看到3-5年的Python工程师比较抢手,其次就是1-3年工作经验的

1 importmatplotlib.pyplot as plt2 %matplotlib inline3 f, ax1= plt.subplots(figsize=(20,20))4 sns.countplot(y='salary', data=lagou, ax=ax1)5 ax1.set_title('Python salary distribute',fontsize=15)6 #薪资分布

7 ax1.set_xlabel('salary')8 #薪资

9 ax1.set_ylabel('level')10 plt.show()

同过下图可以看到拉勾网上的pyhong工程师薪资待遇,其中待遇重要分布在10-40K之间,其中给出15-30K工资待遇的企业最多

Python工程师还是很有前景的,

python数据分析工资_拉勾网爬取全国python职位并数据分析薪资,工作经验,学历等信息...相关推荐

  1. python酒店评论分析_手把手用Python网络爬虫带你爬取全国著名高校附近酒店评论...

    点击蓝色"Python空间"关注我丫 加个"星标",每天一起快乐的学习 今 日 鸡 汤 我站在鼓楼下边,一切繁华与我无关. /1 前言/ 简介:本文介绍如何用p ...

  2. 【爬虫实战】Python 自制天气预报程序!爬取全国天气网

    学会了爬虫,让我们自制一个天气预报的爬虫吧! 需求分析 1.用 requests 爬取 全国天气网 的网页源代码: 2.用 pyquery 解析网页源代码,取得天气情况信息的节点: 3.用 xlwt ...

  3. 【Python爬虫+pyecharts可视化】爬取全国各地房价并在echarts的geo地图上展示

    导言 最近回归了可视化,写个文章总结一下经验教训,嘿嘿.不想看分析过程的可以点击目录,直接跳转到代码实现部分.(代码所用模块都是可以用    pip install 模块名    下载的哟) 先看看最 ...

  4. python简直万能_一键爬取资源,Python简直太强大了!

    "用Python写个 爬虫小程序,每分钟可以发起几千次"点击"的动作,任手速再快也不可能赶得上,那抢中概率自然就高了." ▲爬虫自动抢鞋子 这么神! 于是,我认 ...

  5. python 生意参谋_如何爬取生意参谋数据?是不是违规操作?

    生意参谋是阿里巴巴为商家打造的一站式.个性化.可定制的商务决策体验平台.近期发现,有部分人员使用爬虫爬取生意参谋平台数据,影响商家的用户体验.到底是如何爬取生意参谋数据呢? 官方推荐淘宝.京东.拼多多 ...

  6. python招聘工资_爱名:利用Python分析了3万个招聘结果,SEO真实工资大揭秘!

    前面几天我搜索SEO培训这个关键词,然后打开了一些做竞价推广的网站,上面写着SEO优化工资高达1万5一个月,十足把我吓了一跳.我在想中国的工资啥时候这么高了,当然,附子老师不给大家讲所谓的高薪,我们用 ...

  7. Java爬取frame的课程表_从爬取湖北某高校hub教务系统课表浅谈Java信息抓取的实现 —— import java.*;...

    原创文章与源码,如果转载请注明来源. 一.概述 整个系统用Java开发.我们现在要做的是类似于超级课程表.课程格子之类的功能:输入一个学生的教务系统账号.密码,得到Ta的课程表信息.点击进入课表查询, ...

  8. python log壁纸_一个爬取Bing每日壁纸的python脚本

    1. 背景 Bing搜索每天的背景图片有些比较适合做桌面,但是有的提供下载有的不提供下载.每天去点击下载又不太方便,所以第一次学习了一下python爬虫怎么写,写的很简单. 2. 相关技术 2.1 P ...

  9. 用python爬取考研信息网_【高考、考研党的福利】使用Python爬取全国高校及GIS/RS专业信息【附代码和Excel】...

    题外话:前一段时间翻译了一部关于GIS的纪录片,然后发了一篇文章,没想到有这么多人感兴趣,为了让广大GISER知道有这部神片,遂想投稿至GIS相关的专栏,不曾想居然还没人开设,真是"绕树三匝 ...

最新文章

  1. 怎么书写高质量jQuery代码
  2. 深度学习 Deep Learning with MATLAB(懒人版)
  3. 给新手的 11 个 Docker 免费上手项目
  4. pagerank公式的理解
  5. 北斗导航 | 北斗三号全球导航卫星系统6类服务测试评估
  6. Pytorch(七) --加载数据集
  7. flume package遇到的问题
  8. 如何使用敏捷开发来赢得太阳能竞速赛
  9. 为linux扩展swap分区
  10. ubuntu 网卡网速测试bondnetperf测试优化tcp
  11. JQuery的一些简单使用
  12. OpenCV-特征提取与检测(03、自定义角点检测器)
  13. vs2015完全卸载+重装 成功解决 未能加载xx包、未能安装编译器等问题
  14. 【废了-准备删除02】信息收集——基于WAMP的drupal7.x管理系统
  15. Xilinx FPGA资源解析与使用系列——Transceiver(一)参考时钟解析
  16. R语言入门代码(二)for循环的理解
  17. GC导致线上CPU超100%
  18. 10岁男童高考566分8岁开发操作系统
  19. 分布式系统以及分布式系统架构的优缺点
  20. lintcdoe: Number of Airplanes in the Sky

热门文章

  1. 达梦8和Oracle11中使用DatabaseMetaData.getProcedureColumns方法的区别
  2. 【elk】网络设备syslog日志收集
  3. sublime 3 编辑器
  4. 经典蓝牙 蓝牙连接 - 从AIR LOG和HCI LOG分别分析蓝牙连接流程
  5. [附源码]java+ssm计算机毕业设计个人博客管理系统4n8ge(源码+程序+数据库+部署)
  6. python 魔法函数 __add___python魔法方法
  7. 62354-43-2,标记肽vLK-对硝基苯胺
  8. 香水商城平台小程序开发功能有哪些?
  9. 8大征兆判断你的单元测试用例写得如何
  10. hackthebox资源收集