美文网首页
【爬虫】-010-Scrapy-简单上手

【爬虫】-010-Scrapy-简单上手

作者: 9756a8680596 | 来源:发表于2019-02-18 21:49 被阅读0次

    说到爬虫尤其是python爬虫,不得不说到Scrapy这个开源框架,关于它的介绍可查看这里。今天先来一个简单的示例,来建立一个初步的印象。

    首先,你需要在系统中安装Scrapy库,然后才可以使用它。

    1.交互式命令行上手Scrapy

    scarpy shell URL
    view(response)
    response.xpath().extract()
    

    2.用Scrapy爬虫进行数据抓取

    • 首先,通过命令行创建Scrapy项目: scrapy startproject ganjizufang
    • 然后,使用Pycharm导入项目目录
    • 接着,在开始用Scrapy写代码前,先来熟悉下项目中文件
      Scrapy项目目录结构

    init.py --> 保持默认不需要修改
    items.py --> 项目类文件,即爬虫获取数据后传入管道文件(pipelines.py)的载体
    pipelines.py --> 项目管道文件,对传入项目类文件中的数据进行清理,并进行数据库操作
    settings.py --> 项目配置文件,例如下载延迟\项目管道文件中类对启用和自定义中间件对启用和顺序等
    spiders目录 --> 刚开始里面只有一个init.py文件,在该目录下定义爬虫类,并继承scapy.Spider
    middlewares.py --> 配置项目中间件文件

    • 接下来,在spiders目录中创建爬虫文件ganji.py,一般来说,爬虫文件需要继承scrapy.Spider类,然后进行创建爬虫名称、开始爬取的链接以及页面解析函数等工作,具体代码如下:
    import scrapy
    
    class GanjiSpider(scrapy.Spider):
        # 创建爬虫名称,爬虫名不是项目名
        name = 'ganjizufang'
    
        # 爬虫启动后自动爬取的URL,列表内可放多个链接
        start_urls = ['http://hz.ganji.com/zufang/pn1/', 'http://hz.ganji.com/zufang/pn2/']
    
        # 爬虫启动后,爬取链接成功后自动回调的函数
        # 默认参数:self 和 response必传
        def parse(self, response):
            # 查看response内容
            print(response)
    
            # 获取页面数据元素
            titles = response.xpath('//dl[@class="f-list-item-wrap min-line-height f-clear"]/dd[@class="dd-item title"]/a/@title').extract()
            prices = response.xpath('//div[@class="price"]/span[1]/text()').extract()
    
            # # 格式化输出元素
            # for title, price in zip(titles, prices):
            #     print(title, ': ', price)
    
    • 爬虫文件编写完成后,通过Pycharm命令行终端查看爬虫列表:scrapy list
    • 执行爬虫程序:scrapy crawl ganjizufang,这里是爬虫的名称而不是项目名称

    3.将Scrapy爬取的数据入库

    获取数据后,需要考虑如何将数据入库,接下来需要用到Scrapy项目中items.pypipelines.py文件。
    在开始之前,先来熟悉下sqlite相关操作,Pycharm终端中使用sqlite库`。

    3-1在Pycharm命令终端中输入ipython命令然后进入python命令行界面

    import sqlite3
    
    # 使用sqlite链接数据库名称,如果不存在则新建数据库
    # 这个操作会在项目文件中同步创建数据库文件
    gjzf = sqlite3.connect('gjzf.sqlite')
    
    # 继续在pycharm中的terminal使用sql语言创建数据表结构
    # 定义变量存储sql语句字符串
    create_table = 'create table gjzf (title varchar(512), money varchar(128))'
    
    # 执行sql语句
    ganjizufang.execute(create_table)
    
    • 此时,数据库文件以及数据表字段已经创建完成,需要获取并填充数据。

    3-2爬虫文件获取数据,清理数据和导入数据由pipelines.py文件来操作

    • 首先,进入settings.py文件,配置pipelines参数:ITEM_PIPELINES
    • 然后,进入items.py文件,配置容器参数
    import scrapy
    
    class GanjizufangItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()
        price = scrapy.Field()
        pass
    

    3-3修改Scrapy爬虫文件,将获取的数据变量放到items.py定义的容器

    import scrapy
    from ..items import GanjizufangItem
    
    class GanjiSpider(scrapy.Spider):
        # 创建爬虫名称不等于项目名称
        name = 'ganjizufang'
    
        # 爬虫启动后自动爬取的URL,列表内可放多个链接
        start_urls = ['http://hz.ganji.com/zufang/pn1/', 'http://hz.ganji.com/zufang/pn2/']
    
        # 爬虫启动后,爬取链接成功后自动回调的函数
        # 默认参数:self 和 response必传
        def parse(self, response):
            # 查看response内容
            print(response)
    
            # 获取页面数据元素
            titles = response.xpath('//dl[@class="f-list-item-wrap min-line-height f-clear"]/dd[@class="dd-item title"]/a/@title').extract()
            prices = response.xpath('//div[@class="price"]/span[1]/text()').extract()
    
            # # 格式化输出元素
            # for title, price in zip(titles, prices):
            #     print(title, ': ', price)
    
            # 将租房数据赋值给item示例
            gjzf = GanjizufangItem()
    
            for title, price in zip(titles, prices):
                gjzf['title'] = title
                gjzf['price'] = price
                yield gjzf
    
    

    3-4接下来通过pipelines.py管道文件,定义函数来完成数据清理和入库操作:

    • 首先,定义爬虫启动时,链接数据库的函数,主要用途是引入sqlite3库,创建数据库链接并设置游标初始位置
    • 然后,定义爬虫运行时,将数据写入数据库的函数,主要用途是将插入数据的SQL代码赋值给变量,然后执行SQL语句
    • 最后,定义爬虫结束时,关闭数据库函数,创建的链接关闭数据库
    • 补充,数据库的操作如果是更新数据需要提交,否则直接执行sql代码即可
    import sqlite3
    
    class GanjizufangPipeline(object):
        def open_spider(self, spider):
            # 定义变量,链接数据库
            self.con = sqlite3.connect('gjzf.sqlite')
            # 定义变量,设置数据库游标
            self.cu = self.con.cursor()
    
        def process_item(self, item, spider):
            # print(spider)
            insert_sql = 'insert into gjzf (title, money) VALUES ( "{}", "{}")'.format(item['title'], item['price'])
            # 游标执行sql语句
            self.cu.execute(insert_sql)
            # con需要执行提交(插入/更新/删除)操作
            self.con.commit()
            return item
    
        def spider_close(self, spider):
            self.con.close()
    
    

    相关文章

      网友评论

          本文标题:【爬虫】-010-Scrapy-简单上手

          本文链接:https://www.haomeiwen.com/subject/indweqtx.html