import scrapy
from scrapy_rabbitmq import RabbitMQModule
from scrapy.selector import Selector
from scrapy.http import Request
class NovelSpider(scrapy.Spider):
name = 'novel_spider'
allowed_domains = ['example.com']
start_urls = ['http://example.com/novels']
def parse(self, response):
# 提取小说列表页的章节链接
novel_urls = Selector(response).xpath('//a[@class="novel_url"]/@href').getall()
for url in novel_urls:
yield Request(url=response.urljoin(url), callback=self.parse_novel)
def parse_novel(self, response):
# 提取小说详情页的章节列表链接
chapter_urls = Selector(response).xpath('//a[@class="chapter_url"]/@href').getall()
for url in chapter_urls:
yield Request(url=response.urljoin(url), callback=self.parse_chapter)
def parse_chapter(self, response):
# 提取章节详情内容
content = Selector(response).xpath('//div[@class="chapter_content"]/text()').get()
# 使用RabbitMQModule发送内容
RabbitMQModule.send_message('novel_queue', content, self.settings)
# 返回章节信息用于日志记录
return {'chapter_name': Selector(response).xpath('//h1[@class="chapter_name"]/text()').get(),
'novel_name': Selector(response).xpath('//div[@class="novel_name"]/text()').get(),
'content_length': len(content)}
这个代码示例展示了如何使用Scrapy爬取小说网站的章节列表,然后逐个爬取每个章节的详细内容,并使用RabbitMQModule将内容推送到消息队列。在每个章节爬取完成后,返回一个包含章节名称、小说名称和内容长度的字典,用于日志记录。这个例子简化了原始代码,去除了对ack的处理,并假设RabbitMQModule
是一个实现了消息队列操作的模块。