• 5分钟掌握智联招聘网站爬取并保存到MongoDB数据库


    前言

    本次主题分两篇文章来介绍:

    • 一、数据采集
    • 二、数据分析

    第一篇先来介绍数据采集,即用python爬取网站数据。

    1 运行环境和python库

    先说下运行环境:

    • python3.5
    • windows 7, 64位系统

    python库

    本次智联招聘的网站爬取,主要涉及以下一些python库:

    • requests
    • BeautifulSoup
    • multiprocessing
    • pymongo
    • itertools

    2 爬取的主要步骤

    • 根据关键字、城市、以及页面编号生成需要爬取的网页链接
    • 用requests获取相应的网页内容
    • 用BeautifulSoup解析,获取需要的关键信息
    • 将爬取的信息存入MongoDB数据库中,插入新记录或更新已有记录
    • 用multiprocessing启动多进程进行爬取,提高运行效率

    3 文件组成

    • 信息配置文件“zhilian_kw_config.py”
    • 爬虫主运行文件“zhilian_kw_spider.py”

    在配置文件中设置需要爬取的信息,然后运行主程序进行内容抓取。

    配置文件“zhilian_kw_config.py”的内容如下:

    # Code based on Python 3.x
    # _*_ coding: utf-8 _*_
    # __Author: "LEMON"
    
    TOTAL_PAGE_NUMBER = 90  # PAGE_NUMBER: total number of pages,可进行修改
    
    KEYWORDS = ['大数据', 'python', '投资经理'] # 需爬取的关键字可以自己添加或修改
    
    # 爬取主要城市的记录
    ADDRESS = ['全国', '北京', '上海', '广州', '深圳',
               '天津', '武汉', '西安', '成都', '大连',
               '长春', '沈阳', '南京', '济南', '青岛',
               '杭州', '苏州', '无锡', '宁波', '重庆',
               '郑州', '长沙', '福州', '厦门', '哈尔滨',
               '石家庄', '合肥', '惠州', '太原', '昆明',
               '烟台', '佛山', '南昌', '贵阳', '南宁']
    
    MONGO_URI = 'localhost'
    MONGO_DB = 'zhilian'
    

    爬虫主运行文件“zhilian_kw_spider.py”的内容如下:

    # Code based on Python 3.x
    # _*_ coding: utf-8 _*_
    # __Author: "LEMON"
    
    from datetime import datetime
    from urllib.parse import urlencode
    from multiprocessing import Pool
    import requests
    from bs4 import BeautifulSoup
    import pymongo
    from zhilian.zhilian_kw_config import *
    import time
    from itertools import product
    
    client = pymongo.MongoClient(MONGO_URI)
    db = client[MONGO_DB]
    
    def download(url):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
        response = requests.get(url, headers=headers)
        return response.text
    
    def get_content(html):
        # 记录保存日期
        date = datetime.now().date()
        date = datetime.strftime(date, '%Y-%m-%d')  # 转变成str
    
        soup = BeautifulSoup(html, 'lxml')
        body = soup.body
        data_main = body.find('div', {'class': 'newlist_list_content'})
    
        if data_main:
            tables = data_main.find_all('table')
    
            for i, table_info in enumerate(tables):
                if i == 0:
                    continue
                tds = table_info.find('tr').find_all('td')
                zwmc = tds[0].find('a').get_text()  # 职位名称
                zw_link = tds[0].find('a').get('href')  # 职位链接
                fkl = tds[1].find('span').get_text()  # 反馈率
                gsmc = tds[2].find('a').get_text()  # 公司名称
                zwyx = tds[3].get_text()  # 职位月薪
                gzdd = tds[4].get_text()  # 工作地点
                gbsj = tds[5].find('span').get_text()  # 发布日期
    
                tr_brief = table_info.find('tr', {'class': 'newlist_tr_detail'})
                # 招聘简介
                brief = tr_brief.find('li', {'class': 'newlist_deatil_last'}).get_text()
    
                # 用生成器获取信息
                yield {'zwmc': zwmc,  # 职位名称
                       'fkl': fkl,  # 反馈率
                       'gsmc': gsmc,  # 公司名称
                       'zwyx': zwyx,  # 职位月薪
                       'gzdd': gzdd,  # 工作地点
                       'gbsj': gbsj,  # 公布时间
                       'brief': brief,  # 招聘简介
                       'zw_link': zw_link,  # 网页链接
                       'save_date': date  # 记录信息保存的日期
                       }
    
    def main(args):
        basic_url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?'
    
        for keyword in KEYWORDS:
            mongo_table = db[keyword]
            paras = {'jl': args[0],
                     'kw': keyword,
                     'p': args[1]  # 第X页
                     }
            url = basic_url + urlencode(paras)
            # print(url)
            html = download(url)
            # print(html)
            if html:
                data = get_content(html)
                for item in data:
                    if mongo_table.update({'zw_link': item['zw_link']}, {'$set': item}, True):
                        print('已保存记录:', item)
    
    if __name__ == '__main__':
        start = time.time()
        number_list = list(range(TOTAL_PAGE_NUMBER))
        args = product(ADDRESS, number_list)
        pool = Pool()
        pool.map(main, args) # 多进程运行
        end = time.time()
        print('Finished, task runs %s seconds.' % (end - start))
    

    更多精彩内容请关注微信公众号:

    “Python数据之道”

  • 相关阅读:
    创建Django项目
    CVE-2011-0104:Microsoft Office Excel 栈溢出漏洞修复分析
    HDU 1089 到1096 a+b的输入输出练习
    ocrosoft 程序设计提高期末复习问题M 递归求猴子吃桃
    HDU 1406 完数
    ocrosoft 1015 习题1.22 求一元二次方程a*x^2 + b*x + c = 0的根
    php-amqplib库操作RabbitMQ
    rabbitmq 使用PhpAmqpLib
    RabbitMQ的持久化
    Rabbitmq各方法的作用详解
  • 原文地址:https://www.cnblogs.com/lemonbit/p/6886641.html
Copyright © 2020-2023  润新知