#!/user/bin/env python3
# -*- coding: utf-8 -*-
import requests
from lxml import etree
from math import ceil
from mongodb_config import mongo_info

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 '
                  'Safari/537.36'}

# 获取岗位页数
def getJobPage(url):
    res = requests.get(url, headers=header)
    html = etree.HTML(res.text)
    total = html.xpath('//div[@class="left"]/span/text()')[0]
    job_page = ceil(int(total) / 10)
    return job_page

# 获取详情页职位描述
def getJobOrder(url):
    # url = 'https://hr.tencent.com/position_detail.php?id=49256&keywords=&tid=0&lid=0'
    res = requests.get(url, headers=header)
    html = etree.HTML(res.text)
    detail_info = html.xpath('//table[@class="tablelist textl"]')
    for item in detail_info:
        # 工作职责
        job_request = item.xpath('tr[3]//ul[@class="squareli"]/li/text()')
        # 工作要求
        job_order = item.xpath('tr[4]/td/ul[@class="squareli"]/li/text()')
        # print(job_request)
        # print(job_order)
        list_data = [job_request, job_order]
        return list_data

# 获取列表页岗位信息
def getJobInfo(url):
    res = requests.get(url, headers=header)
    html = etree.HTML(res.text)
    job_list = html.xpath('//tr[@class="even" or @class="odd"]')
    list_data = []
    href = 'https://hr.tencent.com/'
    for list_job in job_list:
        dict_item = {}
        # print(etree.tostring(list_job, encoding='utf-8').decode('utf-8'))
        detail_url = href + list_job.xpath('.//a/@href')[0]
        job_name = list_job.xpath('.//td[1]/a/text()')[0]
        job_type = list_job.xpath('.//td[2]/text()')[0]
        job_people = list_job.xpath('.//td[3]/text()')[0]
        job_addre = list_job.xpath('.//td[4]/text()')[0]
        job_time = list_job.xpath('.//td[5]/text()')[0]
        # 工作职责
        job_request = getJobOrder(detail_url)[0]
        # 工作要求
        job_order = getJobOrder(detail_url)[1]

        dict_item['detail_url'] = detail_url
        dict_item['job_name'] = job_name
        dict_item['job_type'] = job_type
        dict_item['job_people'] = job_people
        dict_item['job_addre'] = job_addre
        dict_item['job_time'] = job_time
        dict_item['job_request'] = job_request
        dict_item['job_order'] = job_order
        list_data.append(dict_item)
    mongo_info.update_tencent(list_data)
    print(list_data)

if __name__ == '__main__':
    mainurl = 'https://hr.tencent.com/position.php?&start=0#a'
    jobPage = getJobPage(mainurl)
    for page in range(jobPage):
        pageUrl = 'https://hr.tencent.com/position.php?&start=' + str(page * 10) + '#a'
        print("第" + str(page + 1) + "页")
        getJobInfo(pageUrl)
    # getJobOrder()
#!/user/bin/env python3
# -*- coding: utf-8 -*-
from pymongo import MongoClient

class Connect_mongo(object):
    def __init__(self):
        # 无密码认证使用该代码
        # self.client = MongoClient(host='127.0.0.1', port=27017)
        # self.client = MongoClient(host='192.168.1.191', port=27017)
        # 有密码认证使用该代码
        self.client = MongoClient(host='127.0.0.1', port=27017)
        # self.client = MongoClient(host='192.168.1.193', port=27017)
        # 数据库名loan
        self.database = self.client.loan
        self.tencent_database = self.client.tencent
        # 认证用户密码
        self.dbinfo = self.database.authenticate('xxx', 'xxxx')
        self.tencent_dbinfo = self.tencent_database.authenticate('xxx', 'xxx')

    # 无密码认证
    # 查询全部产品名
    def find_all_name(self):
        _database = self.client.loan
        _collection = _database.loan_datase_sums
        loan_name = _collection.find({}, {'_id': 0, 'loan_name': 1})
        return loan_name

    # 去重查询
    def find_distinct_name(self):
        _database = self.client.loan
        _collection = _database.loan_datase_sums
        loan_name = _collection.distinct('loan_name')
        return loan_name

    def update_data(self, document):
        _client = self.client
        _database = self.database
        self.dbinfo
        _collection = _database.loan_datase_sums
        for res in document:
            result = _collection.update_many({'loan_name': res['loan_name']}, {'$set': res}, upsert=True)
        return result

    def update_rong360(self, document):
        _client = self.client
        _database = self.database
        self.dbinfo
        _collection = _database.rong360
        for res in document:
            result = _collection.update_many({'loan_name': res['loan_name']}, {'$set': res}, upsert=True)
        return result

    def update_tencent(self, document):
        _client = self.client
        _database = self.tencent_database
        self.tencent_dbinfo
        _collection = _database.advertise_datase
        for res in document:
            result = _collection.update_many({'job_name': res['job_name']}, {'$set': res}, upsert=True)
        return result

mongo_info = Connect_mongo()

腾讯招聘网数据爬取存入mongodb的更多相关文章

  1. Scrapy实现腾讯招聘网信息爬取【Python】

    一.腾讯招聘网 二.代码实现 1.spider爬虫 # -*- coding: utf-8 -*- import scrapy from Tencent.items import TencentIte ...

  2. Python爬虫入门教程 3-100 美空网数据爬取

    美空网数据----简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...

  3. 人人贷网的数据爬取(利用python包selenium)

    记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合网上各种相关资料,改善一下别人代码,并能实现数据代码爬取,具体请看我之前的博客:http://www.cnblogs.com/Yiutto/p/5 ...

  4. 爬虫1.5-ajax数据爬取

    目录 爬虫-ajax数据爬取 1. ajax数据 2. selenium+chromedriver知识准备 3. selenium+chromedriver实战拉勾网爬虫代码 爬虫-ajax数据爬取 ...

  5. 基于 PHP 的数据爬取(QueryList)

    基于PHP的数据爬取 官方网站站点 简单. 灵活.强大的PHP采集工具,让采集更简单一点. 简介: QueryList使用jQuery选择器来做采集,让你告别复杂的正则表达式:QueryList具有j ...

  6. 移动端数据爬取和Scrapy框架

    移动端数据爬取 注:抓包工具:青花瓷 1.配置fiddler 2.移动端安装fiddler证书 3.配置手机的网络 - 给手机设置一个代理IP:port a. Fiddler设置 打开Fiddler软 ...

  7. 小爬爬5:重点回顾&&移动端数据爬取1

    1. ()什么是selenium - 基于浏览器自动化的一个模块 ()在爬虫中为什么使用selenium及其和爬虫之间的关联 - 可以便捷的获取动态加载的数据 - 实现模拟登陆 ()列举常见的sele ...

  8. Web Scraper——轻量数据爬取利器

    日常学习工作中,我们多多少少都会遇到一些数据爬取的需求,比如说写论文时要收集相关课题下的论文列表,运营活动时收集用户评价,竞品分析时收集友商数据. 当我们着手准备收集数据时,面对低效的复制黏贴工作,一 ...

  9. python实现人人网用户数据爬取及简单分析

    这是之前做的一个小项目.这几天刚好整理了一些相关资料,顺便就在这里做一个梳理啦~ 简单来说这个项目实现了,登录人人网并爬取用户数据.并对用户数据进行分析挖掘,终于效果例如以下:1.存储人人网用户数据( ...

随机推荐

  1. Matlab GUI选项卡

    1.在这个网址下载一个工具包,里面应该有四个文件:tabselectionfcp.p.tabselectionfcn.m.tabpanel.p和tabpanel.m,显然代码用.p格式进行加密了. 2 ...

  2. Asterisk 对wav格式的支持

    经过测试wav格式文件仅支持PCM 8000kHz 16bit 单声道,非常蛋疼的一个原因,排查了好久! 关于C#支持的一些格式(Mono 单声道 .Stereo 立体声道) // Standard ...

  3. C#中将dll汇入exe z

    用了3层架构,运行目录下有很多dll文件,最终发布时,我打算将dll文件都合并到exe文件中去.微软发布的免费软件ILmerge可以完成这项工作,研究了一下,其用法如下: 1.合并file1.dll. ...

  4. linux中启动网卡报错:Bringing up interface eth1: Error: Connection activation failed

    在重启linux网络服务的时候提示: Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/2 并且产生报错 ...

  5. 【Spring实战】—— 9 AOP环绕通知

    假如有这么一个场景,需要统计某个方法执行的时间,如何做呢? 典型的会想到在方法执行前记录时间,方法执行后再次记录,得出运行的时间. 如果采用Spring的AOP,仅仅使用前置和后置方法是无法做到的,因 ...

  6. LeetCodeOJ刷题之12【Integer to Roman】

    Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be within t ...

  7. 浅析内存对齐与ANSI C中struct型数据的内存布局-内存对齐规则

    这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密. 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的 ...

  8. ACM-ICPC(10 / 9)

    ACM-ICPC(10.9) 树形DP 树形DP考点很多,状态转移有时会很复杂,但是也有规律可寻,最重要的是抓住父子关系之间的状态转移. 树的最大独立集:尽量选择多的点,使得任何两个结点均不相邻.​ ...

  9. Uva 4394 字符串刷子

    题目链接:https://vjudge.net/contest/164840#problem/A 题意:一个字符串刷子,每次可以将一段连续的字符串变成一种颜色,给两个字符串,最少通过几次可以将第一个字 ...

  10. POJ Treasure Exploration 【DAG交叉最小路径覆盖】

    传送门:http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K To ...