{"id":1731,"date":"2017-12-29T11:43:36","date_gmt":"2017-12-29T03:43:36","guid":{"rendered":"https:\/\/zoco.me\/?p=114"},"modified":"2017-12-29T11:43:36","modified_gmt":"2017-12-29T03:43:36","slug":"recruitment-website-spider-python-requests","status":"publish","type":"post","link":"https:\/\/cloudbool.com\/archive\/recruitment-website-spider-python-requests.html","title":{"rendered":"\u5199\u4e86\u4e2a\u62db\u8058\u7f51\u7ad9\u722c\u866b"},"content":{"rendered":"<p>\u6700\u8fd1\u89c9\u5f97\u6bcf\u5929\u5199PHP\u6709\u70b9\u75b2\u52b3\uff0c\u60f3\u63a5\u89e6\u4e00\u70b9\u6ca1\u6709\u63a5\u89e6\u8fc7\u7684\u4e1c\u897f\u6bd4\u5982\u8bf4Python\uff0c\u6211\u4e4b\u524d\u5c31\u4e86\u89e3\u5230Python\u5f88\u5f3a\u5927\uff0c\u80fd\u505a\u5f88\u591a\u4e8b\uff0c\u6bd4\u5982\u8bf4\u5199Web\uff0c\u5199\u5c0f\u5de5\u5177\uff0c\u79d1\u5b66\u8ba1\u7b97\uff0c\u63a7\u5236\u6811\u8393\u6d3e\uff0c\u8fd8\u80fd\u5199\u722c\u866b\u5230\u7f51\u4e0a\u722c\u6570\u636e\u3002\u4e8e\u662f\u7a81\u53d1\u5947\u60f3\uff0c\u8981\u4e0d\u5199\u4e00\u4e2a\u62db\u8058\u7f51\u7ad9\u722c\u866b\u5427\uff0c\u4e8e\u662f\u5c31\u6709\u4e86\u8fd9\u4e48\u4e00\u4e2a\u5c0f\u9879\u76ee\u3002<\/p>\n<p><!--more--><\/p>\n<p>\u6211\u6bcf\u5929\u7684\u5de5\u4f5c\u5c31\u662f\u5199Web\u76f8\u5173\u7684\uff0c\u6bd4\u5982\u8bf4\u7f51\u7ad9\uff0cApp\u7684API\u63a5\u53e3\uff0c\u8fdb\u9500\u5b58\u7cfb\u7edf\u7b49\u7b49\uff0c\u6709\u66f4\u719f\u6089\u53ca\u4f7f\u7528\u8303\u56f4\u66f4\u5e7f\u7684PHP\uff0c\u6ca1\u5fc5\u8981\u820d\u8fd1\u6c42\u8fdc\u7528Python\u6765\u5199Web\u3002<\/p>\n<p>\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u9009\u62e9\u722c\u866b\uff0c\u4e00\u662f\u56e0\u4e3a\u7b80\u5355\uff0c\u9002\u5408\u5165\u95e8\uff0c\u4e5f\u80fd\u4ece\u4e2d\u5b66\u5230Python\u7684\u5f88\u591a\u57fa\u7840\u77e5\u8bc6\uff1b\u4e8c\u662f\u56e0\u4e3aPython\u6709requests\u3001pyquery\u8fd9\u6837\u5f88\u5389\u5bb3\u7684\u5e93\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u65b0\u624b\uff0c\u5bf9\u7740\u4f8b\u5b50\u6539\u6539\u5c31\u80fd\u7528\u3002<\/p>\n<p>\u8fd9\u4e2a\u5c0f\u9879\u76ee\u4f7f\u7528\u4e86requests\u3001pymysql\u3001pyquery\u51e0\u4e2a\u5e93\uff0c\u505a\u4e2a\u8bb0\u5f55\u53ca\u7ed9\u540e\u6765\u8005\u53c2\u8003\u3002<\/p>\n<p>\u51fa\u4e8e\u6570\u636e\u91cf\u8003\u8651\uff0c\u6211\u5e76\u6ca1\u6709\u505a\u9650\u901f\u5904\u7406\uff0c\u76f4\u63a5\u4e00\u53e3\u6c14\u8dd1\u5b8c\uff0c\u4e5f\u8fd8\u4e0d\u662f\u5f88\u5b8c\u5584\uff0c\u603b\u5171\u6293\u53bb\u52302200+\u6570\u636e\uff0c220+\u5bb6\u516c\u53f8\uff0c\u5982\u679c\u5b8c\u5584\u4e00\u4e0b\u5e94\u8be5\u53ef\u4ee5\u6293\u7684\u66f4\u591a\uff0c\u4ee3\u7801\u793a\u4f8b\uff1a<\/p>\n<pre><code>import requests\nimport pymysql\nfrom pymysql import MySQLError\nfrom requests.exceptions import RequestException\nfrom pyquery import PyQuery as pq\nimport time\nimport datetime\nimport re\n\ndb = pymysql.connect(host='localhost', user='zoco', password='zoco', port=3306, db='gz91', charset='utf8')\ncursor = db.cursor()\n\n# \u901a\u7528\u5934\u90e8\u8bf7\u6c42\nheaders = {\n    \"Accept\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,image\/apng,*\/*;q=0.8\",\n    \"Accept-Encoding\": \"gzip, deflate, br\",\n    \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7\",\n    \"Connection\": \"close\",\n    \"Dnt\": \"1\",\n    # \"Host\": \"httpbin.org\",\n    \"Upgrade-Insecure-Requests\": \"1\",\n    \"User-Agent\": \"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/63.0.3239.108 Safari\/537.36\"\n}\n\n# \u4e3b\u57df\u540d\ndomain = 'http:\/\/www.gz91.com'\nunix_stamp = int(time.time())\ndate = datetime.datetime.now().strftime(\"%Y%m%d\")\n\n\n# gz91 \u5934\u90e8\ndef gz91_header():\n    gz91_header_list = headers\n    gz91_header_list['Host'] = 'www.gz91.com'\n    return gz91_header_list\n\n\n# \u9875\u9762\u5206\u6790 \u6293\u53bb\u5230\u9875\u9762\u540e  \u8fdb\u884c\u9875\u9762\u5206\u6790  \u9010\u4e00\u5206\u6790\u662f\u5217\u8868\u9875  \u8fd8\u662f\u62db\u8058\u8be6\u60c5\u9875 \u6216\u8005\u662f\u516c\u53f8\u5c55\u793a\u9875\ndef page_analyze(html):\n    get_a_link(html)\n\n\n# \u6293\u53d6\u9996\u9875\ndef get_index():\n    try:\n        index_html = requests.get(domain, headers=gz91_header())\n        if index_html.status_code == 200:\n            index_html.encoding = 'UTF-8'\n            return index_html\n        else:\n            return None\n    except RequestException:\n        return None\n\n\n# \u5224\u65ad\u5e76\u83b7\u5f97a\u94fe\u63a5\ndef get_a_link(html):\n    html = pq(html.text)\n    a_links = html('a')\n    for a in a_links:\n        href = pq(a).attr('href')\n        href = href.lower()\n        # \u5224\u65ad\u662f\u5426\u662f\u5c55\u793a\u9875\n        if href.find('jobsviewer') != -1:\n            # \u518d\u6b21\u5224\u65ad\u662f\u62db\u8058\u8be6\u60c5\u5c55\u793a\u9875\u8fd8\u662f\u516c\u53f8\u5c55\u793a\u9875\n            if href.find('jobs_id') != -1:\n                # \u4ea4\u7531\u9875\u9762\u6293\u53d6\u7a0b\u5e8f\u6293\u53d6\u8be5\u9875\u9762  \u7136\u540e\u4ea4\u7531\u5de5\u4f5c\u9875\u51fd\u6570\u5206\u6790\u5e76\u5165\u5e93\n                job_page_analyze(href)\n                # pass\n            else:\n                # \u672a\u67e5\u627e\u5230jobs_id \u5219\u4e3a\u516c\u53f8\u5c55\u793a\u9875\n                company_page_analyze(href)\n                # pass\n\n        # \u5224\u65ad\u662f\u5426\u662f\u641c\u7d22\u9875\n        if href.find('jobsearch') != -1:\n            # print('\u641c\u7d22\u9875\uff1a' + href)\n            # \u641c\u7d22\u9875\u518d\u6b21\u722c\u53d6  \u9010\u4e00\u722c\u53d6\u8be6\u60c5\u9875\n            # page_request(href)\n            pass\n\n\n# \u4fdd\u5b58 a \u94fe\u63a5\ndef a_save(href):\n    \"\"\"\n    \u67e5\u627e\u662f\u5426\u4fdd\u5b58\u4f20\u6765\u7684 href \u5c5e\u6027\uff0c\u5982\u679c\u5df2\u7ecf\u4fdd\u5b58\u5219\u66f4\u65b0 \u5426\u5219\u4fdd\u5b58\u81f3\u6570\u636e\u5e93 a \u8868\u4e2d\n    :param href: \u94fe\u63a5\u5730\u5740\n    :return:\n    \"\"\"\n    # \u5224\u65adhref\u91cc\u9762\u662f\u5426\u6709\u57df\u540d  \u5982\u679c\u6709  \u5219\u53bb\u6389\u57df\u540d\u4fe1\u606f\n    if href.find('www.gz91.com') &gt; -1:\n        href = href.replace('http:\/\/www.gz91.com', '')\n\n    a_href_query_sql = \"SELECT COUNT(1) as count FROM a WHERE href = %s\"\n    cursor.execute(a_href_query_sql, href)\n    href_query = cursor.fetchone()\n\n    if href_query[0] == 0:\n        # \u6267\u884c\u5165\u5e93\u6b65\u9aa4\n        try:\n            href_insert_sql = \"insert into a (href, last_visit, last_visit_date) VALUES (%s, %s, %s)\"\n            cursor.execute(href_insert_sql, (href, unix_stamp, date))\n            db.commit()\n        except MySQLError as e:\n            db.rollback()\n            print('a\u94fe\u63a5\u4fdd\u5b58\u5931\u8d25\uff0c\u9519\u8bef\u4fe1\u606f\uff1a'.format(e, e.args[0]))\n\n\n# \u6293\u53d6\u7f51\u9875\ndef page_request(href):\n    # \u5224\u65ad\u4f20\u6765\u7684\u94fe\u63a5\u662f\u5426\u5e26\u57df\u540d  \u5982\u679c\u643a\u5e26\u5219\u4e0d\u7528\u6dfb\u52a0\u57df\u540d\u4fe1\u606f  \u5426\u5219\u9700\u8981\u52a0\u4e0a\u57df\u540d\u4fe1\u606f\n    if href.find('www.gz91.com') &gt; -1:\n        url = href\n    else:\n        # \u5224\u65adURL\u91cc\u9762\u662f\u5426\u81ea\u5e26\/   \u5982\u679c\u5e26\u4e86  \u5c31\u6ca1\u5fc5\u8981\u4f20\/\u8fdbURL\n        if href.find('\/') == 0:\n            url = domain + href\n        else:\n            url = domain + '\/' + href\n    # \u4fdd\u5b58a\u94fe\u63a5\n    # print(url)\n    # return\n    a_save(url)\n    try:\n        page = requests.get(url=url, headers=gz91_header())\n        if page.status_code == 200:\n            page.encoding = 'UTF-8'\n            # print(page.text)\n            # exit(1)\n            return page\n        return None\n    except RequestException:\n        return None\n\n\n# \u5206\u6790\u5e76\u4fdd\u5b58\u62db\u8058\u9875\u4fe1\u606f\ndef job_page_analyze(href):\n    print(href)\n    ids = re.search('.*?\/jobsviewer\/index\/job7733_id\/(.*?)\/jobs_id\/(.*?).html', href)\n    # print(ids.groups())\n    if len(ids.groups()) == 2:\n        # print(job_id_list[2])\n        jobs_id = ids.groups()[1]\n        company_id = ids.groups()[0]\n    else:\n        return\n    # print(jobs_id,company_id)\n    # \u4ece\u6570\u636e\u5e93\u4e2d\u67e5\u627e  \u662f\u5426\u5df2\u5b58\u5728\u8fd9\u6761\u804c\u4f4d\u4fe1\u606f  \u5982\u679c\u5df2\u5b58\u5728 \u5219\u4e0d\u518d\u8fdb\u884c\u5199\u5165\n    job_query_sql = \"SELECT count(1) as count FROM jobs WHERE jobs_id = %s AND company_id = %s\"\n    cursor.execute(job_query_sql, (jobs_id, company_id))\n    job_query = cursor.fetchone()\n    # print(job_query)\n    if job_query[0] &gt; 0:\n        return\n\n    page = page_request(href)\n    # \u5f00\u59cb\u4ece\u7f51\u9875\u4e2d\u627e\u5230\u804c\u4f4d\u76f8\u5173\u4fe1\u606f\n    html = pq(page.text)\n    # \u804c\u4f4d\u540d\u79f0\n    job_name = html.find('.zw_a #jtname').text()\n    # print(job_name)\n    # \u804c\u4f4d\u6708\u85aa\n    monthly_salary = html.find('.zw_if1 dd:first em').text()\n    work_place = html.find('.zw_if1 dd:nth-child(2) i').text()\n    position_type = html.find('.zw_if1 dd:nth-child(3) i').text()\n    sex_requirements = html.find('.zw_if1 dd:nth-child(4) i').text()\n    number_of_recruits = html.find('.zw_if1 dd:nth-child(5) i').text()\n    job_category = html.find('.zw_if1 dd:nth-child(6) i').text()\n    age_requirement = html.find('.zw_if1 dd:nth-child(7) i').text()\n    work_experience = html.find('.zw_if1 dd:nth-child(8) i').text()\n    update_at = html.find('.zw_if1 dd:nth-child(9) i').text()\n    education_requirements = html.find('.zw_if1 dd:nth-child(10) i').text()\n    driver_license = html.find('.zw_if1 dd:nth-child(11) i').text()\n    certificate_requirement = html.find('.zw_if1 dd:nth-child(12) i').text()\n    # \u5de5\u4f5c\u65f6\u95f4\n    working_hours = html.find('.wz_if3 dd:nth-child(1) i').text()\n    # \u5de5\u4f5c\u8be6\u60c5\n    job_detail = html.find('.wz_if4:first dd').text()\n    # print(job_detail)\n    # \u63d2\u5165\u6570\u636e\u5e93\n    jobs_insert_sql = \"INSERT INTO `gz91`.`jobs`(`jobs_id`, `job_name`, `monthly_salary`, `work_place`, \" \\\n                      \"`position_type`, `sex_requirements`, `number_of_recruits`, `job_category`, `age_requirement`, \" \\\n                      \"`work_experience`, `update_at`, `education_requirements`, `driver_license`, `job_detail`, \" \\\n                      \"`certificate_requirement`, `working_hours`, `company_id`) VALUES \" \\\n                      \"(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);\"\n    insert_set = (jobs_id, job_name, monthly_salary, work_place, position_type, sex_requirements, number_of_recruits,\n                  job_category, age_requirement, work_experience, update_at, education_requirements, driver_license,\n                  job_detail, certificate_requirement, working_hours, company_id)\n    try:\n        cursor.execute(jobs_insert_sql, insert_set)\n        db.commit()\n        print('\u804c\u4f4dID\u4e3a ' + jobs_id + '\u7684\u5de5\u4f5c\u4fe1\u606f\u5165\u5e93\u5b8c\u6210')\n    except MySQLError as e:\n        db.rollback()\n        # print('\u9875\u9762\u6570\u636e\u4fdd\u5b58\u5931\u8d25,\u9519\u8bef\u4fe1\u606f\uff1a'+format(e, e.args[0]))\n        print(e.args)\n\n\n# \u5206\u6790\u5e76\u4fdd\u5b58\u516c\u53f8\u4fe1\u606f\ndef company_page_analyze(href):\n    \"\"\"\n    \u6839\u636e\u4f20\u6765\u7684\u4fe1\u606f\u5230\u6570\u636e\u5e93\u67e5\u8be2\u662f\u5426\u6709\u8be5\u516c\u53f8\u7684\u4fe1\u606f  \u5982\u679c\u6ca1\u6709  \u5219\u8fdb\u884c\u4fdd\u5b58   \u6709\u7684\u8bdd\u8fdb\u884c\u66f4\u65b0\n    :param page: \u6293\u53d6\u5230\u7684\u9875\u9762\n    :param href: \u516c\u53f8\u5730\u5740\n    :return:\n    \"\"\"\n    # print(page.text)\n    print(href)\n    # \u4eceURL\u4e2d  \u5206\u6790\u51fa\u516c\u53f8ID\n    company_id = re.search('.*?\/jobsviewer\/index\/job.*?_id\/(.*?).html', href).group(1)\n    # print(company_id)\n\n    # \u67e5\u8be2\u5f53\u524d\u516c\u53f8\u662f\u5426\u5728\u6570\u636e\u5e93   \u5982\u679c\u4e0d\u5728\u5219\u5165\u5e93  \u5728\u76f4\u63a5\u8fd4\u56de\n    company_query_sql = \"SELECT count(1) as count FROM company WHERE company_id= %s\"\n    cursor.execute(company_query_sql, company_id)\n    company_query = cursor.fetchone()\n    # print(job_query)\n    if company_query[0] &gt; 0:\n        return\n\n    page = page_request(href)\n    # \u4ece\u9875\u9762\u4e2d\u627e\u51fa\u5404\u9879\u9700\u8981\u63d2\u5165\u6570\u636e\u5e93\u7684\u4fe1\u606f\n    html = pq(page.text)\n    company_name = html.find('.cominfo dt h1').text()\n    address = html.find('.com_lx dt em a').text()\n    industry = html.find('.cominfo dd.posr span.hy').text()\n    industry = industry.replace('\u884c\u4e1a\uff1a', '')\n    scale = html.find('.cominfo dd.posr span.gm').text()\n    scale = scale.replace('\u89c4\u6a21\uff1a', '')\n    url = company_id\n    nature = html.find('.com_if1 dd:first i').text()\n    date_of_establishment = html.find('.com_if1 dd:nth-child(2) i').text()\n    industry_category = html.find('.com_if1 dd:nth-child(3) i').text()\n    numbers_of_employees = html.find('.com_if1 dd:nth-child(4) i').text()\n    telphone_number = html.find('.com_lx dt:first em').text()\n    introduction = html.find('.wz_if4 dd:nth-child(2)').text()\n    last_modifiy = date\n    # \u63d2\u5165\u6570\u636e\u5e93\n    company_inset_sql = 'INSERT INTO `gz91`.`company`(`company_id`, `company_name`, `address`, `industry`, ' \\\n                        '`scale`, `url`, `nature`, `date_of_establishment`, `industry_category`, `numbers_of_employees`,' \\\n                        ' `telphone_number`, `introduction`, `last_modifiy`) ' \\\n                        'VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);'\n    insert_set = (company_id, company_name, address, industry, scale, url, nature, date_of_establishment,\n                  industry_category, numbers_of_employees, telphone_number, introduction, last_modifiy)\n    try:\n        cursor.execute(company_inset_sql, insert_set)\n        db.commit()\n        print('ID\u4e3a ' + company_id + '\u7684\u516c\u53f8\u4fe1\u606f\u5165\u5e93\u5b8c\u6210')\n    except MySQLError as e:\n        db.rollback()\n        # print('\u9875\u9762\u6570\u636e\u4fdd\u5b58\u5931\u8d25,\u9519\u8bef\u4fe1\u606f\uff1a'+format(e, e.args[0]))\n        print(e.args)\n\n\nlmjobs_uri = '\/recommend\/lmjobs.html'\n\n\n# \u51b7\u95e8\u804c\u4f4d\ndef lmjobs(lmjobs_next_page_a):\n    lmjobs_index = requests.get(url=domain + lmjobs_next_page_a, headers=gz91_header())\n    if lmjobs_index.status_code == 200:\n        page_analyze(lmjobs_index)\n        # \u4ece\u9875\u9762\u83b7\u53d6\u4e0b\u4e00\u9875\u7684URL  \u5982\u679c\u83b7\u53d6\u6210\u529f  \u5219\u8fdb\u884c\u4e0b\u4e00\u9875\u6293\u53d6\n        html = pq(lmjobs_index.text)\n        lmjobs_next_page_a = html.find(\".pagination li a.nextpage_a\").attr('href')\n        print(lmjobs_next_page_a)\n        if lmjobs_next_page_a is not None:\n            lmjobs(lmjobs_next_page_a)\n\n\ndef main():\n    index_html = get_index()\n    # print(index_html.text)\n    page_analyze(index_html)\n    lmjobs(lmjobs_uri)\n\n\nif __name__ == '__main__':\n    main()\n\n<\/code><\/pre>\n<p>\u5bf9\u5e94\u7684\u6570\u636e\u5e93\u7ed3\u6784\uff1a<\/p>\n<pre><code>SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for a\n-- ----------------------------\nDROP TABLE IF EXISTS `a`;\nCREATE TABLE `a` (\n  `a_id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `href` varchar(255) NOT NULL COMMENT '\u94fe\u63a5\u503c',\n  `last_visit` varchar(12) NOT NULL COMMENT '\u6700\u540e\u8bbf\u95ee\u65f6\u95f4',\n  `last_visit_date` int(8) NOT NULL COMMENT '\u6700\u540e\u8bbf\u95ee\u65f6\u95f4-\u65e5\u671f',\n  PRIMARY KEY (`a_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=4981 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for company\n-- ----------------------------\nDROP TABLE IF EXISTS `company`;\nCREATE TABLE `company` (\n  `c_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '\u516c\u53f8\u8868 ID',\n  `company_id` int(11) NOT NULL COMMENT '\u516c\u53f8\u5728 gz91\u7684 ID',\n  `company_name` varchar(255) NOT NULL COMMENT '\u516c\u53f8\u540d\u79f0',\n  `address` varchar(255) DEFAULT NULL COMMENT '\u516c\u53f8\u5730\u5740',\n  `industry` varchar(255) DEFAULT NULL COMMENT '\u6240\u5c5e\u884c\u4e1a',\n  `scale` varchar(255) DEFAULT NULL COMMENT '\u516c\u53f8\u89c4\u6a21',\n  `url` varchar(255) DEFAULT NULL COMMENT '\u516c\u53f8\u7f51\u7ad9 URL',\n  `nature` varchar(255) DEFAULT NULL COMMENT '\u516c\u53f8\u6027\u8d28',\n  `date_of_establishment` varchar(10) DEFAULT NULL COMMENT '\u516c\u53f8\u6210\u7acb\u65e5\u671f',\n  `industry_category` varchar(255) DEFAULT NULL COMMENT '\u884c\u4e1a\u7c7b\u522b',\n  `numbers_of_employees` varchar(20) DEFAULT NULL COMMENT '\u5458\u5de5\u4eba\u6570',\n  `telphone_number` varchar(15) DEFAULT NULL COMMENT '\u8054\u7cfb\u7535\u8bdd',\n  `introduction` text COMMENT '\u516c\u53f8\u7b80\u4ecb',\n  `last_modifiy` int(11) DEFAULT NULL COMMENT '\u6700\u540e\u4fee\u6539\u65f6\u95f4',\n  PRIMARY KEY (`c_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=231 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for jobs\n-- ----------------------------\nDROP TABLE IF EXISTS `jobs`;\nCREATE TABLE `jobs` (\n  `j_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '\u5de5\u4f5c ID',\n  `jobs_id` int(11) NOT NULL COMMENT '\u5728gz91\u6240\u5c5e\u5de5\u4f5c ID',\n  `job_name` varchar(255) NOT NULL COMMENT '\u804c\u4f4d\u540d\u79f0',\n  `monthly_salary` varchar(15) NOT NULL DEFAULT '' COMMENT '\u63d0\u4f9b\u6708\u85aa',\n  `work_place` varchar(20) DEFAULT NULL COMMENT '\u5de5\u4f5c\u5730\u70b9',\n  `position_type` varchar(20) DEFAULT NULL COMMENT '\u804c\u4f4d\u7c7b\u578b',\n  `sex_requirements` varchar(10) DEFAULT NULL COMMENT '\u6027\u522b\u8981\u6c42',\n  `number_of_recruits` varchar(10) DEFAULT NULL COMMENT '\u62db\u8058\u4eba\u6570',\n  `job_category` varchar(20) DEFAULT NULL COMMENT '\u5c97\u4f4d\u7c7b\u522b',\n  `age_requirement` varchar(255) DEFAULT NULL COMMENT '\u5e74\u9f84\u8981\u6c42',\n  `work_experience` varchar(20) DEFAULT NULL COMMENT '\u5de5\u4f5c\u7ecf\u9a8c',\n  `update_at` varchar(20) DEFAULT NULL COMMENT '\u6700\u540e\u66f4\u65b0',\n  `education_requirements` varchar(20) DEFAULT NULL COMMENT '\u5b66\u5386\u8981\u6c42',\n  `driver_license` varchar(10) DEFAULT NULL COMMENT '\u662f\u5426\u8981\u6c42\u9a7e\u9a76\u8bc1',\n  `job_detail` text COMMENT '\u804c\u4f4d\u4ecb\u7ecd\u8be6\u60c5',\n  `certificate_requirement` varchar(10) DEFAULT NULL COMMENT '\u8bc1\u4e66\u8981\u6c42',\n  `working_hours` varchar(100) DEFAULT NULL COMMENT '\u5de5\u4f5c\u65f6\u95f4',\n  `company_id` int(11) NOT NULL COMMENT '\u516c\u53f8ID',\n  PRIMARY KEY (`j_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=1891 DEFAULT CHARSET=utf8;\n\nSET FOREIGN_KEY_CHECKS = 1;\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u89c9\u5f97\u6bcf\u5929\u5199PHP\u6709\u70b9\u75b2\u52b3\uff0c\u60f3\u63a5\u89e6\u4e00\u70b9\u6ca1\u6709\u63a5\u89e6\u8fc7\u7684\u4e1c\u897f\u6bd4\u5982\u8bf4Python\uff0c\u6211\u4e4b\u524d\u5c31\u4e86\u89e3\u5230Python\u5f88\u5f3a\u5927\uff0c &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/cloudbool.com\/archive\/recruitment-website-spider-python-requests.html\"> <span class=\"screen-reader-text\">\u5199\u4e86\u4e2a\u62db\u8058\u7f51\u7ad9\u722c\u866b<\/span> \u67e5\u770b\u5168\u6587 &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"categories":[8],"tags":[81,125],"class_list":["post-1731","post","type-post","status-publish","format-standard","hentry","category-tech","tag-python","tag-125"],"_links":{"self":[{"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/posts\/1731","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/comments?post=1731"}],"version-history":[{"count":0,"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/posts\/1731\/revisions"}],"wp:attachment":[{"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/media?parent=1731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/categories?post=1731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudbool.com\/archive\/wp-json\/wp\/v2\/tags?post=1731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}