美文网首页
【爬虫】-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