博文配套视频课程:24小时实现从零到AI人工智能
创建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))