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

2019-02-18  本文已影响0人  9756a8680596

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

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

1.交互式命令行上手Scrapy

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

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

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

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)

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文件来操作

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管道文件,定义函数来完成数据清理和入库操作:

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()

上一篇下一篇

猜你喜欢

热点阅读