模仿pyspider写招聘网站爬虫

马上要毕业了,也学习了很多知识,是时候要想一下怎么找工作了,顺便看看公司的职位我是否能胜任,如果不能胜任,也能提前知道自己还缺少什么,接着继续努力。那就抓取招聘网站上的信息看一看吧。

今天抓取的招聘网站有四个,分别是猎聘智联招聘看准百度百聘

目前我的要求是当我输入职位和城市时,将相关的信息存储到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有点像,但没有那么复杂,或者说不存在普遍性,只能使用于这个网站,而且没有并发或者并行。有想要学习或者看一下招聘要求的可以自己输入城市和职位。其他几个网站也差不多,可以自己试一下。

看了几页信息,发现不需要工作经验的寥寥无几,就不能对应届毕业生友好一点吗。

我运行的效果如下:
treesoft

猜你喜欢

转载自blog.csdn.net/Qwertyuiop2016/article/details/84308197