1. 程式人生 > >利用scrapy輕鬆爬取招聘網站資訊並存入MySQL

利用scrapy輕鬆爬取招聘網站資訊並存入MySQL

前言
  1. Scrapy版本:1.4;
  2. Python版本:3.6;
  3. OS:win10;
  4. 本文完整專案程式碼:完整示例
  5. 本文目標:
    通過爬取騰訊招聘網站招聘崗位,熟悉scrapy,並掌握資料庫儲存操作;
一、準備工作
♣   基礎工作

首先你要安裝Scrapy和了解Scrapy相關的基礎知識,若你還沒有安裝或不太瞭解Scrapy框架,請移步文章:Scrapy入門–爬取cnblogs文章。

♣   建立scrapy專案

建立專案crawl-tencent-jobs-project,在cmd命令框或Anaconda命令框下,輸入如下命令:

scrapy startproject crawl_tencent_jobs_project

結果:
這裡寫圖片描述

♣   建立爬蟲

切換到專案目錄;建立爬蟲;

cd crawl_tencent_jobs_project
scrapy genspider crawl_tencent_jobs hr.tencent.com

結果:
這裡寫圖片描述

當爬蟲建立成功後可以在專案目錄下的spiders目錄下檢視爬蟲檔案,如下圖,
這裡寫圖片描述

本文提供兩種資料儲存方式:
1、儲存在csv或txt檔案中;
2、儲存在MySQL資料庫中。
這裡以儲存在MySQL中為例,這樣便於後期爬取其他網站時的通用性,也對知識進行了更全面的覆蓋。

♣   建立資料庫

在cmd命令提示符下,輸入如下命令連線資料庫,

mysql -h localhost -u root -p
# 提示輸入祕密,輸入密碼即可連線mysql

在mysql命令提示符下,輸入建立資料庫命令,注意,這裡mysql使用utf-8編碼,以免編碼問題影響資料儲存。

CREATE DATABASE tencent_jobs DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
二、程式碼實現
♣   分析需求
♣   需要抓取欄位:
 1. 職位名稱;
 2. 工作地點;
 3. 職位型別;
 4. 招聘人數;
 5. 工作職責;
 6. 工作要求。
♣   建立資料庫中的表

已經分析出需要抓取的欄位,那麼就要建立資料庫中的表,以儲存資料。
新建檔案mysql-connection.py,使用pymysql庫建立表,也可手動在mysql命令列建立。

#_*_  coding: utf-8 _*_
# Author: waltsmith
# Date:2018-01-03
# 匯入模組
import pymysql

## 建立騰訊jobs資料庫
# 建立連線
Connection = pymysql.connect(database='tencent_jobs', host='localhost', user='root', password='123456')

cursor = Connection.cursor()
# 建立jobs表
sql_create_table = '''
    create table jobs(job_name varchar (100),
      location varchar (40),
      type varchar (40),
      needed_people_num varchar (5),
      duty varchar (400),
      requirement varchar (500)
    )
'''
# 執行sql語句,建立jobs表
cursor.execute(sql_create_table)
# 提交
Connection.commit()
# 斷開連線
Connection.close()
print("資料庫建立完畢!!")

執行mysql-connection.py檔案,提示“資料庫建立完畢!!”,也可手動檢查是否建立成功,如下圖,使用navicat。
這裡寫圖片描述
也可以在命令列檢查,使用如下命令查詢

>>> use tencent_jobs;
>>> show create table jobs;

這裡寫圖片描述

♣   迭代爬取網頁規則

祭出神器“F12”,查詢xpath規則,不斷修正實驗,得到如下規則,當然你也可以使用Scrapy中的CSS選擇器來獲取內容。

class TencentJobsSpider(CrawlSpider):
    name = 'tencent_jobs'
    allowed_domains = ['hr.tencent.com']
    start_urls = ['http://hr.tencent.com/position.php?&start=0#a']
    # 定義link_extractor
    # 入口地址和詳細頁面連結
main_page = LinkExtractor(allow='&start=\d+#a', restrict_xpaths='//*[@id="next"]')
    page_info = LinkExtractor(allow='id=\d+&keywords=')
    rules = (
        Rule(main_page, follow=True),
        Rule(page_info, callback='parse_item', follow=True)
    )
♣   資訊抽取函式,獲取關鍵資訊
def parse_item(self, response):
    # 職位名稱、工作地點、職位類別、招聘人數
    # 由於某些專案的值為空,為防止獲取錯誤,這裡標記空值為'UNKNOWN'
    try:
job_name = response.xpath('//*[@id="sharetitle"]/text()').extract()[0]
    except:
        job_name = 'UNKNOWN'
    try:
job_location = response.xpath('//tr[2]/td[1]/text()').extract()[0]
    except:
        job_location = 'UNKNOWN'
    try:
job_type = response.xpath('//tr[2]/td[2]/text()').extract()[0]
    except:
        job_type = 'UNKNOWN'
    try:
job_needed_people_num = response.xpath('//tr[2]/td[3]/text()').extract()[0]
    except:
        job_needed_people_num = 'UNKNOWN'
    try:
job_duty = response.xpath('string(//tr[3]/td/ul)').extract()[0]
    except:
        job_duty = 'UNKNOWN'
    try:
job_requirement = response.xpath('string(//tr[4]/td/ul)').extract()[0]
    except:
        job_requirement = ''

    ## 後續進行資料儲存操作或存入檔案
♣   資料存入資料庫

存入資料庫有兩種方式:
1. scrapy提供了pipeline可將資料存入資料庫;
2. 使用pymysql模組直接在得到資料後存入資料庫;
3. 也可使用其他模組操作mysql,如,mysqldb,SQLAlchemy模組。
這裡使用第二種方法。

在資訊抽取函式中的完成資訊抽取後加入如下程式碼:

        ## 後續進行資料儲存操作或存入檔案
        ## 寫入資料庫
        param = [job_name.encode('utf-8'), job_location.encode('utf-8'), job_type.encode('utf-8'),
                      job_needed_people_num.encode('utf-8'), job_duty.encode('utf-8'), job_requirement.encode('utf-8')]
        # 連線資料庫
        with pymysql.connect(database='tencent_jobs', host='localhost', user='root', password='123456') as cursor:
            # 向表中插入資料的sql語句
            sql_insert = '''
                    insert into jobs (job_name, location, type, needed_people_num, duty, requirement) VALUES (
                    %s, %s, %s, %s, %s, %s
                    )
                '''
            try:
                cursor.execute(sql_insert, param)
            except:
                print("============資料庫插入失敗!=============")
                time.sleep(5)     # 暫停以檢視錯誤;親測,也可不用捕獲異常。
♣   資料寫入檔案
## 寫入檔案
        params = [job_name.encode('utf-8'), job_type.encode('utf-8'), job_location.encode('utf-8'), job_needed_people_num.encode('utf-8'), job_duty.encode('utf-8'), job_requirement.encode('utf-8')]
        with open('tencent_jobs.txt', 'a+') as f:
            f.write(str(params[0]) + ', ' + str(params[1]) + ', ' + str(params[2]) + ', ' + str(params[3]) + ', ' + str(params[4]) + ', ' + str(params[5]) + '\n')
♣   執行爬蟲

可在命令列執行程式,也可在專案目錄下新建py檔案,通過scrapy中cmdline模組執行cmd命令。
在專案目錄下新建runspider.py,新增如下程式碼:

from scrapy import cmdline
# 執行cmd命令
cmdline.execute(['scrapy', 'crawl', 'tencent_jobs'])
♣   檢視爬取結果

使用navicat開啟表jobs,也可通過mysql命令列檢視,如下圖,
這裡寫圖片描述

注意:提示該表格沒有主鍵,這個可以自己在程式碼中新建一個id自增作為主鍵,我偷個懶。。。
這裡寫圖片描述

♣   檢查資料是否完整:

網站主頁會給出總的職位數,如下圖,
這裡寫圖片描述

該數目每天可能會發生變化,昨天是2749,mysql命令視窗使用命令查詢抓取的資料量,

use tencent_jobs;
select count(job_name) from jobs;

這裡寫圖片描述

可以看出,是完全一致的,上面網站的那個截圖是發生變化了的,只做參考,告訴大家哪裡可以找到哈。

三、總結
  1. 本文完整專案程式碼:完整示例;
  2. 能力有限,歡迎指錯交流;
  3. 拓展工作:
    1、對資料進行簡單的分析,如職位分佈、需求量等;
    2、以此為基礎,抓取其他招聘網站資訊,做招聘資訊資料庫;
    3、利用資訊庫,對招聘資訊進行主題詞或關鍵字提取,提供關鍵字做工作推薦;
    4、開始會比較難全面展開,可專注於一個小的招聘領域,如,人工智慧的招聘資訊,等等

歡迎關注個人微信公眾號WaltSmithML或新浪微博WaltSmith,公眾號提供機器學習、深度學習、Hadoop、Spark、Python、數學知識等免費視訊教程。本人主要方向為機器學習和深度學習。非常歡迎一起交流學習哈,除了學習,還可免費幫忙download論文或者書籍哈==============
♥♥♥微信公眾號♥♥♥微信公眾號WaltSmithML二維碼♥♥♥♥新浪微博WaltSmith二維碼♥♥新浪微博♥♥