├── logs ├── myapp.log ├── myapp_h02.log ├── myapp_h03.log └── stars_url_error.log ├── auto.sh ├── jobs_analysis.db ├── conf ├── app.conf └── logger.conf ├── README.md ├── .gitignore ├── auto_vote.py ├── main.py ├── LICENSE └── jobs.txt /logs/myapp.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logs/myapp_h02.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logs/myapp_h03.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logs/stars_url_error.log: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /auto.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd /soft/python/python_spider_jobs/ 3 | python3 main.py -------------------------------------------------------------------------------- /jobs_analysis.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tim9Liu9/python_spider_jobs/HEAD/jobs_analysis.db -------------------------------------------------------------------------------- /conf/app.conf: -------------------------------------------------------------------------------- 1 | [ini] 2 | save_date_51job.com = 2017-06-07 3 | save_date_zhaopin.com = 2017-06-07 4 | 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # python_spider_jobs 2 | 已经在python3.4、python3.5、python3.6测试通过 , 技术栈:urllib+BeautifulSoup4+SQLite,用到的py库:beautifulsoup4、configparser,以后增加图表显示的功能 3 | python写的爬虫,爬取51job前程无忧、智联招聘的大城市(北京、上海、深圳、广州、杭州、成都、武汉、长沙、珠海)各种编程语言职位的总条数。 4 | 目前的岗位有:人工智能, 大数据, java, 前端, Android, iOS, python, php, go语言、node.js、区块链、c++、c#、产品经理。 5 | 爬取后分别保存到sqlite数据库与txt文本文件中。sqlite数据库一天只保存一次。但jobs.txt一天可以写入多次爬取的记录。 6 | -------------------------------------------------------------------------------- /conf/logger.conf: -------------------------------------------------------------------------------- 1 | #logger.conf 2 | 3 | ############################################### 4 | 5 | [loggers] 6 | keys=root,INFO,example02 7 | 8 | [logger_root] 9 | level=DEBUG 10 | handlers=hand01,hand02 11 | 12 | [logger_INFO] 13 | handlers=hand01,hand02 14 | qualname=INFO 15 | propagate=0 16 | 17 | [logger_example02] 18 | handlers=hand01,hand03 19 | qualname=example02 20 | propagate=0 21 | 22 | ############################################### 23 | 24 | [handlers] 25 | keys=hand01,hand02,hand03 26 | 27 | [handler_hand01] 28 | class=StreamHandler 29 | level=INFO 30 | formatter=form02 31 | args=(sys.stderr,) 32 | 33 | [handler_hand02] 34 | class=FileHandler 35 | level=DEBUG 36 | formatter=form01 37 | args=('logs\myapp.log', 'a') 38 | 39 | [handler_hand03] 40 | class=handlers.RotatingFileHandler 41 | level=INFO 42 | formatter=form02 43 | args=('logs\myapp.log', 'a', 10*1024*1024, 5) 44 | 45 | ############################################### 46 | 47 | [formatters] 48 | keys=form01,form02 49 | 50 | [formatter_form01] 51 | format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s 52 | #datefmt=%a, %d %b %Y %H:%M:%S 53 | datefmt=%Y-%m-%d %H:%M:%S 54 | 55 | [formatter_form02] 56 | format=%(name)-12s: %(levelname)-8s %(message)s 57 | datefmt= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | #*.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | env/ 85 | 86 | # Spyder project settings 87 | .spyderproject 88 | 89 | # Rope project settings 90 | .ropeproject 91 | 92 | .idea 93 | .iml 94 | *.pyc 95 | test*.py 96 | test.py 97 | test2.py 98 | test3.py -------------------------------------------------------------------------------- /auto_vote.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding=utf-8 3 | __author__ = 'Tim Liu' 4 | __date__ = '2017/6/17 13:50' 5 | 6 | import random 7 | import urllib 8 | import time 9 | from urllib.request import Request, urlopen 10 | 11 | # 刷票 : 第三届中国外语微课大赛 12 | def auto_vote(url_temp): 13 | 14 | random_decimal = random.random() 15 | url = url_temp.format(random=random_decimal) 16 | print(url); 17 | headers_list = ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", 18 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36", 19 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", 20 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36", 21 | "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36", 22 | "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", 23 | "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36", 24 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36", 25 | 26 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1", 27 | "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0", 28 | "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko", 29 | "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko", 30 | 31 | "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0", 32 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)", 33 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)", 34 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)", 35 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", 36 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)", 37 | "Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)", 38 | "Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)", 39 | "Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)", 40 | "Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)"] 41 | 42 | i = random.randint(0, len(headers_list) -1) 43 | print("headers_lis.len=", len(headers_list)) 44 | print("i=", i) 45 | headers = { 'User-Agent' : headers_list[i] } 46 | sleeptimes = random.uniform(1, 10) 47 | print("sleeptimes=", sleeptimes) 48 | time.sleep(sleeptimes) 49 | req = urllib.request.Request(url, None, headers) 50 | try: 51 | # urllib2.urlopen("http://example.com", timeout = 1) 52 | urlopen_content = urlopen(req, timeout=30) 53 | except urllib.error.HTTPError as e: 54 | print(e.code) 55 | print(e.read().decode("utf8")) 56 | 57 | html = urlopen_content.read().decode('gbk') # 读取源代码并转为gbk 58 | print("html=", html) 59 | urlopen_content.close() 60 | 61 | # http://weike.cflo.com.cn/play.asp?vodid=174906&e=5&from=groupmessage 62 | if __name__ == '__main__': 63 | vote_nums = 9 64 | 65 | for i in range(0,vote_nums): 66 | # 欢迎您投票支持 67 | auto_vote( "http://weike.cflo.com.cn/js_support.asp?vodid=174906_5&xiangmu=5&nxxx={random}") 68 | # 已采用 69 | auto_vote( "http://weike.cflo.com.cn/js_useradopt.asp?vodid=174906&xiangmu=5&nzz={random}") 70 | print("总共刷票成功数:", vote_nums) 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding=utf-8 3 | # python3.5 4 | __author__ = 'Tim Liu' 5 | __date__ = '2017/5/5 17:52' 6 | 7 | 8 | import time 9 | from datetime import datetime,timezone,timedelta 10 | 11 | import urllib 12 | from urllib.request import Request, urlopen 13 | # import urllib.request 14 | from urllib.error import URLError, HTTPError,ContentTooShortError 15 | 16 | 17 | 18 | 19 | import bs4 20 | from bs4 import BeautifulSoup 21 | 22 | import re 23 | import codecs 24 | 25 | import logging 26 | import logging.config 27 | 28 | import os 29 | import sqlite3 30 | import configparser 31 | 32 | 33 | def get_east8_date_str(format_long=True): 34 | """ 35 | 获取东八区的当前时间:上海时间 36 | :param format_long: 是否是长格式:默认是长格式 2017-05-08 03:32:49 ,短格式:2017-05-08 37 | :return: 字符串格式的日期时间 38 | """ 39 | dt = datetime.utcnow() 40 | dt = dt.replace(tzinfo=timezone.utc) 41 | if format_long: 42 | return dt.astimezone(timezone(timedelta(hours=8))).strftime("%Y-%m-%d %H:%M:%S") 43 | else: 44 | return dt.astimezone(timezone(timedelta(hours=8))).strftime("%Y-%m-%d") 45 | 46 | #获取51job.com 的html页面 47 | def get_51job_html(jobearea, keyword): 48 | url_temp = "http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea={jobarea}&keyword={keyword}&keywordtype=2&lang=c&stype=2&postchannel=0000&fromType=1&confirmdate=9" 49 | url = url_temp.format(jobarea=jobearea,keyword=urllib.request.quote(keyword)) 50 | print("url={}".format(url)) 51 | headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36' } 52 | 53 | time.sleep(2) 54 | 55 | req = urllib.request.Request(url, None, headers) 56 | urlopen_content = urlopen(req) 57 | # urlopen_content = urllib.request.urlopen(url) # 打开网址 58 | html = urlopen_content.read() # 读取源代码并转为gbk 59 | urlopen_content.close() 60 | if html: 61 | return html.decode('gbk') 62 | else: 63 | return "" 64 | 65 | # 解析51job.com 页面的 66 | def parse_51job_html_job_nums(html): 67 | if not html: 68 | return 0 69 | soup = BeautifulSoup(html, "html.parser") 70 | #
71 | # //*[@id="resultList"]/div[1]/div[3] 72 | #div1 = soup.find_all(id='resultList') 73 | 74 | # class 是python的关键字,记得加下划线, 75 | # 第3个div:
共3818条职位
76 | div_childrens = soup.find_all("div", class_="dw_tlc")[0].children 77 | 78 | # div_childrens 是list_iterator 迭代器 类型 79 | job_nums = 0 80 | # 取出:
共7618条职位
里面的数字:7618 81 | for child in div_childrens: 82 | # child有两种类型: 83 | if isinstance(child, bs4.element.Tag): 84 | # 还有:['rt', 'order_time'] 、 ['rt', 'order_auto', 'dw_c_orange']、['chall'] 85 | if child['class'] == ['rt']: 86 | # ['rt']有2个有,一个child.string等于“共7618条职位”,一个child.string为None 87 | if child.string: 88 | # 用正则先去掉空格这些字符 89 | compile_re = re.compile('\s*') 90 | str = compile_re.sub('',child.string) 91 | #logger.info("======b===", str) 92 | # 用正则取出数字 93 | match_re = re.match(r".*?(\d+).*", str) 94 | if match_re: 95 | job_nums = int(match_re.group(1)) 96 | break 97 | 98 | #logger.info("51job_nums=", job_nums) 99 | return job_nums 100 | 101 | #获取 智联招聘:zhaopin.com 的html页面 102 | def get_zhaopin_html(jobarea_name, job_type): 103 | url_temp = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl={jobarea_name}&kw={job_type}&sm=0&p=1&source=1" 104 | url = url_temp.format(jobarea_name=urllib.request.quote(jobarea_name),job_type=urllib.request.quote(job_type)) 105 | headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36' } 106 | 107 | 108 | logger.warning("-------->15-->02") 109 | try: 110 | time.sleep(2) 111 | req = urllib.request.Request(url, None, headers) 112 | response = urlopen(req) 113 | # response = urllib.request.urlopen(url) # 打开网址 114 | 115 | except HTTPError as e1: 116 | print("The (www.python.org)server couldn't fulfill the request.") 117 | logger.error('-------->15-->02->HTTPError-> %s' % ( e1.msg)) 118 | except URLError as e2: 119 | print('We failed to reach a server.') 120 | logger.error('-------->15-->03->URLError->%s' % (e2.msg)) 121 | except ContentTooShortError as e3: 122 | print('Reason: ', e3.reason) 123 | logger.error('-------->15-->04->ContentTooShortError-> %s' % (e3.msg)) 124 | else: 125 | html = "" 126 | logger.warning("-------->15-->05") 127 | try: 128 | if response: 129 | logger.warning("-------->15-->05-->01a") 130 | html = response.read() # 读取源代码并转为unicode 131 | logger.warning("-------->15-->05-->01b") 132 | else: 133 | logger.warning("-------->15-->05-->02") 134 | except Exception as e4: 135 | logger.error('-------->15-->06->URLError->%s' % (str(e4))) 136 | finally: 137 | logger.warning("-------->15-->07-->finally") 138 | response.close() 139 | 140 | logger.warning("-------->15-->08") 141 | 142 | 143 | if html: 144 | return html.decode('UTF-8') 145 | else: 146 | logger.error("-------->15-->09-> html is None") 147 | 148 | return "" 149 | 150 | 151 | # 解析 智联招聘:zhaopin.com 页面的, css选择器 152 | def parse_zhaopin_html_job_nums(html): 153 | if not html: 154 | return 0 155 | soup = BeautifulSoup(html, "html.parser") 156 | # 5631个职位满足条件 157 | # 使用css解析器 158 | em = soup.select("span.search_yx_tj > em" ) 159 | #logger.info(u"zhipin_job_nums=", em[0].string) 160 | return int(em[0].string) 161 | 162 | 163 | 164 | 165 | def save_sqlite(published_time,jobarea_name, job_nums, job_type, job_site ): 166 | """ 167 | 把爬取的数据写入sqlite数据库 168 | :param published_time: 职位爬取的时间 169 | :param jobarea_name: 职位的城市名称 170 | :param job_nums: 职位的个数 171 | :param job_type: 职位的类型:大数据 、 java、php、python、 android、iOS 172 | :param job_site: 搜索到的网站:前程无忧: 51job.com , 智联招聘:zhaopin.com 173 | :return: 174 | """ 175 | dbPath = '%s/jobs_analysis.db' % os.getcwd() 176 | #logger.info(dbPath) 177 | con = sqlite3.connect(dbPath) 178 | cur = con.cursor() 179 | # 如果表不存在就新建表 180 | cur.execute('CREATE TABLE IF NOT EXISTS jobs_tb (id integer NOT NULL PRIMARY KEY AUTOINCREMENT DEFAULT 0,published_time Varchar(20) DEFAULT "",jobarea_name Varchar(20) DEFAULT "",job_nums int DEFAULT 0, job_type Varchar(20) DEFAULT "", job_site Varchar(50) DEFAULT "", job_mark Varchar(255) DEFAULT "" )') 181 | con.commit() 182 | 183 | # r 表示不转义,保留原始字符 184 | sqlStr = r'INSERT INTO jobs_tb (id,published_time, jobarea_name, job_nums, job_type, job_site) VALUES(NULL, "%s", "%s", "%d", "%s", "%s")' % (published_time, jobarea_name, job_nums , job_type, job_site) 185 | #logger.info(sqlStr) 186 | cur.execute(sqlStr) 187 | con.commit() 188 | 189 | # 关闭数据库 190 | con.close() 191 | 192 | 193 | def is_need_save_db(current_date, job_site): 194 | """ 195 | 是否需要保存到数据库,保证数据一天最多只保存一次 196 | :param current_date: 当前日期:"2017-05-06" 197 | :param job_site: 那个站点:前程无忧: 51job.com , 智联招聘:zhaopin.com 198 | :return: 是否已经保存过 199 | """ 200 | cp = configparser.ConfigParser() 201 | appconf_path = '%s/conf/app.conf' % os.getcwd() 202 | with codecs.open(appconf_path, 'rb', encoding='utf-8') as f: 203 | cp.read_file(f) 204 | saved_date = cp.get('ini', 'save_date_'+ job_site) 205 | if current_date > saved_date: 206 | cp.set('ini', 'save_date_'+ job_site, current_date) 207 | with codecs.open(appconf_path, 'w', encoding='utf-8') as f: 208 | cp.write(f) 209 | return True 210 | else: 211 | return False 212 | 213 | def spider_jobs(is_need_save=False, job_site="51job.com", job_type = 'python', jobarea_names=[], jobarea_codes=[]): 214 | jobs_txt_path = '%s/jobs.txt' % os.getcwd() 215 | file = codecs.open(jobs_txt_path, "a", "utf-8") 216 | file.write(u"----------------- " + job_type + " -----------------\n") 217 | 218 | 219 | for j in range(len(jobarea_names)): 220 | # 日期时间 221 | time_str = get_east8_date_str(True) 222 | #time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 223 | # 工作地名 224 | jobarea_name = jobarea_names[j] 225 | 226 | if job_site == "51job.com": 227 | html = get_51job_html(jobarea_codes[j], job_type) 228 | # 工作的职位数 229 | job_nums = parse_51job_html_job_nums(html) 230 | job_nums_str = u"共" + str(job_nums) + u"条职位" 231 | elif job_site == "zhaopin.com": 232 | logger.debug("-------->15") 233 | html = get_zhaopin_html(jobarea_name, job_type) 234 | logger.debug ("-------->16") 235 | # 工作的职位数 236 | job_nums = parse_zhaopin_html_job_nums(html) 237 | # 说明报异常了,不用保存及显示 238 | if job_nums == 0: 239 | continue 240 | logger.debug ("-------->17") 241 | job_nums_str = u"共" + str(job_nums) + u"条职位" 242 | 243 | 244 | 245 | 246 | if is_need_save: 247 | logger.info(u"--->Now is saving! job_nums=%d" % job_nums) 248 | # 数据保存到sqlite数据库 249 | save_sqlite(time_str, jobarea_name, job_nums, job_type, job_site) 250 | else: 251 | # 已经保存过sqlite数据库了,就不保存了 252 | logger.info(u"--->Today was saved! job_nums=%d" % job_nums) 253 | 254 | 255 | 256 | # 数据保存到txt文本文件中 257 | file.write(u"{0}\t{1}\t{2} \n".format(time_str, jobarea_name , job_nums_str )) 258 | 259 | 260 | 261 | file.close() 262 | 263 | def search_jobs(job_sites, keywords, jobarea_names, jobarea_codes ): 264 | for job_site in job_sites: 265 | jobs_txt_path = '%s/jobs.txt' % os.getcwd() 266 | file = codecs.open(jobs_txt_path, "a", "utf-8") 267 | file.write(u"================= " + job_site + " =================\n") 268 | file.close() 269 | 270 | # 判断sqlite数据库是否要保存今天的记录 271 | current_date = get_east8_date_str(False) 272 | #current_date = time.strftime('%Y-%m-%d', time.localtime(time.time())) 273 | 274 | is_need_save = is_need_save_db(current_date, job_site) 275 | 276 | for i in range(len(keywords)): 277 | spider_jobs(is_need_save, job_site, keywords[i], jobarea_names,jobarea_codes ) 278 | 279 | 280 | if __name__ == '__main__': 281 | # 日志文件:myapp.log,并且在屏幕上输出info级别的log 282 | logging.config.fileConfig("conf/logger.conf") 283 | logger = logging.getLogger("INFO") 284 | # 前程无忧: 51job.com , 智联招聘:zhaopin.com 285 | # job_sites = ["51job.com", "zhaopin.com"] 286 | job_sites = ["51job.com"] 287 | 288 | # 机器学习、数据挖掘 、深度学习、架构师 289 | keywords = [u"人工智能", u"大数据","java",u"前端", u"Android", u"iOS", u"python", u"php", u"golang", u"区块链", u"node", u"c++", u"c#", u"产品经理"] 290 | 291 | # 51job用:北京 : jobarea=010000, 292 | jobarea_names = [u"北京", u"上海", u"深圳", u"广州", u"杭州", u"成都", u"武汉", u"长沙", u"珠海"] 293 | jobarea_codes = ["010000", "020000", "040000", "030200", "080200", "090200", "180200", "190200", "030500"] 294 | 295 | logger.info(u"============>bengin...") 296 | search_jobs(job_sites, keywords, jobarea_names, jobarea_codes ); 297 | logger.info(u"============>end!") 298 | 299 | 300 | 301 | 302 | 303 | 304 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /jobs.txt: -------------------------------------------------------------------------------- 1 | ================= 51job.com ================= 2 | ----------------- 人工智能 ----------------- 3 | 2017-05-09 13:47:25 北京 共938条职位 4 | 2017-05-09 13:47:26 上海 共602条职位 5 | 2017-05-09 13:47:28 深圳 共522条职位 6 | 2017-05-09 13:47:30 广州 共303条职位 7 | 2017-05-09 13:47:32 杭州 共275条职位 8 | ----------------- 大数据 ----------------- 9 | 2017-05-09 13:47:33 北京 共7600条职位 10 | 2017-05-09 13:47:34 上海 共6136条职位 11 | 2017-05-09 13:47:35 深圳 共3812条职位 12 | 2017-05-09 13:47:36 广州 共3215条职位 13 | 2017-05-09 13:47:37 杭州 共2432条职位 14 | ----------------- java ----------------- 15 | 2017-05-09 13:47:38 北京 共19765条职位 16 | 2017-05-09 13:47:40 上海 共26301条职位 17 | 2017-05-09 13:47:41 深圳 共14815条职位 18 | 2017-05-09 13:47:42 广州 共10726条职位 19 | 2017-05-09 13:47:43 杭州 共7886条职位 20 | ----------------- 前端 ----------------- 21 | 2017-05-09 13:47:44 北京 共8788条职位 22 | 2017-05-09 13:47:45 上海 共13271条职位 23 | 2017-05-09 13:47:47 深圳 共8039条职位 24 | 2017-05-09 13:47:48 广州 共6547条职位 25 | 2017-05-09 13:47:49 杭州 共4200条职位 26 | ----------------- Android ----------------- 27 | 2017-05-09 13:47:50 北京 共5003条职位 28 | 2017-05-09 13:47:51 上海 共9220条职位 29 | 2017-05-09 13:47:52 深圳 共5819条职位 30 | 2017-05-09 13:47:53 广州 共3008条职位 31 | 2017-05-09 13:47:55 杭州 共2203条职位 32 | ----------------- iOS ----------------- 33 | 2017-05-09 13:47:56 北京 共3439条职位 34 | 2017-05-09 13:47:57 上海 共5173条职位 35 | 2017-05-09 13:47:58 深圳 共3521条职位 36 | 2017-05-09 13:48:00 广州 共2365条职位 37 | 2017-05-09 13:48:01 杭州 共1649条职位 38 | ----------------- python ----------------- 39 | 2017-05-09 13:48:02 北京 共5643条职位 40 | 2017-05-09 13:48:03 上海 共6371条职位 41 | 2017-05-09 13:48:04 深圳 共3256条职位 42 | 2017-05-09 13:48:06 广州 共1967条职位 43 | 2017-05-09 13:48:07 杭州 共1863条职位 44 | ----------------- php ----------------- 45 | 2017-05-09 13:48:08 北京 共4855条职位 46 | 2017-05-09 13:48:09 上海 共8566条职位 47 | 2017-05-09 13:48:10 深圳 共5051条职位 48 | 2017-05-09 13:48:11 广州 共3548条职位 49 | 2017-05-09 13:48:12 杭州 共2013条职位 50 | ----------------- golang ----------------- 51 | 2017-05-09 13:48:13 北京 共136条职位 52 | 2017-05-09 13:48:15 上海 共205条职位 53 | 2017-05-09 13:48:16 深圳 共107条职位 54 | 2017-05-09 13:48:17 广州 共51条职位 55 | 2017-05-09 13:48:18 杭州 共48条职位 56 | ================= zhaopin.com ================= 57 | ----------------- 人工智能 ----------------- 58 | 2017-05-09 13:48:19 北京 共639条职位 59 | 2017-05-09 13:48:22 上海 共161条职位 60 | 2017-05-09 13:48:25 深圳 共212条职位 61 | 2017-05-09 13:48:28 广州 共86条职位 62 | 2017-05-09 13:48:34 杭州 共68条职位 63 | ----------------- 大数据 ----------------- 64 | 2017-05-09 13:48:37 北京 共5090条职位 65 | 2017-05-09 13:48:40 上海 共1819条职位 66 | 2017-05-09 13:48:42 深圳 共1390条职位 67 | 2017-05-09 13:48:45 广州 共716条职位 68 | 2017-05-09 13:48:48 杭州 共732条职位 69 | ----------------- java ----------------- 70 | 2017-05-09 13:48:51 北京 共12135条职位 71 | 2017-05-09 13:48:54 上海 共5130条职位 72 | 2017-05-09 13:48:57 深圳 共2929条职位 73 | 2017-05-09 13:49:00 广州 共1693条职位 74 | 2017-05-09 13:49:03 杭州 共1705条职位 75 | ----------------- 前端 ----------------- 76 | 2017-05-09 13:49:06 北京 共5098条职位 77 | 2017-05-09 13:49:09 上海 共2266条职位 78 | 2017-05-09 13:49:12 深圳 共1323条职位 79 | 2017-05-09 13:49:15 广州 共711条职位 80 | 2017-05-09 13:49:18 杭州 共710条职位 81 | ----------------- Android ----------------- 82 | 2017-05-09 13:49:21 北京 共3155条职位 83 | 2017-05-09 13:49:24 上海 共1266条职位 84 | 2017-05-09 13:49:26 深圳 共1037条职位 85 | 2017-05-09 13:49:29 广州 共444条职位 86 | 2017-05-09 13:49:32 杭州 共431条职位 87 | ----------------- iOS ----------------- 88 | 2017-05-09 13:49:35 北京 共2931条职位 89 | 2017-05-09 13:49:38 上海 共995条职位 90 | 2017-05-09 13:49:41 深圳 共691条职位 91 | 2017-05-09 13:49:44 广州 共386条职位 92 | 2017-05-09 13:49:48 杭州 共365条职位 93 | ----------------- python ----------------- 94 | 2017-05-09 13:49:50 北京 共4274条职位 95 | 2017-05-09 13:49:53 上海 共1822条职位 96 | 2017-05-09 13:49:56 深圳 共1029条职位 97 | 2017-05-09 13:49:59 广州 共432条职位 98 | 2017-05-09 13:50:03 杭州 共500条职位 99 | ----------------- php ----------------- 100 | 2017-05-09 13:50:06 北京 共2416条职位 101 | 2017-05-09 13:50:09 上海 共1076条职位 102 | 2017-05-09 13:50:12 深圳 共1062条职位 103 | 2017-05-09 13:50:16 广州 共434条职位 104 | 2017-05-09 13:50:18 杭州 共430条职位 105 | ----------------- golang ----------------- 106 | 2017-05-09 13:50:21 北京 共169条职位 107 | 2017-05-09 13:50:24 上海 共62条职位 108 | 2017-05-09 13:50:27 深圳 共27条职位 109 | 2017-05-09 13:50:29 广州 共14条职位 110 | 2017-05-09 13:50:32 杭州 共20条职位 111 | 112 | ================= 51job.com ================= 113 | ----------------- 人工智能 ----------------- 114 | 2017-05-10 15:26:04 北京 共949条职位 115 | 2017-05-10 15:26:05 上海 共601条职位 116 | 2017-05-10 15:26:06 深圳 共523条职位 117 | 2017-05-10 15:26:08 广州 共304条职位 118 | 2017-05-10 15:26:09 杭州 共290条职位 119 | ----------------- 大数据 ----------------- 120 | 2017-05-10 15:26:11 北京 共7622条职位 121 | 2017-05-10 15:26:13 上海 共6134条职位 122 | 2017-05-10 15:26:15 深圳 共3811条职位 123 | 2017-05-10 15:26:16 广州 共3243条职位 124 | 2017-05-10 15:26:17 杭州 共2477条职位 125 | ----------------- java ----------------- 126 | 2017-05-10 15:26:17 北京 共19852条职位 127 | 2017-05-10 15:26:18 上海 共26266条职位 128 | 2017-05-10 15:26:19 深圳 共14945条职位 129 | 2017-05-10 15:26:20 广州 共10801条职位 130 | 2017-05-10 15:26:21 杭州 共8049条职位 131 | ----------------- 前端 ----------------- 132 | 2017-05-10 15:26:22 北京 共8805条职位 133 | 2017-05-10 15:26:24 上海 共13217条职位 134 | 2017-05-10 15:26:24 深圳 共8071条职位 135 | 2017-05-10 15:26:25 广州 共6593条职位 136 | 2017-05-10 15:26:25 杭州 共4245条职位 137 | ----------------- Android ----------------- 138 | 2017-05-10 15:26:26 北京 共5004条职位 139 | 2017-05-10 15:26:28 上海 共9232条职位 140 | 2017-05-10 15:26:29 深圳 共5863条职位 141 | 2017-05-10 15:26:29 广州 共3017条职位 142 | 2017-05-10 15:26:34 杭州 共2239条职位 143 | ----------------- iOS ----------------- 144 | 2017-05-10 15:26:35 北京 共3435条职位 145 | 2017-05-10 15:26:35 上海 共5192条职位 146 | 2017-05-10 15:26:36 深圳 共3546条职位 147 | 2017-05-10 15:26:37 广州 共2370条职位 148 | 2017-05-10 15:26:38 杭州 共1683条职位 149 | ----------------- python ----------------- 150 | 2017-05-10 15:26:39 北京 共5664条职位 151 | 2017-05-10 15:26:40 上海 共6420条职位 152 | 2017-05-10 15:26:41 深圳 共3270条职位 153 | 2017-05-10 15:26:42 广州 共2005条职位 154 | 2017-05-10 15:26:43 杭州 共1948条职位 155 | ----------------- php ----------------- 156 | 2017-05-10 15:26:44 北京 共4861条职位 157 | 2017-05-10 15:26:46 上海 共8453条职位 158 | 2017-05-10 15:26:47 深圳 共5076条职位 159 | 2017-05-10 15:26:48 广州 共3569条职位 160 | 2017-05-10 15:26:50 杭州 共2024条职位 161 | ----------------- golang ----------------- 162 | 2017-05-10 15:26:52 北京 共136条职位 163 | 2017-05-10 15:26:52 上海 共206条职位 164 | 2017-05-10 15:26:53 深圳 共108条职位 165 | 2017-05-10 15:26:54 广州 共53条职位 166 | 2017-05-10 15:26:55 杭州 共48条职位 167 | ================= zhaopin.com ================= 168 | ----------------- 人工智能 ----------------- 169 | 2017-05-10 15:26:57 北京 共650条职位 170 | 2017-05-10 15:26:59 上海 共169条职位 171 | 2017-05-10 15:27:03 深圳 共218条职位 172 | 2017-05-10 15:27:05 广州 共89条职位 173 | 2017-05-10 15:27:09 杭州 共72条职位 174 | ----------------- 大数据 ----------------- 175 | 2017-05-10 15:27:11 北京 共5151条职位 176 | 2017-05-10 15:27:14 上海 共1841条职位 177 | 2017-05-10 15:27:17 深圳 共1411条职位 178 | 2017-05-10 15:27:20 广州 共720条职位 179 | 2017-05-10 15:27:23 杭州 共744条职位 180 | ----------------- java ----------------- 181 | 2017-05-10 15:27:25 北京 共12232条职位 182 | 2017-05-10 15:27:28 上海 共5217条职位 183 | 2017-05-10 15:27:31 深圳 共2955条职位 184 | 2017-05-10 15:27:34 广州 共1718条职位 185 | 2017-05-10 15:27:37 杭州 共1715条职位 186 | ----------------- 前端 ----------------- 187 | 2017-05-10 15:27:40 北京 共5165条职位 188 | 2017-05-10 15:27:42 上海 共2297条职位 189 | 2017-05-10 15:27:45 深圳 共1332条职位 190 | 2017-05-10 15:27:48 广州 共718条职位 191 | 2017-05-10 15:27:51 杭州 共720条职位 192 | ----------------- Android ----------------- 193 | 2017-05-10 15:27:53 北京 共3176条职位 194 | 2017-05-10 15:27:56 上海 共1298条职位 195 | 2017-05-10 15:27:59 深圳 共1042条职位 196 | 2017-05-10 15:28:02 广州 共444条职位 197 | 2017-05-10 15:28:04 杭州 共438条职位 198 | ----------------- iOS ----------------- 199 | 2017-05-10 15:28:07 北京 共2962条职位 200 | 2017-05-10 15:28:10 上海 共1024条职位 201 | 2017-05-10 15:28:13 深圳 共692条职位 202 | 2017-05-10 15:28:16 广州 共388条职位 203 | 2017-05-10 15:28:19 杭州 共365条职位 204 | ----------------- python ----------------- 205 | 2017-05-10 15:28:22 北京 共4331条职位 206 | 2017-05-10 15:28:25 上海 共1863条职位 207 | 2017-05-10 15:28:28 深圳 共1038条职位 208 | 2017-05-10 15:28:31 广州 共433条职位 209 | 2017-05-10 15:28:33 杭州 共507条职位 210 | ----------------- php ----------------- 211 | 2017-05-10 15:28:36 北京 共2443条职位 212 | 2017-05-10 15:28:40 上海 共1099条职位 213 | 2017-05-10 15:28:42 深圳 共1077条职位 214 | 2017-05-10 15:28:45 广州 共437条职位 215 | 2017-05-10 15:28:49 杭州 共428条职位 216 | ----------------- golang ----------------- 217 | 2017-05-10 15:28:52 北京 共171条职位 218 | 2017-05-10 15:28:55 上海 共64条职位 219 | 2017-05-10 15:28:57 深圳 共28条职位 220 | 2017-05-10 15:29:00 广州 共13条职位 221 | 2017-05-10 15:29:02 杭州 共20条职位 222 | ================= 51job.com ================= 223 | ----------------- 人工智能 ----------------- 224 | 2017-05-10 16:32:23 北京 共949条职位 225 | 2017-05-10 16:32:24 上海 共601条职位 226 | 2017-05-10 16:32:26 深圳 共525条职位 227 | 2017-05-10 16:32:27 广州 共304条职位 228 | 2017-05-10 16:32:28 杭州 共291条职位 229 | ----------------- 大数据 ----------------- 230 | 2017-05-10 16:32:29 北京 共7621条职位 231 | 2017-05-10 16:32:30 上海 共6137条职位 232 | 2017-05-10 16:32:32 深圳 共3811条职位 233 | 2017-05-10 16:32:33 广州 共3245条职位 234 | 2017-05-10 16:32:34 杭州 共2479条职位 235 | ----------------- java ----------------- 236 | 2017-05-10 16:32:35 北京 共19853条职位 237 | 2017-05-10 16:32:36 上海 共26273条职位 238 | 2017-05-10 16:32:37 深圳 共14946条职位 239 | 2017-05-10 16:32:39 广州 共10810条职位 240 | 2017-05-10 16:32:40 杭州 共8045条职位 241 | ----------------- 前端 ----------------- 242 | 2017-05-10 16:32:41 北京 共8806条职位 243 | 2017-05-10 16:32:42 上海 共13222条职位 244 | 2017-05-10 16:32:43 深圳 共8077条职位 245 | 2017-05-10 16:32:44 广州 共6599条职位 246 | 2017-05-10 16:32:44 杭州 共4246条职位 247 | ----------------- Android ----------------- 248 | 2017-05-10 16:32:45 北京 共5005条职位 249 | 2017-05-10 16:32:46 上海 共9235条职位 250 | 2017-05-10 16:32:49 深圳 共5862条职位 251 | 2017-05-10 16:32:50 广州 共3018条职位 252 | 2017-05-10 16:32:51 杭州 共2240条职位 253 | ----------------- iOS ----------------- 254 | 2017-05-10 16:32:52 北京 共3436条职位 255 | 2017-05-10 16:32:53 上海 共5196条职位 256 | 2017-05-10 16:32:54 深圳 共3547条职位 257 | 2017-05-10 16:32:55 广州 共2370条职位 258 | 2017-05-10 16:32:56 杭州 共1685条职位 259 | ----------------- python ----------------- 260 | 2017-05-10 16:32:58 北京 共5664条职位 261 | 2017-05-10 16:32:59 上海 共6422条职位 262 | 2017-05-10 16:33:00 深圳 共3271条职位 263 | 2017-05-10 16:33:01 广州 共2008条职位 264 | 2017-05-10 16:33:02 杭州 共1951条职位 265 | ----------------- php ----------------- 266 | 2017-05-10 16:33:03 北京 共4861条职位 267 | 2017-05-10 16:33:04 上海 共8458条职位 268 | 2017-05-10 16:33:05 深圳 共5076条职位 269 | 2017-05-10 16:33:06 广州 共3572条职位 270 | 2017-05-10 16:33:08 杭州 共2027条职位 271 | ----------------- golang ----------------- 272 | 2017-05-10 16:33:09 北京 共136条职位 273 | 2017-05-10 16:33:10 上海 共206条职位 274 | 2017-05-10 16:33:11 深圳 共108条职位 275 | 2017-05-10 16:33:12 广州 共53条职位 276 | 2017-05-10 16:33:13 杭州 共48条职位 277 | ================= zhaopin.com ================= 278 | ----------------- 人工智能 ----------------- 279 | 2017-05-10 16:33:14 北京 共650条职位 280 | 2017-05-10 16:33:17 上海 共170条职位 281 | 2017-05-10 16:33:20 深圳 共218条职位 282 | 2017-05-10 16:33:22 广州 共89条职位 283 | 2017-05-10 16:33:25 杭州 共73条职位 284 | ----------------- 大数据 ----------------- 285 | 2017-05-10 16:33:28 北京 共5164条职位 286 | 2017-05-10 16:33:31 上海 共1847条职位 287 | 2017-05-10 16:33:34 深圳 共1418条职位 288 | 2017-05-10 16:33:37 广州 共720条职位 289 | 2017-05-10 16:33:39 杭州 共748条职位 290 | ----------------- java ----------------- 291 | 2017-05-10 16:33:42 北京 共12246条职位 292 | 2017-05-10 16:33:45 上海 共5221条职位 293 | 2017-05-10 16:33:48 深圳 共2962条职位 294 | 2017-05-10 16:33:51 广州 共1722条职位 295 | 2017-05-10 16:33:53 杭州 共1718条职位 296 | ----------------- 前端 ----------------- 297 | 2017-05-10 16:33:56 北京 共5176条职位 298 | 2017-05-10 16:33:59 上海 共2301条职位 299 | 2017-05-10 16:34:02 深圳 共1338条职位 300 | 2017-05-10 16:34:04 广州 共719条职位 301 | 2017-05-10 16:34:07 杭州 共728条职位 302 | ----------------- Android ----------------- 303 | 2017-05-10 16:34:10 北京 共3183条职位 304 | 2017-05-10 16:34:13 上海 共1300条职位 305 | 2017-05-10 16:34:16 深圳 共1045条职位 306 | 2017-05-10 16:34:19 广州 共443条职位 307 | 2017-05-10 16:34:21 杭州 共438条职位 308 | ----------------- iOS ----------------- 309 | 2017-05-10 16:34:24 北京 共2969条职位 310 | 2017-05-10 16:34:27 上海 共1025条职位 311 | 2017-05-10 16:34:30 深圳 共693条职位 312 | 2017-05-10 16:34:32 广州 共386条职位 313 | 2017-05-10 16:34:35 杭州 共365条职位 314 | ----------------- python ----------------- 315 | 2017-05-10 16:34:38 北京 共4345条职位 316 | 2017-05-10 16:34:41 上海 共1867条职位 317 | 2017-05-10 16:34:43 深圳 共1039条职位 318 | 2017-05-10 16:34:46 广州 共438条职位 319 | 2017-05-10 16:34:49 杭州 共508条职位 320 | ----------------- php ----------------- 321 | 2017-05-10 16:34:52 北京 共2448条职位 322 | 2017-05-10 16:34:55 上海 共1098条职位 323 | 2017-05-10 16:34:58 深圳 共1077条职位 324 | 2017-05-10 16:35:00 广州 共439条职位 325 | 2017-05-10 16:35:03 杭州 共428条职位 326 | ----------------- golang ----------------- 327 | 2017-05-10 16:35:06 北京 共173条职位 328 | 2017-05-10 16:35:09 上海 共64条职位 329 | 2017-05-10 16:35:12 深圳 共28条职位 330 | 2017-05-10 16:35:14 广州 共13条职位 331 | 2017-05-10 16:35:16 杭州 共20条职位 332 | --------------------------------------------------------------------------------