创建Item模型层

前面我们已经可以把第一页的数据获取,但是仅仅是在控制台打印。在Scrapy还有一个Item的模块,此类就是模型层,主要完成对价值数据的封装,然后在写入到数据库中

import scrapy
# 此类就是模型层,主要完成对价值数据的封装,然后在写入到数据库中
class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    em = title = img = comment = scrapy.Field()

封装已爬取数据

把爬取的数据存储到DoubanItem对象中,然后把它在交给item_list 最后返回Item_list

import scrapy
from lxml import etree
from douban.items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider'
    # 允许下载的域名
    allowed_domains = ['movie.douban.com']
    # 配置下载的首地址
    start_urls = ['http://movie.douban.com/top250']
    # 下载完毕之后的解析方法 (parse在源码中支持yield)
    def parse(self, response):
        # print(response.text)
        html = etree.HTML(response.text)
        # 首先通过xpath获取ol
        li_list = html.xpath("//ol[@class='grid_view']/li")
        item_list = []
        for li in li_list:
            item = DoubanItem()
            # em = title = img = comment
            item['em'] = li.xpath(".//em/text()")[0]
            item['title'] = li.xpath(".//span[@class='title']/text()")[0]
            item['img'] = li.xpath(".//img/@src")[0]
            item['comment'] = li.xpath(".//div[@class='star']/span/text()")[-1]
            item_list.append(item)
        return item_list

yield的语法介绍

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值

def fn():
    for i in range(3):
        return i  # return 则说明此次调用结束
#
print(type(fn))
print(fn())
print(fn())

def fn():
    for i in range(3):
        yield i  # yield 返回的是一个迭代器,next()方法来执行
    yield 'hehe'

print(type(fn))
g = fn()
# 直接返回yield后面的值
print(next(g))
# 下一次next会继续执行yield后面的语句
print(next(g))
print(next(g))
print(next(g))