scrapy實戰(zhàn):智聯(lián)招聘數(shù)據采集
章節(jié)內容
通過scrapy項目開發(fā)框沟,完成智聯(lián)招聘工作崗位信息的數(shù)據采集工作
課程內容
1. 創(chuàng)建智聯(lián)招聘數(shù)據采集爬蟲
在你的項目目錄中撮奏,執(zhí)行如下命令,創(chuàng)建爬蟲項目
scrapy startproject zhilianspider
2. 創(chuàng)建采集數(shù)據的Item封裝類型及數(shù)據庫表
采集的數(shù)據要被封裝起來進行使用剂桥,找到并修改zhilianspider/zhilianspider/items.py,修改內容如下:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
# 引入scrapy模塊
import scrapy
class ZhilianItem(scrapy.Item):
'''
創(chuàng)建一個Item類型,用于定義爬蟲采集的數(shù)據字段
'''
# 通過scrapy.Field()函數(shù)定義屬性字段
# 工作崗位名稱
job_name = scrapy.Field()
# 發(fā)布公司名稱
company = scrapy.Field()
# 崗位月薪
salary = scrapy.Field()
在數(shù)據庫中創(chuàng)建對應的數(shù)據表扛拨,用于進行最終的數(shù)據存儲,在數(shù)據庫中執(zhí)行如下的sql腳本
# 創(chuàng)建數(shù)據庫
CREATE DATABASE zhilian_spider DEFAULT CHARSET 'utf8';
USE zhilian_spider;
# 創(chuàng)建數(shù)據表
CREATE TABLE jobs(
id INT AUTO_INCREMENT PRIMARY KEY,
job_name VARCHAR(200),
company VARCHAR(200),
salary VARCHAR(50)
);
# 初始查詢举塔,是一張空表绑警,無數(shù)據
SELECT * FROM jobs;
3. 開發(fā)核心爬蟲程序
在爬蟲目錄中創(chuàng)建智聯(lián)爬蟲文件求泰,并創(chuàng)建爬蟲類型進行數(shù)據的采集
在zhilianspider/zhilianspider/spiders/目錄下,創(chuàng)建zhilainspider.py文件
在zhilianspider.py文件中计盒,創(chuàng)建ZhilianSpider類型渴频,編輯內容如下:
# coding:utf-8
import scrapy
from ..items import ZhilianItem
#http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=bb28054b0714445f85382f12e09c9228&p=1
class ZhilianSpider(scrapy.Spider):
'''
爬蟲核心程序開發(fā)
'''
# 定義名稱,用于命令行啟動執(zhí)行爬蟲使用
name = "zlspider"
# 定義限定域名北启,防止跨域數(shù)據采集
allowed_domains = ["zhaopin.com"]
# 初始采集URL地址
start_urls = (
"http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=bb28054b0714445f85382f12e09c9228&p=1",
)
def parse(self, response):
'''
采集處理函數(shù)卜朗,scrapy下載器采集下載的數(shù)據存放在response中
:param response:
:return:
'''
# 通過xpath篩選得到當前工作列表
job_list = response.xpath("http://div[@id='newlist_list_content_table']/table[@class='newlist'][position()>1]")
# 循環(huán)獲取每個工作信息
for job in job_list:
# 篩選工作名稱
job_name = job.xpath("tr[1]/td[@class='zwmc']/div/a").xpath("string(.)").extract()[0]
# 篩選發(fā)布公司
company = job.xpath("tr[1]/td[@class='gsmc']/a").xpath("string(.)").extract()[0]
# 篩選薪水待遇
salary = job.xpath("tr[1]/td[@class='zwyx']").xpath("string(.)").extract()[0]
# 封裝生成item對象,交給pipelines模塊進行后續(xù)數(shù)據驗證和存儲
item = ZhilianItem()
item['job_name'] = job_name
item['company'] = company
item['salary'] = salary
yield item
4. 管道存儲數(shù)據到數(shù)據庫
爬蟲程序采集完數(shù)據之后咕村,需要將數(shù)據存儲在數(shù)據庫中场钉,我們通過管道模塊進行操作
找到并修改管道文件zhilianspier/zhilianspider/pipelines.py,創(chuàng)建智聯(lián)管道類型ZhilianPipeline懈涛,編輯內容如下:
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
# 引入sqlalchemy模塊
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 進入pymysql模塊逛万,用于替代sqlalchemy底層的mysqldb
import pymysql
pymysql.install_as_MySQLdb()
class ZhilianPipeline(object):
'''
智聯(lián)招聘爬蟲管道模塊,進行數(shù)據驗證和存儲
'''
def __init__(self):
# 打開和數(shù)據庫的連接引擎批钠,獲取連接會話對象
engine = create_engine("mysql://root:@localhost/zhilian_spider?charset=utf8")
Session = sessionmaker(bind=engine)
self.session = Session()
def process_item(self, item, spider):
# 生成sql語句
zl_sql = "insert into jobs(job_name, company, salary) values('%s', '%s', '%s')" % \
(item['job_name'], item['company'], item['salary'])
# 執(zhí)行sql語句
self.session.execute(zl_sql)
return item
def close_spider(self, spider):
# 提交數(shù)據并關閉數(shù)據庫連接會話
self.session.commit()
self.session.close()
5. 測試運行
爬蟲程序至此開發(fā)完成宇植,在命令行中進入爬蟲項目根目錄,執(zhí)行如下命令:
scrapy crawl zlspider
等待程序運行結束埋心,可以在數(shù)據庫中執(zhí)行查詢命令
select * from jobs;
可以看到已經采集到如下數(shù)據:
id | job_name | company | salary |
---|---|---|---|
1 | 數(shù)據爬蟲工程師 | 北京昆侖億發(fā)科技股份有限公司 | 10001-15000 |
2 | Python爬蟲產品設計師 | 北京阿博泰克北大青鳥信息技術有限公司 | 10001-15000 |
3 | 搜索爬蟲研發(fā)工程師--c++ | 中國搜索信息科技股份有限公司 | 20001-30000 |
4 | 數(shù)據挖掘(爬蟲方向) | 北京熱云科技有限公司 | 20000-30000 |
5 | 爬蟲工程師(AI算法)(031287) | 京東金融 | 面議 |
6 | 數(shù)據產品經理(爬蟲)—外賣事業(yè)部#3975 | 北京三快在線科技有限公司 | 面議 |
7 | 爬蟲開發(fā)工程師 | 東旭集團 | 15001-20000 |
8 | 數(shù)據抓取爬蟲工程師 | 今日頭條 | 15000-30000 |
9 | 高級爬蟲工工程師-北京-03198 | 博彥科技股份有限公司 | 20000-30000 |
10 | 知名集團公司招聘java爬蟲數(shù)據工程師 | 北京科銳國際人力資源股份有限公司 | 10001-15000 |
11 | 爬蟲工程師(000658) | 曠視科技face++ | 18000-36000 |
12 | 爬蟲工程師 | 凡普金科企業(yè)發(fā)展(上海)有限公司 | 20000-40000 |
13 | python爬蟲工程師 | 上海仁教信息技術有限公司 | 20001-30000 |
6.思考~~
上面的程序我們成功的采集到了需要的數(shù)據指郁,但是問題是~我們只是針對一個url地址采集的數(shù)據,一個崗位的搜索會包含很多頁數(shù)據踩窖,怎么進行下一頁的url地址跟蹤爬取呢坡氯?
下一節(jié),深度爬蟲更加精彩洋腮,大牧期待你一起學習