【爬虫】4.3 Scrapy 爬取与存储数据

这篇具有很好参考价值的文章主要介绍了【爬虫】4.3 Scrapy 爬取与存储数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 建立 Web 网站

2. 编写数据项目类

3. 编写爬虫程序 MySpider

4. 编写数据管道处理类

5. 设置 Scrapy 的配置文件


        从一个网站爬取到数据后,往往要存储数据到数据库中,scrapy 框架有十分方便的存储方法,为了说明这个存储过程,首先建立一个简单的网站,然后写一个 scrapy 爬虫程序爬取数据,最后存储数据。

1. 建立 Web 网站

        这个网站有一个网页,返回基本计算机教材数据,Flask程序

服务器 server.py 如下:

import flask

app = flask.Flask(__name__)


@app.route("/")
def index():
    html = """
    <books>
    <book>
        <title>Python程序设计</title>
        <author>James</author>
        <publisher>清华大学出版社</publisher>
    </book>
    <book>
        <title>Java程序设计</title>
        <author>Robert</author>
        <publisher>人民邮电出版社</publisher>
    </book>
    <book>
        <title>MySQL数据库</title>
        <author>Steven</author>
        <publisher>高等教育出版社</publisher>
    </book>
    </books> 
    """
    return html


if __name__ == "__main__":
    app.run()

        访问这个网站时返回 xml 的数据,包含教材的名称、作者、与出版社

2. 编写数据项目类

        程序要爬取的数据是多本教材,每本教材有名称与作者,因此要建 立一个教材的类,类中包含教材名称title、作者author与出版社 publisher。在 scrapy 框架中有的.\example\Test\Test 目录下 有一个文件 items.py 就是用来设计数据项目类的,打开这个文件,改造文件成如下形式:

改造前:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class TestItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

改造后:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class BookItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    author = scrapy.Field()
    publish = scrapy.Field()

        其中 BookItme 是我们设计的教材类,这个类必须从 scrapy.Item 类继承,在类中定义教材的字段项目,每个字段项目都是一个 scrapy.Field 对象,这里定义了3个字段项目,用来存储教材名称 title、作者 author、出版社 publisher。

        如果item是一个BooItem的对象,那么可以通过item["title"]、 item["author"]、item["publisher"]来获取与设置各个字段的值,例如:

        item=BookItem()

        item["title"]="Python程序设计"

        item["author"]="James"

        item["publisher"]="清华大学出版社"

        print(item["title"])

        print(item["author"])

        print(item["publisher"])

3. 编写爬虫程序 MySpider

        数据的项目设计好后就可以编写爬虫程序(.\example\Test\Test\spiders\MySpider.py)

爬虫程序 MySpider.py 如下:

import scrapy
from ..items import BookItem


class MySpider(scrapy.Spider):
    name = "mySpider"
    start_urls = ['http://127.0.0.1:5000']

    # 回调函数
    def parse(self, response, **kwargs):
        try:
            data = response.body.decode()
            # 爬取数据
            selector = scrapy.Selector(text=data)
            books = selector.xpath("//book")
            for book in books:
                item = BookItem()
                item["title"] = book.xpath("./title/text()").extract_first()
                item["author"] = book.xpath("./author/text()").extract_first()
                item["publisher"] = book.xpath("./publisher/text()").extract_first()
                yield item
        except Exception as err:
            print(err)

        这个程序访问 http://127.0.0.1:5000 的网站,得到的网页包含教材信息, 程序过程如下:

(1)

from ..items import BookItem

从Test文件夹的items.py文件中引入BookItem类的定义。

(2)

data=response.body.decode()

selector=scrapy.Selector(text=data)

books=selector.xpath("//book")

得到网站数据并建立Selector对象,搜索到所有的<book>节点的元素。

(3)

for book in books:

        item=BookItem()

        item["title"]=book.xpath("./title/text()").extract_first()

        item["author"] = book.xpath("./author/text()").extract_first()

        item["publisher"] = book.xpath("./publisher/text()").extract_first()

        yield item

        对于每个<book>节点,在它下面搜索到<title>节点,取出它的文本即教材名称, 其中注意使用book.xpath("./title/text()")搜索到<book>下面的<title>节点的文本,一定不能少"./"的部分,它表示从当前节点<book>往下搜索。同样道理搜 索<author>、<publisher>节点的文本,它们组成一个BookItem对象,这个对象通过语句: yield item 向上一级调用函数返回,接下来scrapy会把这个对象推送给与items.py同目录下的 pipelines.py文件中的数据管道,执行类取处理数据。

4. 编写数据管道处理类

        在我 scrapy框架中有的 .\example\Test\Test 目录下有一个文件 pipelines.py 就是用来数据管道处理类文件,打开这个文件可以看到一个 默认的管道类

默认数据管道类 pipelines.py如下:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


class TestPipeline:
    def process_item(self, item, spider):
        return item

修改并设计数据管道类 pipelines.py如下:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


class BookPipeline(object):
    count = 0

    def process_item(self, item, spider):
        BookPipeline.count += 1
        try:
            if BookPipeline.count == 1:
                fobj = open("books.txt", "wt")
            else:
                fobj = open("books.txt", "at")
            print(item["title"], item["author"], item["publisher"])
            fobj.write(item["title"] + "," + item["author"] + "," + item["publisher"] + "\n")
            fobj.close()
        except Exception as err:
            print(err)
        return item

        这个类我们命名为 BookPipeline,它继承自object类,类中最重要的函数是process_item函数,scrapy 爬取数据开始时会建立一个 BookPipeline 类对象,然后每爬取一个数据类BookItem项目item,MySpider程序会把这个对象推送给BookPipeline对象,同时调用process_item函数一次。 process_item 函数的参数中的item就是推送来的数据,于是,便可以在这个函数中保存爬取的数据了。注意scrapy要求process_item函数最后返回这个item对象。

        在这个程序中采用文件存储爬取的数据,BookPipeline 类中先定义一个类成员count=0,用它来记录process_item调用的次数。如果是第一次调用(count=1)那么就使用语句fobj=open("books.txt","wt") 新建立一个books.txt的文件,然后把item的数据写到文件中。如果不是第一次调用(count>1),就使用语句fobj=open("books.txt","at")打开已经存在的文件books.txt,把item的数据追加到文件中。这样我们反复执行爬虫程序的过程,保证每次清除掉上次的数据,记录本次爬取的数据。

5. 设置 Scrapy 的配置文件

        MySpider爬虫程序执行后每爬取一个 item 项目都会推送到 BookPipelines类并调用的process_item 函数,那么 scrapy 怎么样知道要这样做呢?前提是我们必须设置这样一个通道。 在Test 文件夹中有一个 settings.py 的设置文件,打开这个文件可以看到很多设置项目,大部分是用#注释的语句,找到语句ITEM_PIPLINES的项目, 把它设置成如下形式:

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   "Test.pipelines.TestPipeline": 300,
}

        其中 ITEM_PIPLINES 是一个字典,把关键字改成 Test.pipelines.BookPipeline',而BookPipelines 就是在 pipelines.py 文件中设计的数据管道类的名称,后面的300是一个默认的整数,实际上它可以不是300,它可以是任何整数。

        设置完成后就连通了爬虫程序 MySpider 数据管道处理程序 pipelines.py 的通道,scrapy工作时会把 MySpider 爬虫程序通过yield返回的每项数据推送给 pipelines.py 程序的 BookPipeline 类,并执行 process_item 函数,这样就可以保存数据了。

总结:

        scrapy把数据爬取与数据存储分开处理,它们都是异步执行的, MySpider.py 每爬取到一个数据项目 item,就 yield 推送给 pipelines.py 程序存储; 等待存储完毕后,又再次爬取另外一个数据项目 item,再次 yield 推送到 pipelines.py 程序,然后再次存储, ......, 这个过程一 直进行下去,直到爬取过程结束,文件 books.txt 中就存储了所有的爬取数据了。


下一篇文章:4.4 Scrapy 爬取网站数据文章来源地址https://www.toymoban.com/news/detail-487570.html

到了这里,关于【爬虫】4.3 Scrapy 爬取与存储数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)

      1.终端运行scrapy startproject movie,创建项目 2.接口查找  3.终端cd到spiders,cd scrapy_carhome/scrapy_movie/spiders,运行 scrapy genspider mv https://dy2018.com/ 4.打开mv,编写代码,爬取电影名和网址 5.用爬取的网址请求,使用meta属性传递name ,callback调用自定义的parse_second 6.导入ScrapyMovieItem,将movie对象

    2024年02月19日
    浏览(16)
  • python爬虫实战 scrapy+selenium爬取动态网页

    最近学习了scrapy爬虫框架,想要找个目标练练手。由于现在很多网页都是动态的,因此还需要配合selenium爬取。本文旨在记录这次学习经历,如有疑问或不当之处,可以在评论区指出,一起学习。 对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的

    2024年02月07日
    浏览(37)
  • Python爬虫之Scrapy框架系列(23)——分布式爬虫scrapy_redis浅实战【XXTop250部分爬取】

    先用单独一个项目来使用scrapy_redis,讲解一些重要点!

    2024年02月16日
    浏览(16)
  • 使用PyCharm编写Scrapy爬虫程序,爬取古诗词网站

    本次测试案例参考厦门大学数据库实验室 链接: https://dblab.xmu.edu.cn/blog/3937/ 在PyCharm中新建一个名称为“scrapyProject”的工程,如下图所示,Python解释器就选择我们之前已经安装好的 本次测试环境为 Python3.7.6 在“scrapyProject”工程底部打开Terminal窗口(如下图所示),在命令提示

    2024年02月11日
    浏览(14)
  • 豆瓣读书网站的数据爬取与分析

    目录 Python应用程序设计 豆瓣读书网站的数据爬取与分析 一、 项目背景与需求分析 二、数据抓取与分析 三、数据库设计 四、展示系统 选题背景 本设计作品选取了豆瓣读书网站,主要爬取的是豆瓣读书的TOP250,通过爬取的数据进行对信息的进一步的数据分析。豆瓣读书TOP25

    2024年02月09日
    浏览(22)
  • Python网络爬虫逆向分析爬取动态网页、使用Selenium库爬取动态网页、​编辑将数据存储入MongoDB数据库

    目录 逆向分析爬取动态网页 了解静态网页和动态网页区别 1.判断静态网页  2.判断动态网页  逆向分析爬取动态网页 使用Selenium库爬取动态网页 安装Selenium库以及下载浏览器补丁 页面等待  页面操作 1.填充表单 2.执行JavaScript 元素选取 Selenium库的find_element的语法使用格式如下

    2024年02月15日
    浏览(31)
  • python爬虫进阶篇:Scrapy中使用Selenium模拟Firefox火狐浏览器爬取网页信息

    接着上一篇的笔记,Scrapy爬取普通无反爬、静态页面的网页时可以顺利爬取我们要的信息。但是大部分情况下我们要的数据所在的网页它是动态加载出来的(ajax请求后传回前端页面渲染、js调用function等)。这种情况下需要使用selenium进行模拟人工操作浏览器行为,实现自动化

    2024年02月04日
    浏览(13)
  • Python爬虫之Scrapy框架系列(21)——重写媒体管道类实现保存图片名字自定义及多页爬取

    spider文件中要拿到图片列表并yield item; item里需要定义特殊的字段名:image_urls=scrapy.Field(); settings里设置IMAGES_STORE存储路径,如果路径不存在,系统会帮助我们创建; 使用默认管道则在s

    2024年02月10日
    浏览(16)
  • 分享一个Python Django影片数据爬取与数据分析系统源码

    💕💕 作者:计算机源码社 💕💕 个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕💕 学习资料、程序开发、技术解答、文档报告 💕💕JavaWeb项目 💕💕微信小程序项目 💕💕Python项目 💕💕

    2024年02月09日
    浏览(13)
  • 基于Python+django影片数据爬取与数据分析设计与实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 2022-2024年

    2024年02月05日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包