scrapy-redis组件本质上提供了三大功能:
- scheduler - 调度器
- dupefilter - URL去重规则(被调度器使用)
- pipeline - 数据持久化
爬取顶点小说网具体步骤:
1、创建工程 scrapy startproject dingdian
2、进入这个dingdian目录 cd dingdian
3、创建crawlspider爬虫文件 scrapy genspider -t crawl xs xxx.com
4、生成文件如下:
5、 items.py文件
6、xs.py爬虫文件
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
# 导入爬虫包
from scrapy_redis.spiders import RedisCrawlSpider
from ..items import DingdianItem
# 当继承RedisCrawlSpider时,需在Redis客户端指定起始URL。
class XsSpider(RedisCrawlSpider):
name = 'xs'
# allowed_domains = ['xxx.com']
redis_key = 'dingdianxs'
rules = (
# 必须写这个起始url start_urls = ['https://www.23wx.cc/']
# 分析当前页面实现分页
# https://www.23wx.cc/class/1_1.html
# https://www.23wx.cc/class/2_1.html
# https://www.23wx.cc/class/3_1.html
# Rule(LinkExtractor(allow=r'/class/\d+_\d+.html'), follow=True),
# 正则表达式规则: follow=False不分页
# https: // www.23wx.cc / du / 180 / 180337 /
# 必须写这个起始url start_urls = ['https://www.23wx.cc/du/4/184118/']
Rule(LinkExtractor(allow=r'du/\d'), callback='parse_item',follow=False),
)
def parse_item(self, response):
item = {}
#item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
#item['name'] = response.xpath('//div[@id="name"]').get()
#item['description'] = response.xpath('//div[@id="description"]').get()
#保存对象
item=DingdianItem()
#响应的请求路径
url = response.url
#判断不是以html结尾的,就保存数据:https://www.23wx.cc/du/4/184118/50823152.html
if not url.endswith(".html"):
# 获取数据
item['name'] = response.xpath('//*[@id="info"]/h1/text()').get()
item['author'] = response.xpath('//*[@id="info"]/p[1]/text()').get()
item['chapter'] = response.xpath('//*[@id="info"]/p[3]/text()').get()
item['last_time'] = response.xpath('//*[@id="info"]/p[4]/text()').get()
#这个是找到小说下面章节所对应的超链接路径,那么就必须返回完整的路径
# 这个https://www.23wx.cc/du/4/184118/50617294.html
# item['url'] = response.xpath('//*[@id="list"]/dl/dd[*]/a/@href').getall()
#使用是请求的路径url
item['url'] = url
# print("url=>>>",response.url)
# print('name===>>>',item['name'])
# print('author===>>>',item['author'])
# print('chapter===>>>',item['chapter'])
# print('last_time===>>>',item['last_time'])
else: #获取小说章节和内容
content=''
# 使用是请求的路径url
item['url'] =url
item['title']=response.xpath('//div[@class="bookname"]/h1/text()').get()
content_list=response.xpath('//*[@id="content"]/text()').getall()
# print(content_list)
#循环列表
for ct in content_list:
content+=ct
# 保存数据
item['content']=content
# print(item['content'])
print('item===>>>',item)
return item
7、settings.py设置文件
# 使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis里的调度器组件,不使用默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True
# 默认的scrapy-redis请求队列形式(按优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
# 只是将数据放到redis数据库,不需要写pipelines文件
ITEM_PIPELINES = {
# 'Sina.pipelines.SinaPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
# LOG_LEVEL = 'DEBUG'
# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 3
8、启动redis服务,再启动爬虫 scrapy crawl sx
9、打开redis客户端
10、控制台打印数据
文章的内容和标题
11、在redis下显示数据