├── 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 |
--------------------------------------------------------------------------------