scrapy環(huán)境配置
- 首先確認(rèn)我們的電腦上已經(jīng)安裝了如下程序:
- python2.7+:windows直接安裝配置,ubuntu內(nèi)置
- lxml: 一般linux系統(tǒng)中的ubuntu中內(nèi)置了,windows需要單獨(dú)安裝
- openSSL:windows之外的系統(tǒng)默認(rèn)自帶
- 運(yùn)行命令執(zhí)行安裝
pip install scrapy
- 在windows中需要單獨(dú)安裝win32模塊,執(zhí)行如下命令安裝
pip install pypiwin32
scrapy框架.py文件分析
- 執(zhí)行如下的命令,創(chuàng)建第一個基于scrapy框架的爬蟲項(xiàng)目
scrapy startproject myspider
- 該命令會在當(dāng)前目錄下創(chuàng)建如下的目錄結(jié)構(gòu)
|-- myspider
|-- scrapy.cfg
|-- myspider/
|-- __init__.py
|-- items.py
|-- pipeline.py
|-- settings.py
|-- spiders/
|-- __init__.py
- 文件詳細(xì)信息
- scrapy.cfg---->爬蟲項(xiàng)目公共配置文件
- myspider---->爬蟲項(xiàng)目的python模塊,以后的代碼開發(fā)就在這個文件夾中
- myspider/items.py--->項(xiàng)目中定義數(shù)據(jù)的模塊items
- myspider/pipeline.py--->項(xiàng)目中數(shù)據(jù)存儲模塊pipeline
- myspider/settings.py--->項(xiàng)目中的設(shè)置文件
- myspider/spiders/..--->項(xiàng)目中存放爬蟲程序的文件夾
scrapy實(shí)戰(zhàn): 智聯(lián)招聘數(shù)據(jù)采集
-
創(chuàng)建智聯(lián)招聘數(shù)據(jù)采集爬蟲
- 在項(xiàng)目目錄中執(zhí)行如下命令,創(chuàng)建爬蟲項(xiàng)目
scrapy startproject zhilianspider -
創(chuàng)建采集數(shù)據(jù)的Item封裝類型及數(shù)據(jù)庫表
- 采集的數(shù)據(jù)要被封裝起來進(jìn)行使用,找到zhilianspider/zhilianspider/items.py修改如下內(nèi)容
# -*- 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ù)據(jù)字段 ''' # 通過scrapy.Field()函數(shù)定義屬性字段 # 工作崗位名稱 job_name = scrapy.Field() # 發(fā)布公司名稱 company = scrapy.Field() # 崗位月薪 salary = scrapy.Field()- 在數(shù)據(jù)庫中創(chuàng)建對應(yīng)的數(shù)據(jù)表,用于進(jìn)行最終的數(shù)據(jù)存儲,在數(shù)據(jù)庫中執(zhí)行如下的sql腳本
# 創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE zhilian_spider DEFAULT CHARSET 'utf8'; USE zhilian_spider; # 創(chuàng)建數(shù)據(jù)表 CREATE TABLE jobs( id INT AUTO_INCREMENT PRIMARY KEY, job_name VARCHAR(200), company VARCHAR(200), salary VARCHAR(50) ); # 初始查詢,是一張空表,無數(shù)據(jù) SELECT * FROM jobs; -
開發(fā)核心爬蟲程序
- 在爬蟲目錄中創(chuàng)建智聯(lián)爬蟲文件,并創(chuàng)建爬蟲類型進(jìn)行數(shù)據(jù)的采集
- 在zhilianspider/zhilianspider/spiders/目錄下,創(chuàng)建zhilianspider.py文件
- 在zhilianspider.py文件中,創(chuàng)建ZilianSpider類型,編輯內(nèi)容如下:
# 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ù)據(jù)采集 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ù)據(jù)存放在response中``` # 通過xpath篩選得到當(dāng)前工作列表 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模塊進(jìn)行后續(xù)數(shù)據(jù)驗(yàn)證和存儲 item = ZhilianItem() item['job_name'] = job_name item['company'] = company item['salary'] = salary yield item 管道存儲數(shù)據(jù)到數(shù)據(jù)庫
爬蟲程序采集完數(shù)據(jù)之后,需要將數(shù)據(jù)存儲在數(shù)據(jù)庫中,我們通過管道模塊進(jìn)行操作
找到并修改管道文件zhilianspier/zhilianspider/pipelines.py,創(chuàng)建智聯(lián)管道類型ZhilianPipeline,編輯內(nèi)容如下:
# -*- 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
# 進(jìn)入pymysql模塊,用于替代sqlalchemy底層的mysqldb
import pymysql
pymysql.install_as_MySQLdb()
class ZhilianPipeline(object):
'''
智聯(lián)招聘爬蟲管道模塊,進(jìn)行數(shù)據(jù)驗(yàn)證和存儲
'''
def __init__(self):
# 打開和數(shù)據(jù)庫的連接引擎,獲取連接會話對象
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ù)據(jù)并關(guān)閉數(shù)據(jù)庫連接會話
self.session.commit()
self.session.close()
- 測試運(yùn)行
- 爬蟲程序至此開發(fā)完成,在命令行中進(jìn)入爬蟲項(xiàng)目根目錄,執(zhí)行如下命令:
scrapy crawl zlspider
- 等待程序運(yùn)行結(jié)束,可以在數(shù)據(jù)庫中執(zhí)行查詢命令
select * from jobs;
- 可以查詢到已經(jīng)采集的數(shù)據(jù)信息
| id | job_name | company | salary |
|---|---|---|---|
| 1 | 數(shù)據(jù)爬蟲工程師 | 北京昆侖億發(fā)科技股份有限公司 | 10001-15000 |
| 2 | Python爬蟲產(chǎn)品設(shè)計(jì)師 | 北京阿博泰克北大青鳥信息技術(shù)有限公司 | 10001-15000 |
| 3 | 搜索爬蟲研發(fā)工程師--c++ | 中國搜索信息科技股份有限公司 | 20001-30000 |
| 4 | 數(shù)據(jù)挖掘(爬蟲方向) | 北京熱云科技有限公司 | 20000-30000 |
| 5 | 爬蟲工程師(AI算法)(031287) | 京東金融 | 面議 |
| 6 | 數(shù)據(jù)產(chǎn)品經(jīng)理(爬蟲)—外賣事業(yè)部#3975 | 北京三快在線科技有限公司 | 面議 |
| 7 | 爬蟲開發(fā)工程師 | 東旭集團(tuán) | 15001-20000 |
| 8 | 數(shù)據(jù)抓取爬蟲工程師 | 今日頭條 | 15000-30000 |
| 9 | 高級爬蟲工工程師-北京-03198 | 博彥科技股份有限公司 | 20000-30000 |
| 10 | 知名集團(tuán)公司招聘java爬蟲數(shù)據(jù)工程師 | 北京科銳國際人力資源股份有限公司 | 10001-15000 |
| 11 | 爬蟲工程師(000658) | 曠視科技face++ | 18000-36000 |
| 12 | 爬蟲工程師 | 凡普金科企業(yè)發(fā)展(上海)有限公司 | 20000-40000 |
| 13 | python爬蟲工程師 | 上海仁教信息技術(shù)有限公司 | 20001-30000 |