from lxml import html
import json

import scrapy
import datetime
import time
import redis
import re
from scrapy_redis.spiders import RedisSpider
from scrapy.conf import settings
from boss.items import BossItem,BossCompanyItem,BossniuItem
from boss.before.before import headers

settings.set('DOWNLOAD_DELAY ',3,557)
settings.set('CONCURRENT_REQUESTS ',1,558)
settings.set('CONCURRENT_REQUESTS_PER_DOMAIN ',1,559)
settings.set('CONCURRENT_REQUESTS_PER_IP ',1,560)

city_list=[101010100,
            101020100,
            101280100,
            101280600,
            101210100,
           ]

job_list=['Java', 'C++', 'PHP', '数据挖掘', 'C', 'C#', '.NET', 'Hadoop', 'Python', 'Delphi', 'VB', 'Perl', 'Ruby', 'Node.js',
          '搜索算法', 'Golang', '自然语言处理', '推荐算法', 'Erlang', '算法工程师', '语音/视频/图形开发', '数据采集', 'HTML5', 'Android',
          'iOS', 'WP', 'web前端', 'Flash', 'JavaScript', 'U3D', 'COCOS2DX', '测试工程师', '自动化测试', '功能测试', '性能测试', '测试开发',
          '移动端测试', '游戏测试', '硬件测试', '软件测试', '运维工程师', '运维开发工程师', '网络工程师', '系统工程师', 'IT技术支持', '系统管理员',
          '网络安全', '系统安全', 'DBA', 'ETL工程师', '数据仓库', '数据开发', '数据挖掘', '数据分析师', '数据架构师', '算法研究员', '项目经理',
          '项目主管', '项目助理', '项目专员', '实施顾问', '实施工程师', '需求分析工程师', '硬件', '嵌入式', '自动化', '单片机', '电路设计',
          '驱动开发', '系统集成', 'FPGA开发', 'DSP开发', 'ARM开发', 'PCB工艺', '模具设计', '热传导', '材料工程师', '精益工程师', '射频工程师',
          'web前端', 'Javascript', 'Flash', 'HTML5', '通信技术工程师', '通信研发工程师', '数据通信工程师', '移动通信工程师', '电信网络工程师',
          '电信交换工程师', '有线传输工程师', '无线射频工程师', '通信电源工程师', '通信标准化工程师', '通信项目专员', '通信项目经理', '核心网工程师',
          '通信测试工程师', '通信设备工程师', '光通信工程师', '光传输工程师', '光网络工程师', '技术经理', '技术总监', '测试经理', '架构师', 'CTO',
          '运维总监', '技术合伙人', '机器学习', '深度学习', '图像算法', '图像处理', '语音识别', '图像识别', '算法研究员', '售前工程师', '售后工程师',
          '其他技术职位', '产品经理', '网页产品经理', '移动产品经理', '产品助理', '数据产品经理', '电商产品经理', '游戏策划', '产品专员', '产品总监',
          '游戏制作人', '产品VP', '其他产品职位', '视觉设计师', '网页设计师', 'Flash设计师', 'APP设计师', 'UI设计师', '平面设计师', '美术设计师（2D/3D）',
          '广告设计师', '多媒体设计师', '原画师', '游戏特效', '游戏界面设计师', '游戏场景', '游戏角色', '游戏动作', '三维/CAD/制图', '美工', '包装设计',
          '设计师助理', '动画设计师', '插画师', '交互设计师', '无线交互设计师', '网页交互设计师', '硬件交互设计师', '数据分析师', '用户研究员', '游戏数值策划',
          'UX设计师', '用户研究经理', '用户研究总监', '设计经理/主管', '设计总监', '视觉设计经理', '视觉设计总监', '交互设计经理/主管', '交互设计总监',
          '服装设计', '工业设计', '橱柜设计', '家具设计', '家居设计', '珠宝设计', '室内设计', '陈列设计', '景观设计', '其他设计职位', '用户运营',
          '产品运营', '数据运营', '内容运营', '活动运营', '商家运营', '品类运营', '游戏运营', '网络推广', '网站运营', '新媒体运营', '社区运营', '微信运营',
          '微博运营', '策略运营', '线下拓展运营', '电商运营', '运营助理/专员', '销售运营', '副主编', '内容编辑', '文案策划', '网站编辑', '记者', '采编',
          '售前咨询', '售后咨询', '网络客服', '客服经理', '客服专员/助理', '客服主管', '客服总监', '电话客服', '咨询热线/呼叫中心客服', '主编', '运营总监',
          'COO', '客服总监', '运营经理/主管', '其他运营职位', '市场营销', '市场策划', '市场顾问', '市场推广', 'SEO', 'SEM', '商务渠道', '商业数据分析',
          '活动策划', '网络营销', '海外市场', '政府关系', '媒介经理', '广告协调', '品牌公关', '媒介专员', '活动策划执行', '媒介策划', '会议活动销售',
          '会议活动策划', '会议活动执行', '会展活动销售', '会展活动策划', '会展活动执行', '广告创意', '美术指导', '广告设计师', '策划经理', '文案', '广告制作',
          '媒介投放', '媒介合作', '媒介顾问', '广告审核', '市场总监', 'CMO', '公关总监', '媒介总监', '创意总监', '其他市场职位', '人力资源主管', '招聘', 'HRBP',
          '人力资源专员/助理', '培训', '薪资福利', '绩效考核', '人力资源经理', '人力资源VP/CHO', '人力资源总监', '员工关系', '组织发展', '行政专员/助理', '前台',
          '行政主管', '经理助理', '后勤', '商务司机', '行政经理', '行政总监', '会计', '出纳', '财务顾问', '结算', '税务', '审计', '风控', '财务经理', 'CFO',
          '财务总监', '财务主管', '法务专员/助理', '律师', '专利', '法律顾问', '法务主管', '法务经理', '法务总监', 'CEO/总裁/总经理', '副总裁/副总经理',
          '事业部负责人', '区域/分公司/代表处负责人', '总裁/总经理/董事长助理', '合伙人', '创始人', '董事会秘书', '其他职能职位', '销售专员', '销售经理',
          '客户代表', '大客户代表', 'BD经理', '商务渠道', '渠道销售', '代理商销售', '销售助理', '电话销售', '销售顾问', '商品经理', '广告销售', '网络营销',
          '营销主管', '销售总监', '商务总监', '区域总监', '城市经理', '销售VP', '团队经理', '其他销售职位', '记者', '编辑', '采编', '撰稿人', '出版发行',
          '校对录入', '总编', '自媒体', '媒介经理', '媒介专员', '广告协调', '品牌公关', '活动策划执行', '媒介策划', '会议活动销售', '会议活动策划', '会议活动执行',
          '会展活动销售', '会展活动策划', '会展活动执行', '广告创意', '美术指导', '广告设计师', '策划经理', '文案', '广告制作', '媒介投放', '媒介合作', '媒介顾问',
          '广告审核', '助理', '统筹制片人', '执行制片人', '导演/编导', '摄影/影像师', '视频编辑', '音频编辑', '经纪人', '后期制作', '影视制作', '影视发行', '影视策划',
          '主持人/主播/DJ', '演员/配音/模特', '化妆/造型/服装', '放映管理', '录音/音效', '制片人', '编剧', '其他传媒职位', '投资经理', '行业研究', '资产管理', '投资总监',
          '投资VP', '投资合伙人', '融资', '并购', '投后管理', '投资助理', '其他投融资职位', '投资顾问', '风控', '律师', '资信评估', '合规稽查', '审计', '法务', '会计',
          '清算', '信用卡销售', '分析师', '柜员', '商务渠道', '大堂经理', '理财顾问', '客户经理', '信贷管理', '风控', '金融产品经理', '风控', '催收员', '分析师', '投资经理',
          '交易员', '理财顾问', '合规稽查', '审计', '清算', '保险业务', '精算师', '保险理赔', '其他金融职位', '汽车设计', '车身设计', '底盘设计', '机械设计', '动力系统设计',
          '电子工程设计', '零部件设计', '汽车工程项目管理', '内外饰设计工程师', '质量工程师', '汽车销售', '汽车配件销售', '汽车售后服务', '汽车维修', '汽车美容', '汽车定损理赔',
          '二手车评估师', '4S店管理', '汽车改装工程师', '总装工程师', '焊接工程师', '冲压工程师', '其他汽车职位', '课程设计', '课程编辑', '教师', '培训研究', '培训师', '培训策划',
          '其他教育产品研发职位', '校长', '教务管理', '教学管理', '班主任/辅导员', '教师', '助教', '高中教师', '初中教师', '小学教师', '幼教', '理科教师', '文科教师', '外语教师',
          '音乐教师', '美术教师', '体育教师', '就业老师', 'JAVA培训讲师', 'Android培训讲师', 'ios培训讲师', 'PHP培训讲师', '.NET培训讲师', 'C++培训讲师', 'Unity 3D培训讲师',
          'Web前端培训讲师', '软件测试培训讲师', '动漫培训讲师', 'UI设计培训讲师', '财会培训讲师', 'HR培训讲师', '培训师', '拓展培训', '课程顾问', '招生顾问', '留学顾问', '舞蹈教练',
          '瑜伽教练', '瘦身顾问', '游泳教练', '健身教练', '篮球/羽毛球教练', '跆拳道教练', '其他教育培训职位', '医生助理', '医学影像', 'B超医生', '医学编辑', '药学编辑', '医师', '药剂师',
          '医疗器械研究', '医学总监', '医药研发', '验光师', '放射科医师', '检验科医师', '其他医疗技术职位', '护士/护理', '医师', '中医', '心理医生', '牙科医生', '康复治疗师', '营养师',
          '整形师', '理疗师', '针灸推拿', '美容师/顾问', '医学总监', '医药代表', '导医', '健康顾问', '医美咨询', '瑜伽教练', '瘦身顾问', '游泳教练', '美体教练', '舞蹈教练', '健身教练',
          '其他医疗健康类职位', '采购总监', '采购经理', '采购专员', '买手', '采购工程师', '采购主管', '采购助理', '外贸经理', '外贸专员', '外贸业务员', '贸易跟单', '其他采购/贸易类职位',
          '供应链专员', '供应链经理', '物流专员', '物流经理', '物流运营', '物流跟单', '贸易跟单', '物仓调度', '物仓项目', '运输经理/主管', '货运代理专员', '货运代理经理', '水/空/陆运操作',
          '报关员', '报检员', '核销员', '单证员', '仓储物料经理', '仓储物料专员', '仓储物料项目', '仓储管理', '仓库文员', '配/理/拣/发货', '货运司机', '集装箱管理', '配送', '快递',
          '供应链总监', '物流总监', '其他供应链职位', '房产策划', '地产项目管理', '地产招投标', '高级建筑工程师', '建筑工程师', '建筑设计师', '土木/土建/结构工程师', '室内设计', '园林设计',
          '城市规划设计', '工程监理', '工程造价', '预结算', '工程资料管理', '建筑施工现场管理', '地产置业顾问', '地产评估', '地产中介', '物业管理', '物业租赁销售 ', '物业招商管理',
          '地产项目总监', '地产策划总监', '地产招投标总监', '物业总监', '房地产销售总监', '其他房地产职位', '企业管理咨询', '数据分析师', '财务咨询顾问', 'IT咨询顾问', '人力资源顾问',
          '咨询项目管理', '战略咨询', '猎头顾问', '市场调研', '其他咨询顾问', '事务所律师', '公司法务', '英语翻译', '日语翻译', '韩语/朝鲜语翻译', '法语翻译', '德语翻译', '俄语翻译',
          '西班牙语翻译', '其他语种翻译', '咨询总监', '咨询经理', '高级翻译', '同声传译  ', '其他咨询/翻译类职位', '实习生', '管理培训生', '储备干部', '其他实习/培训/储备职位', '计调',
          '签证', '旅游顾问', '导游', '预定票务', '旅游产品经理', '旅游策划师', '其他旅游职位', '收银', '酒店前台', '客房服务员', '收银', '服务员', '厨师', '咖啡师', '送餐员', '收银',
          '导购', '店员/营业员', '其他酒店/餐饮/零售职位', '其他职位']

class StockSpider(scrapy.Spider):
    name = "niuspider"
    domain ='https://www.zhipin.com/'
    cookie={'__c':'1499399875',
            '__g':'-',
            'lastCity':'101010100',
            'JSESSIONID':'',
            't':'lGfv4ZXN9hMtm4ks',
            'wt':'lGfv4ZXN9hMtm4ks',
            '__l':'r=&l=%2Fc101010100-p170101%2Fs_301-y_2-t_801%2F%3Fpage%3D2%26ka%3Dpage-2',
            '__a':'36808995.1499399875..1499399875.25.1.25.25',
            'Hm_lvt_194df3105ad7148dcf2b98a91b5e727a':'1499399876',
            'Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a':'1499664630',}
    def start_requests(self):
        for city in city_list:
            for keywords in job_list:
                page=1
                url, head = headers(page, city, keywords)

                yield scrapy.Request(url,headers=head,
                                     cookies=self.cookie,
                                     callback=self.parse,dont_filter=True,meta={'city': city,
                                                                                'page':page,
                                                                                'keywords':keywords,
                                                                                },)
    def parse(self, response):
        city = response.meta['city']
        page = response.meta['page']
        keywords = response.meta['keywords']
        res_dict = json.loads(response.text)
        try:
            s = res_dict['htmlList'].replace('\n', '')
            response = html.fromstring(s)
            ele_info_list = response.xpath('//li')
            for li in ele_info_list:
                item = BossniuItem()
                s={}
                s['url']=self.domain+li.xpath('./a/@href')[0]
                s['ka']=li.xpath('./a/@ka')[0]
                s['suid']=li.xpath('./a/@data-suid')[0]
                s['eid']=li.xpath('./a/@data-eid')[0]
                s['jid']=li.xpath('./a/@data-jid')[0]
                s['expect_id']=li.xpath('./a/@data-expect')[0]
                s['lid']=li.xpath('./a/@data-lid')[0]
                s['title']='|'.join(li.xpath('.//div[@class="info-labels"]/span/text()'))
                s['price']=li.xpath('.//span[@class="badge-salary"]/text()')[0]
                s['expect_job']='|'.join(li.xpath('.//div[@class="text"]//em[@class="h"]/text()'))
                s['current_job']='|'.join(li.xpath('.//div[@class="text"]/p[2]/text()'))
                s['school']=li.xpath('.//div[@class="text"]/p[3]/text()')[0]
                item['detail'] = s

                yield item
        except Exception as e:
            return
            # time.sleep(20)
            # page -= 1
            # print(e,'login error')
        time.sleep(15)
        print(page,'page++++++++++++++++++++++++++++++')
        page+=1
        url, head = headers(page, city, keywords)
        yield scrapy.Request(url, headers=head,
                             cookies=self.cookie,
                             callback=self.parse, dont_filter=True, meta={'city': city,
                                                                          'page': page,
                                                                          'keywords': keywords,
                                                                          }, )



