第一章 初识Scrapy

Scrapy

1. 什么是爬虫

网络爬虫是指在互联网上自动爬取网站内容信息的程序,也被称作网络蜘蛛或网络机器人.

一个网络爬虫的基本执行流程可以总结为:

  1. 下载页面

    一个网页的内容本质上就是一个HTML文本,爬取一个网页内容之前,首先要根据网页的URL下载网页.
    
  2. 提取页面中的数据

    HTML下载完成后,对页面中的内容进行分析,并提取出需要的数据,提取的数据可以以多种形式保存起来,CSV/JSON/数据库
    
  3. 提取页面中的链接

    通常要获取的数据分布在多个页面中,这些页面彼此联系,一个页面中可能包含一个或多个到其他页面的链接,提取完当前页面中的数据后,还要把页面中的某些链接也提取出来,然后对链接页面进行爬取(循环步骤1)
    

    设计爬虫程序时,还要考虑防止重复爬取相同页面(URL去重),网页搜索策略(深度优先或广度优先等),爬虫访问边界限定等一系列问题.

2. Scrapy简介

  • 简单易用
  • 灵活易拓展
  • 开发社区活跃

安装

pip install scrapy

3. 第一个Scrapy爬虫

  1. 项目需求

    爬取`http://books.toscrape.com`的图书信息
    
  2. 创建项目

    scrapy startproject example(项目名称)

    创建好一个名为example的项目

  3. 分析页面

    1. 数据信息
      chrmoe浏览器打开http://books.toscrape.com,选择一本书右键,选择检查,查看其HTML代码

    可以看到,每一本书的信息都包裹在<article class="product_pod">元素中,
    书名信息在其下 <h3><a>元素的title属性中,
    书价信息在其下 <p class="price_color"> 元素的文本中,

    1. 链接信息

      可以通过单击next按钮访问下一页,选中页面下方的next按钮并右击”检查”,查看其HTML代码,可以得知下一页的URL在 ul.pager > li.next > a 元素的href属性中

  4. 实现Spider

在Scrapy中编写爬虫,即实现一个scrapy.Spider的子类.

实现爬虫的Python文件位于example/spiders目录下,在该目录下创建新文件book_spider.py,其代码如下:

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


class BooksSpider(scrapy.Spider):
    # 每个爬虫的唯一标示
    name = 'books'

    # 定义爬虫爬取的起始点,起始点可以是多个,这里只有一个
    start_urls = ['http://books.toscrape.com/']

    def parse(self, response):
        # 提取数据
        # 每一本书的信息在<article class="product_pod">中,我们使用 css()方法找到所有这样的article元素,并依次迭代
        for book in response.css('article.product_pod'):
            # 书名信息在 article > h3 > a 元素的title属性
            # 例如 <a title = "A Light in the Attic">A Light in the...</a>
            name = book.xpath('./h3/a/@title').extract_first()

            # 书价信息在<p class="price_color">的Text中
            price = book.css('p.price_color::text').extract_first()
            yield {
                'name': name,
                'price': price,
            }

            # 提取链接
            # 下一页的url在 ul.pager > li.next > a 里面
            next_url = response.css('ul.pager li.next a::attr(href)').extract_first()
            if next_url:
                # 如果找到下一页的url,得到绝对路径,构造新的Response对象
                next_url = response.urljoin(next_url)
                yield scrapy.Request(next_url, callback=self.parse)
  • name 属性

    一个Scrapy项目中可能有多个爬虫,每个爬虫的name属性是其自身的唯一标识,在一个项目中不能有同名的爬虫
    
  • start_urls 属性

    一个爬虫总要从某个(或某些)页面开始爬取,我们称这样的页面为起始爬取点,
    start_urls 属性用来设置一个爬虫的起始爬取点.
    
  • parse 方法

    当一个页面下载完成后,Scrapy引擎会回调一个我们指定的页面解析函数(默认为parse方法)解析页面.
    一个页面解析函数通常需要完成两个任务:
        提取页面中的数据(使用XPath或CSS选择器)
        提取页面中的链接,并产生对链接页面的下载请求
    

页面解析函数通常被实现成一个生成器函数,每一项从页面中提取的数据以及每一个对链接页面的下载请求都由yield语句提交给Scrapy引擎

  1. 运行爬虫

    scrapy crawl <SPIDER_NAME>
    

这里可以运行以下命令,并将数据保存到csv文件中

scrapy crawl books -o books.csv

查看books.csv文件,当当当,完成~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值