利用scrapy輕鬆爬取招聘網站資訊並存入MySQL
前言 |
- Scrapy版本:1.4;
- Python版本:3.6;
- OS:win10;
- 本文完整專案程式碼:完整示例;
- 本文目標:
通過爬取騰訊招聘網站招聘崗位,熟悉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、利用資訊庫,對招聘資訊進行主題詞或關鍵字提取,提供關鍵字做工作推薦;
4、開始會比較難全面展開,可專注於一個小的招聘領域,如,人工智慧的招聘資訊,等等
歡迎關注個人微信公眾號WaltSmithML或新浪微博WaltSmith,公眾號提供機器學習、深度學習、Hadoop、Spark、Python、數學知識等免費視訊教程。本人主要方向為機器學習和深度學習。非常歡迎一起交流學習哈,除了學習,還可免費幫忙download論文或者書籍哈==============
♥♥♥微信公眾號♥♥♥♥♥♥♥♥♥新浪微博♥♥