使用Item类解决的问题:
1.字段名拼写容易出错且无法检测到这些错误
2.返回的数据类型无法确保一致性
3.不便于将数据传递给其他的组件
本文基于系列四代码的基础上修改
1.定义Item
生成scrapy项目的时候会自动生成items.py文件,在类里定义好数据结构
2.定义Field
(1)导入模块
在实现爬虫的模块里导入Items模块
(2)将爬取的数据保存到item中
完整代码
from scrapy import Request
from scrapy.spiders import Spider
from qidian_hot.items import QidianHotItem
class HotSalesSpider(Spider):
# 爬虫名称
name = "hot"
#当前页数
current_page = 1
#设置用户代理为浏览器类型
qidian_headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36"}
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:
#获取小说名称
name = one_selector.xpath("h4/a/text()").extract()[0]
#获取作者,第一个p标签的第一个a标签的内容
author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]
#获取类型
type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]
#获取形式
form = one_selector.xpath("p[1]/span/text()").extract()[0]
#把爬取的数据保存到item中
item = QidianHotItem()
item["name"] = name
item["author"] = author
item["type"] = type
item["form"] = form
yield 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)