使用ItemLoader填充容器目的:
当项目很大,提取的字段数以百计时,数据的提取规则也会越来越多,然后对提取到的数据做转换处理,代码会变得非常冗余。
使用ItemLoader填充容器可以配置Item中各个字段的提取规则,并通过函数分析元素数据,最后对Item字段赋值。
本文基于系列五代码的基础上修改
1.导入ItemLoader类
在实现爬虫的模块里导入ItemLoader类
2.将数据封装并返回
(1)生成Item实例
参数解析
item:items模块对应的Item类
selector:接收的单个选择器
(2)给item类的字段赋值并返回
图2为Item类的字段
ItemLoader提供三种方法将数据填充,这里使用了add_xpath和addcss,还有一种add_value,该方法是直接传值
如:add_value("form", "value"),此时Item的form字段的值为"value"
图2↓.
完整代码
from scrapy import Request
from scrapy.spiders import Spider
from qidian_hot.items import QidianHotItem
from scrapy.loader import ItemLoader
class HotSalesSpider(Spider):
# 爬虫名称
name = "hot"
#当前页数
current_page = 1
#设置用户代理为浏览器类型
qidian_headers = {"User-Agent" : "Mozilla*****************************************************************"}
def start_requests(self):
url = "https://www.qidian.com/rank/hotsales?style=1&page=1"
yield Request(url, headers=self.qidian_headers, callback=self.qidian_parse)
#数据解析,此时response对象已经有网页的html数据
def qidian_parse(self, response):
#使用xpath定位到小说内容的div元素
list_selector = response.xpath("//div[@class='book-mid-info']")
#读取每部小说的元素
for one_selector in list_selector:
#参数item接收QidianHotItem实例,selector接收一个选择器
novel = ItemLoader(item=QidianHotItem(), selector=one_selector)
#获取小说名称
novel.add_xpath("name", "h4/a/text()")
#获取作者,第一个p标签的第一个a标签的内容
novel.add_xpath("author", "p[1]/a[1]/text()")
#获取类型
novel.add_xpath("type", "p[1]/a[2]/text()")
#获取形式
novel.add_css("form", ".author span::text")
#将提取好的数据load处理,并返回。load_item方法给Item对象赋值
yield novel.load_item()
#多页数据爬取,原理:执行完一次爬取,当前页数加1,然后通过回调函数重新执行qidian_parse方法
self.current_page+=1
if(self.current_page <= 25):
next_url = "https://www.qidian.com/rank/hotsales?style=1&page=%d"%(self.current_page)
yield Request(next_url, headers=self.qidian_headers, callback=self.qidian_parse)