马上要毕业了,也学习了很多知识,是时候要想一下怎么找工作了,顺便看看公司的职位我是否能胜任,如果不能胜任,也能提前知道自己还缺少什么,接着继续努力。那就抓取招聘网站上的信息看一看吧。
今天抓取的招聘网站有四个,分别是猎聘、智联招聘、看准、百度百聘。
目前我的要求是当我输入职位和城市时,将相关的信息存储到MongoDB数据库,作为学习数据分析的基础数据。这里面我最关心的是任职要求,不过现在还没有学习数据分析,只能一个一个看了。
我粗略的查看了这四个网站,智联招聘直接暴露了api,
https://fe-api.zhaopin.com/c/i/sou?pageSize=60&cityId=北京&kt=3&kw=爬虫
cityId是城市的id(网站自己定义的),但我替换为中文的城市名也是可以的,其他三个也是构建相应参数就行。
百度百聘:
http://zhaopin.baidu.com/quanzhi?ie=utf8&oe=utf8&query=爬虫&city_sug=北京
看准(cityCode无法使用城市名):
https://www.kanzhun.com/jobl/p/?q=爬虫&cityCode=1
猎聘(dqs为城市id,无法使用中文城市名,key为职位):
https://www.liepin.com/zhaopin/?dqs=050020&key=爬虫&d_pageSize=40&curPage=0
先拿猎聘开刀,看了一下网站的结构,发现用pyspider的inde_page和detail_page在合适不过了。不过为了更理解pyspider的这种回调函数,我想用requests来实现(不使用循环)。
先贴代码:
import requests
import pyquery
import pymongo
class LiePin(object):
CITYCODES = {
'宁夏': '230','湖南': '180','湖北': '170',
'新疆': '300','海南': '130','深圳': '050090',
'成都': '280020','广州': '050020','天津': '030',
'贵州': '120','浙江': '070', '山东': '250',
'上海': '020','河南': '150','西藏': '290',
'内蒙古': '220','重庆': '040','陕西': '270',
'甘肃': '100','苏州': '060080','大连': '210040',
'安徽': '080','江苏': '060','云南': '310',
'广西': '110','山西': '260','青海': '240',
'杭州': '070020','武汉': '170020','北京': '010',
'辽宁': '210','河北': '140','福建': '090',
'四川': '280','广东': '050','南京': '060020',
'江西': '200','黑龙江': '160','吉林': '190'}
def __init__(self, key, city):
self.key = key
self.city = city
self.session = requests.Session()
self.dbset = pymongo.MongoClient()['zhaopin']['liepin']
self.host = 'https://www.liepin.com'
def crawl(self, url, params=None, callback=None):
if url.startswith('/'):
url = self.host + url
headers = {
'Host':'www.liepin.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36'
}
response = self.session.get(url, params=params, headers=headers)
#print(response)
if response.status_code == 200:
callback(response)
else:
return None
def start(self):
baseurl = 'https://www.liepin.com/zhaopin/'
params = {
'key':self.key,
'dqs':self.CITYCODES.get(self.city),
'd_pageSize':'40',
'curPage':0}
self.crawl(baseurl, params=params, callback=self.index_page)
def index_page(self, response):
html = response.text
doc = pyquery.PyQuery(html)
items = doc.find('.sojob-list .job-info h3 a').items()
for item in items:
url = item.attr.href
#print(url)
self.crawl(url, callback=self.detail_page)
next_page = doc.find('.pagerbar a:contains(下一页)').attr.href
if next_page == 'javascript:;':
return
print(next_page)
self.crawl(next_page, callback=self.index_page)
def detail_page(self, response):
html = response.text
doc = pyquery.PyQuery(html)
job = doc('.title-info h1').text()
company = doc.find('.title-info h3').text()
temp = doc('.job-item-title')
reaction = temp.find('span').text()
if reaction:
temp('span').remove()
salary = temp.text()
city = doc('.basic-infor span').text()
time = doc('.basic-infor time').text()
temp = doc('.job-title-left div').text().split(' ')
edu = doc('.job-title-left div span:first-child').text()
experience = doc('.job-title-left div span:nth-child(2)').text()
age = doc('.job-title-left div span:last-child').text()
url = response.url
describe = '\n'.join(doc('.content.content-word').text().split(' '))
result = {
'url':url,
'job':job, # 工作职位
'salary':salary, # 工资待遇
'city':city, # 所在城市
'edu':edu, # 学历
'experience':experience, # 工作经验
'time':time, # 发布时间
'reaction':reaction, #多长时间回复你
'company':company, # 公司名字
'describe':describe, # 职位描述
'age':age # 年龄约束
}
#print(result)
self.save_result(result)
def save_result(self, result):
self.dbset.insert_one(result)
if __name__ == '__main__':
lp = LiePin('爬虫', '北京')
lp.start()
因为暂时不知道城市id是怎么得到的,并没有在返回的网站中看到所有城市的id,而id短时间内是不会变化的,于是我直接从浏览器复制然后正则提取的。
结构和pyspider有点像,但没有那么复杂,或者说不存在普遍性,只能使用于这个网站,而且没有并发或者并行。有想要学习或者看一下招聘要求的可以自己输入城市和职位。其他几个网站也差不多,可以自己试一下。
看了几页信息,发现不需要工作经验的寥寥无几,就不能对应届毕业生友好一点吗。
我运行的效果如下: