查看原文
其他

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

LEMON Python数据之道 2022-04-24

前言

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

  • 一、数据采集

  • 二、数据分析

第一篇先来介绍数据采集,即用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”的内容如下:

  1. # Code based on Python 3.x

  2. # _*_ coding: utf-8 _*_

  3. # __Author: "LEMON"

  4. TOTAL_PAGE_NUMBER = 90  # PAGE_NUMBER: total number of pages,可进行修改

  5. KEYWORDS = ['大数据', 'python', '投资经理'] # 需爬取的关键字可以自己添加或修改

  6. # 爬取主要城市的记录

  7. ADDRESS = ['全国', '北京', '上海', '广州', '深圳',

  8.           '天津', '武汉', '西安', '成都', '大连',

  9.           '长春', '沈阳', '南京', '济南', '青岛',

  10.           '杭州', '苏州', '无锡', '宁波', '重庆',

  11.           '郑州', '长沙', '福州', '厦门', '哈尔滨',

  12.           '石家庄', '合肥', '惠州', '太原', '昆明',

  13.           '烟台', '佛山', '南昌', '贵阳', '南宁']

  14. MONGO_URI = 'localhost'

  15. MONGO_DB = 'zhilian'

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

  1. # Code based on Python 3.x

  2. # _*_ coding: utf-8 _*_

  3. # __Author: "LEMON"

  4. from datetime import datetime

  5. from urllib.parse import urlencode

  6. from multiprocessing import Pool

  7. import requests

  8. from bs4 import BeautifulSoup

  9. import pymongo

  10. from zhilian.zhilian_kw_config import *

  11. import time

  12. from itertools import product

  13. client = pymongo.MongoClient(MONGO_URI)

  14. db = client[MONGO_DB]

  15. def download(url):

  16.    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}

  17.    response = requests.get(url, headers=headers)

  18.    return response.text

  19. def get_content(html):

  20.    # 记录保存日期

  21.    date = datetime.now().date()

  22.    date = datetime.strftime(date, '%Y-%m-%d')  # 转变成str

  23.    soup = BeautifulSoup(html, 'lxml')

  24.    body = soup.body

  25.    data_main = body.find('div', {'class': 'newlist_list_content'})

  26.    if data_main:

  27.        tables = data_main.find_all('table')

  28.        for i, table_info in enumerate(tables):

  29.            if i == 0:

  30.                continue

  31.            tds = table_info.find('tr').find_all('td')

  32.            zwmc = tds[0].find('a').get_text()  # 职位名称

  33.            zw_link = tds[0].find('a').get('href')  # 职位链接

  34.            fkl = tds[1].find('span').get_text()  # 反馈率

  35.            gsmc = tds[2].find('a').get_text()  # 公司名称

  36.            zwyx = tds[3].get_text()  # 职位月薪

  37.            gzdd = tds[4].get_text()  # 工作地点

  38.            gbsj = tds[5].find('span').get_text()  # 发布日期

  39.            tr_brief = table_info.find('tr', {'class': 'newlist_tr_detail'})

  40.            # 招聘简介

  41.            brief = tr_brief.find('li', {'class': 'newlist_deatil_last'}).get_text()

  42.            # 用生成器获取信息

  43.            yield {'zwmc': zwmc,  # 职位名称

  44.                   'fkl': fkl,  # 反馈率

  45.                   'gsmc': gsmc,  # 公司名称

  46.                   'zwyx': zwyx,  # 职位月薪

  47.                   'gzdd': gzdd,  # 工作地点

  48.                   'gbsj': gbsj,  # 公布时间

  49.                   'brief': brief,  # 招聘简介

  50.                   'zw_link': zw_link,  # 网页链接

  51.                   'save_date': date  # 记录信息保存的日期

  52.                   }

  53. def main(args):

  54.    basic_url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?'

  55.    for keyword in KEYWORDS:

  56.        mongo_table = db[keyword]

  57.        paras = {'jl': args[0],

  58.                 'kw': keyword,

  59.                 'p': args[1]  # 第X页

  60.                 }

  61.        url = basic_url + urlencode(paras)

  62.        # print(url)

  63.        html = download(url)

  64.        # print(html)

  65.        if html:

  66.            data = get_content(html)

  67.            for item in data:

  68.                if mongo_table.update({'zw_link': item['zw_link']}, {'$set': item}, True):

  69.                    print('已保存记录:', item)

  70. if __name__ == '__main__':

  71.    start = time.time()

  72.    number_list = list(range(TOTAL_PAGE_NUMBER))

  73.    args = product(ADDRESS, number_list)

  74.    pool = Pool()

  75.    pool.map(main, args) # 多进程运行

  76.    end = time.time()

  77.    print('Finished, task runs %s seconds.' % (end - start))

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

“Python数据之道”




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存