当前位置 > it书童 > scrapy > 正文

初识scrapy

scrapy it书童 2019-10-04 15:19:20 0赞 0踩 267阅读 0评论

安装scrapy

python版本:3.6.6

推荐使用pyenv构建python开发环境

通过pip安装scrapy

$ pip install scrapy

查看版本

$ example scrapy
Scrapy 1.7.1 - project: example

Usage:
  scrapy <command> [options] [args]

新项目练手

二话不说,先拿个项目通走一遍scrapy的流程

网络爬虫的流程简化后就是三个步骤:

爬虫流程

百度,google的爬虫本质也是这样的原理

scrapy也一样,都是从url出发,下载页面,提取数据或链接

学爬虫就需要拿一个好的目标网站来测试,最好的网站莫过于 http://books.toscrape.com/

从域名中就可以看出这是一个专门提供给爬虫新手尝试的网站

爬虫网站

良心提示:在没掌握爬虫之前,不要随便乱爬。先在这个网站练熟后再出去浪,不然很容易翻车

我们现在的需求是抓取这个网站前五页的数据

接下来的操作不会进行具体的讲解,先跟着操作就行,后续课程会再逐一解析。现在最重要的是对scrapy有个概况了解

创建爬虫项目

$ scrapy startproject example
New Scrapy project 'example', using template directory '/home/vagrant/.pyenv/versions/3.6.6/lib/python3.6/site-packages/scrapy/templates/project', created in:
    /www/web/scrapy/example

You can start your first spider with:
    cd example
    scrapy genspider example example.com

目录结构

$ tree example
example
├── example
│   ├── __init__.py
│   ├── __pycache__
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

4 directories, 7 files

分析html结构

从源码结构中可找到我们要抓取的数据分别位于哪些元素中

拉到页面底部,点击 next 翻页,从 url(http://books.toscrape.com/catalogue/page-2.html) 中可得出翻页url的构成,只需要修改 page- 后面的数字即可

生成Spider爬虫

执行以下命令生成 BooksSpider 负责抓取数据

$ scrapy genspider books books.toscrape.com
Created spider 'books' using template 'basic' in module:
  example.spiders.books

自动生成了 example/example/spiders/books.py 文件,代码为下:

# -*- coding: utf-8 -*-
import scrapy


class BooksSpider(scrapy.Spider):
    name = 'books'
    allowed_domains = ['books.toscrape.com']
    start_urls = ['http://books.toscrape.com/']

    def parse(self, response):
        pass

将这个文件改为:

# -*- coding: utf-8 -*-
import scrapy


class BooksSpider(scrapy.Spider):
    # 爬虫名称,即爬虫的惟一标识
    name = 'books'
    allowed_domains = ["books.toscrape.com"]
    # 爬虫的起始爬取点
    start_urls = ['http://books.toscrape.com/']

    """
        爬虫将页面下载后,默认调用的解析方法: 该方法实现两个任务
        1. 提取页面中的数据
        2. 提取页面中的链接,并对这些链接发起请求
        该函数通常是实现一个生成器,由yield语句提交给scrapy引擎
    """
    def parse(self, response):
        # 提取数据
        for book in response.css('article.product_pod'):
            # 书名
            name = book.css('h3 a::attr(title)').extract_first()
            # 价格
            price = book.css('p.price_color::text').extract_first()
            yield {
                'name': name,
                'price': price,
            }

        # 提取下一页的链接
        next_url = response.css('ul.pager li.next a::attr(href)').extract_first()
        if next_url:
            # 构造绝对路径
            next_url = response.urljoin(next_url)
            # 下一页url继续回调parse方法解析
            yield scrapy.Request(next_url, callback=self.parse)

执行数据抓取, 并将结果保存到 books.csv 文件中

$ scrapy crawl books -o books.csv

程序运行结束后,可看到在项目目录下生成了 books.csv 文件

数据结果

以上就是一个极简的爬虫,只需要廖廖几行代码就能实现强大的功能。然而,与后面scrapy的其他功能相比,这只是皮毛罢了。

对于scrapy的力量,你还是一无所知...

转载须注明出处:https://www.itshutong.com/articles/133/first-acquaintance-with-scrapy
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
发表评论
我有句话,不知当讲不当讲?
要讲之前请先 登录