目标:爬取

http://books.toscrape.com"

将该网站上50页,每页20本的书的价格、等级、书名、书的ISBN号等爬取下来并保存在mongoDB数据库里面。

该网站如图:

首先建立一个爬虫项目,新建一个spider文件,name取值为"book"

class BookSpider(scrapy.Spider):
    name = 'book'

整个项目的文件结构如下


重写start_requests函数

def start_requests(self):
    url = "http://books.toscrape.com"
    yield Request(url, self.parse_urls)

再写一个callback函数——parse_urls,用于接受处理start_requests里面发出的Request请求所得到的response。该函数主要有两个功能,第一个功能是解析出“下一页”的url,第二个功能是解析出“每一页上20本书”的url;并对这些url发出请求。

来看一看这个函数怎么写

self.parse_urls:

def parse_urls(self , response):
    le = LinkExtractor(restrict_css="ul.pager li.next")leBook = LinkExtractor(restrict_css="ol.row div.image_container")next = le.extract_links(response)bookLinks = leBook.extract_links(response)# 解析每一页上20本书的links
    if bookLinks:
        for link in bookLinks:
            yield Request(link.url, self.parse_book)# 解析下一页的links
    if next:
        link = next[0].urlyield Request(link, self.parse_urls)

这里用到了LIinkExtractor,使用LinkExtractor提取出url还是很方便的。具体怎么用就不讲了。

可以看到,解析出下一页的url后,又将callback设置为self.parse_urls,继续使用该函数用来处理“下一页”;用self.parse_book函数处理每一个书本的内容页。

self.parse_book:

# 挖掘每一本书的信息
def parse_book(self , response):
    sel = response.css('div.product_main')title = sel.xpath('./h1/text()').extract_first()# 得到书名
    price = sel.css('p.price_color::text').extract_first()  # 得到书的价格
    rank = sel.css('p.star-rating::attr(class)').re_first('star-rating ([A-Za-z]+)')  # 得到书的排名等级
    sel = response.css('table.table.table-striped')ISBN = sel.xpath('(.//tr)[1]/td/text()').extract_first() # 得到书的ISBN号
    surplus = sel.xpath('(.//tr)[last()-1]/td/text()').re_first('\((\d+) available\)')  # 得到书的库存量
    reviewers = sel.xpath('(.//tr)[last()]/td/text()').extract_first()  # 得到书的reviewers数量
    single = BooksItem()single['title'] = titlesingle['price'] = pricesingle['rank'] = ranksingle['ISBN'] = ISBNsingle['surplus'] = surplussingle['reviewers'] = reviewersreturn single

self.parse_book里面使用到了BooksItem对象,BooksItem定义在items.py文件里面。

items.py

import scrapy
from scrapy import Item , Fieldclass BooksItem(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = Field()price = Field()rank = Field()ISBN = Field()surplus = Field()reviewers = Field()

分别定义了书名、价格、等级、ISBN、剩余量、观看者这六个字段。

在scrapy可以使用Item来传递数据。

写到这里可以直接使用命令“scrapy crawl book -o fileName.csv”来运行该爬虫程序了,最后数据会保存在fileName.csv文件里面。


不过前面说好了要保存在mongoDB里面呢,咱们还得修改一下piplines.py文件。在保存在数据库之前,先进行一个处理——书本去重,这里使用书名作为去重标准。

在piplines.py文件里面实现去重类:DuplicatesPipeline

# 实现书本的去重
class DuplicatesPipeline(object):
    def __init__(self):
        self.book_set = set()def process_item(self, item, spider):
        title = item['title']if title in self.book_set:
            raise DropItem("Duplicate book found: %s " % item)self.book_set.add(title)return item

这样就实现了书本去重,(注意这里的return item,它会将item数据返回给另外下一级的item pipeline继续处理,如果有的话)

去重了我还不满足,我还想将英镑转换成人民币,那么就再实现一个item pipeline——PriceConvertPipeline

# 实现书本的价格转换
class PriceConvertPipeline(object):
    exchange_rate = 8.5309

    def process_item(self, item, spider):
        # 实现货币的汇率转换
        price = float(item['price'][1:]) * self.exchange_rateitem['price'] = '¥ %.2f' % pricereturn item

然后我们再讲最后得到的item存入数据库里面

class MongoDBPipeline(object):

    @classmethod
    def from_crawler(cls, crawler):
        cls.DB_URI = crawler.settings.get('MONGO_DB_URI' , 'mongodb://localhost:27017/')cls.DB_NAME = crawler.settings.get('scrapy_data' , 'MONGO_DB_NAME')return cls()def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.DB_URI)self.db = self.client[self.DB_NAME]def close_spider(self, spider):
        self.client.close()def process_item(self, item, spider):
        collection = self.db[spider.name]post = dict(item) if isinstance(item, Item) else item
        collection.insert_one(post)return item

(每实现一个item pipeline需要在settings.py里面加入该pipeline)如图:

ITEM_PIPELINES = {'books.pipelines.DuplicatesPipeline' : 100,
    'books.pipelines.PriceConvertPipeline' : 200,
   'books.pipelines.BooksPipeline': 300,
    'books.pipelines.MongoDBPipeline' : 400,
}

后面的键值取值为0~1000,越小表示执行的优先权越大。

这样整份工作就完成了。

scrapy第一发——基础巩固相关推荐

  1. 第五章 Scrapy爬虫框架(5.1 Scrapy框架基础)

    Scrapy是一个高级Web爬虫框架,用于爬取网站并从页面中提取结构化数据.它可以用于数据挖掘.数据监控和自动化测试等多个方面.与之前讲过的Requests库和Selenium库不同,Scrapy更适 ...

  2. scrapy框架基础学习之囧事百科

    基础: 一.安装scrapy框架 pip install scrapy pip --default-timeout=2000 install -U scrapy 来下载scrapy让它的延迟检测时间变 ...

  3. Scrapy框架基础使用

    1.流程框架 2.在命令行中输入scrapy,会有scrapy常见命令参数 在命令中输入scrapy startproject quote创建一个叫quote的项目 cd到创建好的项目目录中,然后执行 ...

  4. java启动scrapy爬虫,爬虫入门之Scrapy 框架基础功能(九)详解

    Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...

  5. 小白记录:1、scrapy的基础操作

    1.命令行切换至你想要创建文件的目录: 运行中输入cmd--进入命令行 2.利用scrapy 创建爬虫文件 scrapy startproject cloud_music#输入命令,我的爬虫文件夹是c ...

  6. Scrapy的基础知识

    一.Scrapy的作用 Scrapy应该算是Python宇宙中最常用的爬虫框架了,他是一个较完善的爬虫框架,同时也是一个比较难学的框架.Scrapy多应用于中型网站内容爬取. Scrapy的优点: 提 ...

  7. 11.Scrapy框架基础-使用Scrapy抓取数据并保存到mongodb

    目录 一.Scrapy安装 1.mac系统 2.windows系统 二.使用scrapy爬取数据 1.新建一个scrapy工程 2.在spiders下新建一个爬虫文件 3.提取网页数据 三.保存数据到 ...

  8. python爬虫scrapy框架基础

    我使用的软件是pychram 最近几周也一直在学习scrapy,发现知识点比较混乱,今天来总结一下.我是按照<精通python网络爬虫核心技术框架与项目实战>这本书来写的.讲的比较简洁,想 ...

  9. Python3网络爬虫——(5)Scrapy爬虫基础

    目录 1.Scrapy常用命令行 2.Scrapy爬取内容 3.Scrapy数据提取 4.Scrapy爬取中国大陆明星 5.12306火车站站名爬取 1.Scrapy常用命令行 scrapy star ...

最新文章

  1. oracle ocr组成员替换,Oracle RAC 迁移替换 OCR 盘
  2. WPF——微软的UI革命
  3. 【代码笔记】iOS-二维码
  4. golang配置export GOPRIVATE拉取私有库代码
  5. Meteor环境安装配置
  6. vue监听对象某一个属性
  7. 计算机信息的编码教案,信息的编码教案信息的编码教案.doc
  8. 关于unique()的详解
  9. ADO.NET访问数据集的表、行和列
  10. 信息安全系统设计基础实验二:固件设计
  11. 机器学习——CART决策树——泰坦尼克还生还预测
  12. 华为模拟器eNSP下载与安装教程
  13. 白话大数据 | 从买菜这件小事来聊聊数据仓库
  14. 全国省市区mysql数据
  15. linux rm、rm -f、rm -r的区别
  16. ssm框架实现登陆页面邮箱验证
  17. 五、DML(数据操纵语句)
  18. 阿里云企业邮箱代理商:foxmal邮件发送RCPT错误怎么办?
  19. k3显示远程服务器未打开,k3客户端远程服务器链接
  20. “千元机皇” realme真我Q3系列发布 越级体验999元起

热门文章

  1. 【学习笔记】出货认证(QM模块)
  2. 34、Power Query-中国式排名
  3. SAP导出Excel错点拒绝处理
  4. 性能超强悍 戴尔 R920服务器
  5. 释疑のCONTEXTS
  6. Web Dynpro for ABAP 之 Web Dynpro Window Web Dynpro Application
  7. “五心”知“五感”,平安打造有温度的智慧城市
  8. html5里可移动线性进度条的类型怎么表示,HTML5触摸事件实现移动端简易进度条的实现方法...
  9. 威纶通触摸屏维修_威纶通WEINVIEW触摸屏维修故障检测
  10. python中的几种copy用法_Python3中copy模块常用功能及其他几种copy方式比较