受张雪峰老师演讲的影响,“什么样的企业会到齐齐哈尔大学招聘,什么样的企业会到清华大学招聘?”
张雪峰老师演讲讲学历重不重要
仔细思考之后,决定用严肃的数据来回答这个严肃的问题
欢迎一起来搞事
它主要包含以下部分:
-
1.爬取各个大学的就业信息网,获取到各个大学校园内进行宣讲或招聘的企业名单
注意是要获得进入大学进行宣讲或招聘的企业,而不是单纯的挂个通知的企业 (先爬100所大学吧) -
2.根据某种标准对企业进行划分
-
3.数据分析
- 四川大学
- 兰州大学
- 电子科技大学
- 重庆大学
- 华中科技大学
- 中南大学
- 南开大学
- 华南理工大学
- 中国海洋大学
- 北京航空航天大学
- 吉林大学
- 西北农林科技大学
- 湖南大学
- 中央民族大学
- 大连理工大学
- 中国人民大学
- 中国农业大学
- IT橘子网(可根据关键字查询IT公司的融资情况)
大学就业信息网的结构大多十分简单,也没有什么验证码机制,所以用来入门爬虫的话再合适不过了 下面以兰州大学为例,我们爬取到兰州大学进行招聘到企业名单
-
1.首先,百度兰州大学就业信息网(基本上百度 xx大学就业信息网都能找到相应的网站),然后进去找到要到兰大进行宣讲大企业公示
-
2.注意不要找发布招聘信息的企业,那些企业不一定会到兰大进行宣讲,与我们的目标不合,最终,找到的网页如下:
-
3.打开浏览器开发者工具(推荐使用Chrome或火狐浏览器),选择network 进行查看,点击每一条请求,查看其Response, 如果response中包含我们想要的数据,就记录下这条链接。如下图:
-
4.因为通常一条请求中不会包含所有我们想要的数据,往往只有一页的数据,所以需要分析每条链接的构成规则,通常点击一下下一页或上一页,看浏览器中URL的变化,很快就明白了:
-
5.如图,兰大的URL构成非常简单, 一共有50页,所以我们只需要循环构造 list_1.shtml这个参数就行
-
6.可以开始写代码了,构造URL,构造请求头, 对返回的内容解码,解析交给BeautifulSoup来做:
base_url = "http://job.lzu.edu.cn/htmlfile/article/list/119/list_" url_tail = ".shtml" host = "job.lzu.edu.cn" header = Util.get_header(host) max_page_num = 50 req = requests.Session() re = Util.jedis() re.connect_redis() for i in range(1, max_page_num + 1): url = base_url + str(i) + url_tail html = req.get(headers=header, url=url).content.decode("utf-8") parse_html(html, re) print(i) re.add_university("lzu_company_info") print("finish")
-
7.这样就获得了完整的网页内容,下面开始解析, 将网页内容转化为BeautifulSoup的对象, 通过刚刚对网页的分析可以发现,所有我们想要的数据都被包裹在li中,所以,使用soup.find_all("li"),得到下面这样的效果:
-
8.因为网页中使用li包裹的还有很多我们不想要的数据,可以根据数据下标进行准确的截取,比如兰大这个网页中,我们想要的数据在数组的第 24 到 77,因为静态网页的格式十分固定,所以可以直接设置数组下标范围进行截取。
-
9.通过debug(或者直接记住),这些标签中的文字信息,在.text属性中,如图:
-
11.格式化数据格式,将日期与文字分开,并去掉空白行,将数据存储进Redis中。在redis中的所有数据都保存为json格式(相应函数封装在util.Jedis里面)
-
12.这样,就完成了兰州大学的爬虫工作。大学网站大同小异,基本都是这种套路,具体的可以参考上面的源代码
-
13.欢迎一起来玩,直接Fork这个项目提交pull request就行,我真的很想看看,什么样的企业会到什么样的大学去招聘
-
强烈推荐使用火狐和Chrome浏览器,两者搭配干活不累
-
2.动态网页的数据一般(只是一般)放在json格式的文件中,爬虫只需要获得该文件做解析就行。
-
3.在找到了获得返回数据的url之后,可以在火狐浏览器上编辑重发链接,测试数据是否正常
-
4.有个很bug的行为,很多大学(比如中南大学和中国科学技术大学)的网站,获取数据的参数里有个叫pageSize(大概就是指定一次返回多少数据的参数),见图:
通常默认的是15或20这样的数字,表示一页返回15或20条数据,如果改变这个参数,比如直接设定为10000,那就能直接获得所有数据,就不用改变padeIndex发送多次请求了(就是说不用翻页了)
-
5.留意http header里Referer这个参数,它表示请求从哪里传过去的,比如请求B网页的header包含网页A的URL,表示这个B网页必须从A网页跳转过去,如果header里没有这个参数的话,直接爬是爬不了的。
-
6.需要登录的网站爬虫,一般使用cookie就行了,获取cookie的方式有很多,比如使用requests.Session(),但最简单的,用浏览器登录一遍再把cookie直接复制到header里就行了
-
7.有些网站的URL构成看起来莫名其妙,需要花点时间去分析构成,这个时候可能需要一些编码转换,推荐站长转换工具.推荐使用Visual Studio Code来分析复杂的URL,因为它有一个很神奇的功能,见图:
这样很容易发现规律
-
8.不是所有复杂的URL都需要花时间去分析,因为那个参数可能根本就没多大影响,比如清华大学这个的,即使为空也不影响获取数据: