使用输出处理器和输入处理器目的:
将XPath或者CSS选择器提取出来的数据做进一步的处理,如字符串转换,去空格,提取数字,格式化等操作。
本文基于系列六代码的基础上修改
1.定义输入函数
在items.py文件定义字符串处理函数
我这里做了个简单的字符串转换的输入函数
2.给字段绑定输出处理器或者输入处理器函数
处理器函数可以绑定在输出或者输入函数,这个根据自己实际的业务需求绑定,没有强制要求
TakeFirst函数:是内置处理器返回第一个非空值,通常用作输出处理器,更多其他内置函数,这里不列举
form_convert函数:上面自定义的函数
完整代码——爬虫主程序代码
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/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:
#参数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)
完整代码——items.py代码
import scrapy
from scrapy.loader.processors import TakeFirst
def form_convert(value):
if value[0] == "连载":
return "LZ"
else:
return "WJ"
class QidianHotItem(scrapy.Item):
name = scrapy.Field(output_processor=TakeFirst())
author = scrapy.Field(output_processor=TakeFirst())
type = scrapy.Field(output_processor=TakeFirst())
form = scrapy.Field(input_processor=form_convert, output_processor=TakeFirst())