scrapy——进阶

一:前言

经过前面的scrapy入门基础后现在我们需要更进一步,怎么样把我们采集到的数据进行处理然后存储到数据库里呢?带着这个问题,Let`s Go

  • 首先我们需要确定我们要实现的目标任务:
    1.采集数据
    2.分析筛选数据
    3.存储到数据库

.二:开发项目

1.创建项目
scrapy startproject myspider

创建完成后得到项目目录结构如下:

《scrapy——进阶》 image.png

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&p=1'

2.分析当前页面自己想要采集的数据,并自定义字段名称,将自定义的字段封装在items.py模块中,创建item类

职位:job
公司:company
薪水:salary

import scrapy 

#定义一个类
class ZhaopinItem(scrapy.Item)

    #定义属性字段
    job = scrapy.Field()
    company = scrapy.Field()
    salary = scrapy.Field()


3.在spiders文件下创建爬虫程序

import scrapy
from .. import items

class ZhiLian(scrapy.Spider):

    #定义爬虫的名称,用于在命令中调用
    name = 'zl'

    #定义域名限制,只能爬取xxx域名下的数据
    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&p=1',

    ]

    def parse(self, response):

        '''
        采集到数据后,自动执行的函数,主要进行如下功能
                数据筛选——》封装Item对象——》传递数据给Pipelines
                    采集到的数据封装在response
        数据的采集,之前我们都是根据起始的url地址来采集当前页面的数据,那么怎么样进行深度爬取,在当前页面中筛选出下一页面的链接url地址呢
        '''
        #提取所有的数据
        job_list = response.xpath("//div[@id='newlist_list_content_table']/table[position()>1]/tr[1]")
        for jobs in job_list:
            job = select.xpath("td[@class='zwmc']/div/a").xpath('string(.)').extract()[0]
            company = select.xpath("td[@class='gsmc']/a/text()").extract()[0]
            salary = select.xpath("td[@class='zwyx']/text()").extract()[0]
            #封装成item对象
            item = items.ZhilianItem()
            item['job'] = job
            item['company'] = company
            item['salary'] = salary
            #将本次生成的item对象交给pipeline进行处理
            yield item
  
        #这里已经完成爬取当前起始URL地址所在页面数据了,下面就是根据这个地址进行链接跟踪,循环爬取
        #获取当前页面里其他页面url地址链接
        page_list = response.xpath('//div[@class="pagesDown"]/ul/li/a/@href').extract()
        for next_page in page_list:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)#调用scrapy的底层操作,就是这么easy的进行了多个页面爬取


4.数据处理:开发管道模块
在pipelines.py模块中定义处理Item数据的pipelines,将数据存储到数据库中

#导入数据库引擎对象
from sqlalchemy import create_engine

#导入会话构建对象
from sqlalchemy.orm import sessionmaker

#替换MySQldb模块
import pymysql
pymysql.install_as_MySQLdb()

class ZhilianPipeline(object):
    #处理智联招聘数据的pipeline,负责最终的数据验证和数据存储

    def __init__(self):
        '''
        初始化对象数据:可以用于初始化资源
            如:打开文件,打开数据库连接等操作
        '''
        #创建连接数据库引擎
        self.engine = create_engine('mysql://root:123456@localhost/spider_zhilian?charset=utf8')
        Session = sessionmaker(bind=self.engine)
        self.session = Session()

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

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

    def process_item(self, item, spider):
        '''
        该函数会在爬虫采集并封装好的Item对象时自动调用
        函数针对item数据进行验证和存储
        :param item:
        :param spider:
        :return:
        '''
        #定义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()


5.在setting.py设置模块中注册pipeline

ITEM_PIPELINES = {
   # 'myspider.pipelines.MyspiderPipeline': 300,
   'myspider.pipelines.ZhilianPipeline': 300,
}

3.运行项目程序

在命令行里切换到项目根目录文件路径下,然后在命令行里运行:
scrapy crawl + name 定义爬虫的名称
如:scrapy crawl zl 这样项目就启动了

三:小结

  • 实现完整的爬虫项目需要以下步骤:
1.创建项目
            scrapy startproject +项目名称

2.开发爬虫程序
      a.字段封装在items.py模块中,创建item类

      b.在spiders文件下创建爬虫程序
                   #在项目根目录下,命令行里运行以下命令可以快速创建爬虫程序
                    scrapy genspider +爬虫名称(name) + 域名限制(allowed_domains)

      c.数据处理:开发管道模块pipelines.py

      d.在setting.py设置模块中注册pipeline

3.运行项目
          scrapy crawl + 爬虫名称(name)

看到这里说明你已经进阶了,下面就可以进行scrapy的深度操作了

未完待续……

    原文作者:骑着蜗牛去追你
    原文地址: https://www.jianshu.com/p/7928fe620c17
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞