第八章 项目练习

项目练习

项目需求

爬取目标站点http://books.toscrape.com网站中的书籍信息

其中每一本书的信息包括:
- 书名
- 价格
- 评价等级
- 产品编码
- 库存量
- 评价数量

并将爬取的结果保存到csv文件中

编码实现

1. 创建项目

    scrapy startproject books_to_scrape

2. 创建Spider

    在spiders目录下创建 book_spider.py 文件

3. 定义书籍信息的Item类,在 items.py

```
class BookItem(scrapy.Item):
    # 书名
    name = scrapy.Field()
    # 价格
    price = scrapy.Field()
    # 评价等级,1-5星
    review_rating = scrapy.Field()
    # 评价数量
    review_num = scrapy.Field()
    # 产品编码
    upc = scrapy.Field()
    # 库存量
    stock = scrapy.Field()
```

4. 完成BooksSpider

1. 继承Spider创建 BooksSpider类
2. 为Spider取名
3. 指定起始爬取点
4. 实现书籍列表页面的解析函数
5. 实现书籍页面的解析函数
# _*_ coding:utf-8 _*_
import scrapy
from scrapy.linkextractors import LinkExtractor

from ..items import BookItem


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

    def parse(self, response):
        # xpath解析
        # for book in response.xpath('//article[@class="product_pod"]'):
        #     book_url = book.xpath('./h3/a/@href').extract_first()
        #     yield scrapy.Request(response.urljoin(book_url), callback=self.parse_book)

        # LinkExtractor解析
        le = LinkExtractor(restrict_css='article.product_pod h3')
        for link in le.extract_links(response):
            yield scrapy.Request(link.url, callback=self.parse_book)

        # 下一页:
        le = LinkExtractor(restrict_css='ul.pager li.next')
        links = le.extract_links(response)

        if links:
            next_url = links[0].url
            yield scrapy.Request(next_url, self.parse)

    def parse_book(self, response):
        book = BookItem()
        sel = response.css('div.product_main')
        book['name'] = sel.xpath('//h1/text()').extract_first()
        book['price'] = sel.xpath('//p[@class="price_color"]/text()').extract_first()
        book['review_rating'] = sel.css('p.star-rating::attr(class)').re_first('star-rating ([A-Za-z]+)')

        sel = response.css('table.table.table-striped')
        book['upc'] = sel.xpath('//tr[1]/td/text()').extract_first()
        book['stock'] = sel.xpath('//table//tr[last()-1]/td/text()').extract_first()
        book['review_num'] = sel.xpath('//table//tr[last()]/td/text()').extract_first()
        yield book

运行爬虫

    scrapy crawl books -o books.csv

爬取到了!
有个问题:csv文件中各个次序是随机的,可以在配置文件settings.py中使用 FEED_EXPORT_FIELDS指定各个的次序:

FEED_EXPORT_FIELDS = ['upc', 'name', 'price', 'stock', 'review_rating', 'review_num']

5. 编写Pipeline

结果中的评价等级字段的值是 One、Two、Three…等单词,想把他们转成数字格式,
大材小用了, - - 就当复习下Pipeline好了

class BookPipeline(object):
    review_rating_map = {
        'One': 1,
        'Two': 2,
        'Three': 3,
        'Four': 4,
        'Five': 5,
    }

    def process_item(self, item, spider):
        rating = item.get('review_rating')
        if rating:
            item['review_rating'] = self.review_rating_map[rating]
        return item

别忘了配置!settings.py文件中启用BookPipeline

ITEM_PIPELINES = {
   'books_to_scrape.pipelines.BookPipeline': 300,
}

重新运行起来~~~没毛病了~

(答案见下载资源) 上机任务1 用chrome打开dom.sample2.html页面, 在chrome的控制台中输入jQuery代码并执行,完成以下选择动作: (1)查找id号为tigerLily的元素 (2)查找拥有类myList的元素 (3)查找所有的input元素 (4)查找所有img元素和tr元素 (5)查找id号为coffeePot和id号为someDiv的元素 (6)选择具有id属性的所有元素 (7)选择具有id属性的input元素 (8)选择其value属性等于A的元素 (9)选择其value属性等于A或等于C的元素 (10)选择其title属性值中含有dog的img元素 (11)选择其href属性值以http开头的a元素 (12)选择div元素内嵌套的span元素 上机任务2 用chrome打开dom.sample2.html页面, 在chrome的控制台中输入jQuery代码并执行,完成以下选择动作: (13)选择元素li,该元素作为拥有myList类的ul元素的直接子元素 (14)选择id号为radioA的input元素后面的第一个input兄弟元素 (15)选择id号为radioA的input元素后面的所有input兄弟元素 (16)选择dom sample页面中第3个tr元素 (17)选择其type属性值checkbox且索引为偶数的input元素 (18)选择非最后一行的tr元素 (19)选择所有的checkbox元素 (20)选择所有被选中的表单元素 (21)选择含有1972的td元素 (22)选择包含有sapn元素的div元素 (23)选择表格中每行的第一个单元格和最后一个单元格 (24)选择表格中第3行,标题行不算(要求用nth-child()过滤器) 上机任务3 用chrome打开dom.sample2.html页面,该页面中内嵌有几个CSS类:.red .green .blue .yellow .thickBorder .seeThrough 在chrome的控制台中输入jQuery代码并执行,完成以下选择动作: (1)将拥有alt属性的倒数第二个图片元素应用yellow类 (2)将第一个checkbox表单元素应用.green样式 (3)求id值为checkbox3的元素在所有表单元素里的顺序号 (4)用一条链式语句完成:先对所有img元素应用seeThrough样式,再为所有img元素和tr元素应用yellow样式 (5)用filter方法实现:选择单元格内容为Java或Smalltalk的单元格 (6)取图片集中的第2,3,4张图片 (7)用has方法实现:选择那些包含有ul元素的li元素 (8)将tbody每个单元格里的文字设为:我爱jQuery (9)查找form元素的后代元素中标签为label的元素 (10)查找表单元素中是否有id值为checkbox5的元素 提示: 为某dom元素应用某css样式可以使用jQuery中的addClass方法,例如:将id为tt的div元素应用.bt样式,可用些语句:$("#tt").addClass("color","red");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值