scrapy——进阶

一:前言

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

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

.二:开发项目

1.创建项目
scrapy startproject myspider

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


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的深度操作了

未完待续......

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容