Python爬虫——7.Scrapy框架

一. scrapy概述

官方网站:http://scrapy.org [orginzation]

使用Python开发的主要进行数据采集的一个应用程序框架,核心使用它来进行爬虫程序的快速开发,底层使用了twisted异步模块,所以在进行数据采集下载时效率非常高!

1.ubuntu/macos 下,在有完善的python环境的基础上直接安装 scrapy

2.windows下:注意~安装分两步进行

①先安装scrapy

# 管理员身份运行cmd窗口

pip install scrapy

or

easy_install scrapy

PS:注意

安装完scrapy之后,可以正常的进行scrapy项目的开发,但是在windows上运行项目会出现问题,如果出现类似于WinError这样的的问题,请安装下面的模块

②安装win32

# 需要安装一个pypiwin32模块,用于scrapy模块可能调用win底层C库进行函数操作

pip install pypiwin32

二、 项目开发——创建scrapy项目

1.通过执行如下命令,来创建scrapy项目

# 通过scrapy命令,加上startproject选项,创建一个名称为spider_name的爬虫项目

scrapy startproject <spider_name>

pycharm中直接运行工具中的cmd终端窗口,执行如下命令创建一个爬虫项目

scrapy startproject myspider

注意:关于终端窗口、命令窗口、shell窗口

windows系统中:终端窗口、命令窗口 -> cmd窗口

新系统中win10:shell窗口->power shell->可以执行常见的linux命令

终端窗口~Terminal

ubuntu(like linux/unix)系统中:终端~shell->shell命令窗口

Terminal->shell窗口

Mac OS: 终端->shell窗口

创建好的项目文件结构如下:

|-- myspider/  项目根目录

    |-- scrapy.cfg  项目配置文件 [cfg: config]

|-- myspider/  爬虫 模块->以后的爬虫程序开发都在这个模块中

|-- spiders/   爬虫程序所在的目录

|-- items.py   采集的数据->定义封装模型类的模块

|-- pipelines.py 采集的数据->采集完成之后进行数据验证、存储的模块

|-- middlewares.py 中间件定义的模块

|-- settings.py 项目设置模块

2. 开发爬虫程序

准备工作,分三步进行

(1) 分析爬虫要采集的url地址,分析采集的数据字段

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=1

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=2

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=3

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=4

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=5

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=6

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=7

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=8 


招聘岗位:job

发布公司:company

薪水待遇:salary

item.py文件:


(2) 定义采集的字段封装的Item类型,在items.py模块中,定义Item

我们通过scrapy项目中的items.py模块定义封装采集数据字段的类型

为了能使用scrapy提供的各种内置功能,让定义的类型继承自scrapy.Item类型;类型中的字段属性通过scrapy.Field()进行定义!

import scrapy

class ZhilianItem(scrapy.Item):
    '''
    自定义封装智联招聘的item类型,用于封装采集到的智联网站的数据
    '''
    # 定义属性字段
    job = scrapy.Field()
    company = scrapy.Field()
    salary = scrapy.Field()

(3).在spiders/zhilianspider.py中开发爬虫程序,采集初步数据

为了可以直接使用scrapy内置的爬虫操作,让scrapy自动采集数据,我们需要定义一个爬虫处理类

spiders/zhilianspider.py模块中定义ZhilianSpider类型

继承自scrapy.Spider

类型中的属性:name属性~爬虫名称,用于在命令行启动爬虫时调用

类型中的属性:start_urls属性~采集数据的初始url地址[列表、元组]

类型中的属性:allowed_domains属性~采集数据的网站域名限制

 类型中的方法:parse(self, response)采集完数据之后自动执行的函数

spiders/zhilianspider.py文件
# -*-coding:utf-8 -*-
'''
为了可以直接使用scrapy内置的爬虫操作,让scrapy自动采集数据,我们需要定义一个爬虫处理类
spiders/zhilianspider.py模块中定义ZhilianSpider类型,继承自scrapy.Spider
类型中的属性:name属性~爬虫名称,用于在命令行启动爬虫时调用
类型中的属性:start_urls属性~采集数据的初始url地址[列表、元组]
类型中的属性:allowed_domains属性~采集数据的网站域名限制
类型中的方法:parse(self, response)采集完数据之后自动执行的函数
'''
import scrapy
from .. import items

class ZhilianSpider(scrapy.Spider):
    name = 'zlspider'
    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=cab76822e6044ff4b4b1a907661851f9&p=1 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=2 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=3 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=4 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=5 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=6 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=7 ",
    "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&sg=cab76822e6044ff4b4b1a907661851f9&p=8 ")
    allowed_domains='zhaopin.com'

    def parse(self, response):
        # 采集到的数据就在response,定义专门保存items对象即数据对象的列表
        job_items=[]
        # xpath语法,先筛选出智联招聘每一条招聘信息,即每一行
        job_list=response.xpath("//div[@id='newlist_list_content_table']/table[position()>1]/tr[1]")
        for select in job_list:
            # 在进行第一次筛选后进行进一步的筛选,依次筛选出职位信息,公司名称,职位月薪,结合网页中源代码
            job_name=select.xpath("td[@class='zwmc']/div/a/text()").extract()[0]
            company = select.xpath("td[@class='gsmc']/a/text()").extract()[0]
            salary = select.xpath("td[@class='zwyx']/text()").extract()[0]
            # 实例化items对象
            job_item=items.ZhilianItem()
            job_item['job_name']=job_name
            job_item['company']=company
            job_item['salary']=salary
            job_items.append(job_item)
        # 这个方法是将数据保存在本地文件中
        # 将列表返回,通过python2 -m scrapy crawl zlspider -o job.csv
        # 可以将数据保存在名为job.csv文件,即表格文件中,文件后缀名可选的有csv/json/jl/jsonline        #return job_items
        # 文件打开如下:

            # 将数据交给Pipelines模块
            yield  job_item

3.数据处理

核心:在pipelines.py模块中,定义处理Item数据的Piplelines,将数据存储到数据库中给其他项目做数据准备。需要注意的是在这里定义的任意的Pipelines类型都需要在settings.py 文件中修改配置注册,这样在爬虫程序中yield数据模型才知道要将数据交给哪个类型。

# -*- 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
# 导入数据库引擎对象
from sqlalchemy import create_engine
# 导入会话构建对象
from sqlalchemy.orm import sessionmaker
# 替换mysqldb模块
import pymysql
pymysql.install_as_MySQLdb()

class MyspiderPipeline(object):
    def process_item(self, item, spider):
        return item

class ZhilianPipeline(object):
    '''
    处理智联招聘数据的pipeline,负责最终的数据验证和数据存储
    '''
    def __init__(self):
        '''
        初始化对象数据:可以用于初始化资源
            如:打开文件、打开数据库连接等等操作
        '''
        self.engine = create_engine("mysql://root:@localhost/py1709_spider?charset=utf8", encoding="utf8")
        Session = sessionmaker(bind=self.engine)
        self.session = Session()

    def open_spider(self, spider):
        '''
        爬虫开启时需要调用的函数,经常用于数据初始化
        :param spider:
        :return:
        '''
        pass

    def close_spider(self, spider):
        '''
        爬虫程序关闭时自动调用的函数
        经常用于做一些资源回收的工作,如:关闭和数据库的会话连接
        :param spider:
        :return:
        '''
        self.session.close()

    def process_item(self, item, spider):
        '''
        该函数会在爬虫采集并封装好Item对象时自动调用
        函数中针对item数据进行验证和存储
        :param item:
        :param spider:
        :return:
        '''
        print ">>>>>>>>>>>>>>>>zhilian pipelines in woking......."
        # 定义sql语句
        sql = "insert into job(job, company, salary) values('%s', '%s', '%s')"\
                % (item['job'], item['company'], item['salary'])
        # 执行sql语句
        self.session.execute(sql)
        # 提交数据
        self.session.commit()

二.总结:scrapy完整的项目流程

 1.创建爬虫项目[可以包含多个爬虫程序]

scrapy startproject myspider

2.定义采集数据的Item封装类型

修改myspider/items.py,添加ZhilianItem,继承scrapy.Item属性通过scrapy.Field()定义

3..开发爬虫程序

 在myspider/spiders/添加zhilianspider.py模块,定义ZhilianSpider类型【爬虫程序】,继承scrapy.Spider

属性定义:

 name属性:爬虫名称,用于在命令行启动指定爬虫使用

 allowed_domains属性:域名限制~限制爬虫只能在某个域名下进行数据采集

start_urls属性:元组/列表,定义了所有初始采集数据的url路径

方法定义:

parse(self, response)函数:函数中的response参数接受了下载模块采集到的url中的数据

 这个函数中,可以进行数据的xpath/re/css选择器进行筛选

 将筛选得到的数据,封装在ZhilianItem对象中

 通过协程的方式将item对象交给pipelines.py模块进行处理

yield item

4.开发管道模块

4-1 修改myspider/pipelines.py模块,添加ZhilianPipleline类型

 初始化函数:__init__(self):主要用于进行资源的初始化操作,如打开文件、打开和数据库的连接等等,有必要编写

初始化了sqlalchemy的数据库连接

程序启动调用函数:open_spider(self, spider):当spider爬虫启动的时候自动调用的函数,也经常用于精确的资源初始化工作,一般不

 程序关闭调用函数:close_spider(self, spider):当spider爬虫关闭的时候自动调用的函数,经常用于资源的回收,如关闭打开的文件、关闭数据库连接等等,有必要编写

  如:关闭了sqlalchemy的数据库连接

 数据存储核心函数:process_item(self, item, spider):核心处理函数,进行采集到的数据item中的实际数据的验证、存储工作,必须写

  通过sqlalchemy进行了数据的存储

4-2 修改myspider/settings.py设置文件,添加ITEM_PIPELINES = []配置选项中,将我们自定义的ZhilianPipeline注册给scrapy

总结scrapy框架流程图:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值