【scray_redis分布式爬取案例】--- 17k小说

注:仅为我个人的案例笔记!!!不做其他引导

1、需求说明_网页分析_前置准备

1.1 需求说明

网址:【男生_小说分类_完结小说分类_免费小说分类-17K小说网

需求:打开首页---->选择:分类---->选择:已完本、只看免费

获取书本的名字、章节名、章节url

这个暂时称呼为榜单页面:

书本介绍页面:

书本页面:

1.2 网页分析

正则匹配语句:r'//www.17k.com/book/\d+.html'

榜单中的书本信息位置:

介绍页书本名及url位置:

书本中的章节信息位置:

小说的具体链接=f'https://www.17k.com{a_tag.attrs["href"]}'

章节链接=f‘https://www.17k.com{href属性}’

1.3 准备一个新爬虫并修改settings.py

>scrapy startproject scrapy_redis1
>scrapy genspider -t crawl XiaoShuo aaa.com

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

2、爬虫项目的编写

2.1 在items.py里面设置要存储的数据

class XSItem(scrapy.Item):
    # 书本名称
    title = scrapy.Field()
    # 章节名称
    chapter = scrapy.Field()
    # 章节链接
    url = scrapy.Field()

2.2 更改XiaoShuo.py模板

修改原生的爬虫模块

  • 1、从scrapy模块里面导入 RedisCrawlSpider类-----用于实现自动化爬取
  • 2、更改XiaoshuoSpider的父类为 RedisCrawlSpide
  • 3、设置redis分配url:原来的start_urls注释掉,在类里面增加一个redis_key的变量名 赋予一个 'XiaoShuo'的值。
  • 4、Rules中为每一页中小说连接的匹配规则
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from scrapy_redis.spiders import RedisCrawlSpider
from bs4 import BeautifulSoup
from ..items import XSItem
import logging

logger = logging.getLogger(__name__)
class XiaoshuoSpider(RedisCrawlSpider):
    name = "XiaoShuo"
    # allowed_domains = ["aaa.com"]
    # start_urls = ["https://www.17k.com/all/book/2_0_0_0_3_0_1_0_2.html"]
    redis_key = 'XiaoShuo'  # 这个就是等下redis数据库中的键名
    rules = (Rule(LinkExtractor(allow=r'//www.17k.com/book/\d+.html'),
                                callback="parse_item",
                                follow=True),)

    def parse_item(self, response):
        pass

2.3 编写parse_item()以及parse_detail()方法

def parse_item(self, response):
        item = XSItem()
        soup = BeautifulSoup(response.text, 'lxml')
        a_tags = soup.select('.Info Sign > a')
        for a_tag in a_tags:
            url = f'https://www.17k.com{a_tag.attrs["href"]}'
            item['title'] = a_tag.text
            return scrapy.Request(url=url,
                                 callback=self.parse_detail,
                                 meta={'item': item})

    def parse_detail(self, response):
        item = response.meta['item']
        soup = BeautifulSoup(response.text, 'lxml')
        a_tags = soup.select('dl[class="Volume"] > dd > a')
        chapters = []  # 章节名
        urls = []  # url
        for a_tag in a_tags:
            url = "https://www.17k.com" + a_tag.attrs["href"]
            urls.append(url)
            chapters.append(a_tag.attrs['title'])
        item['url'] = urls
        item['chapter'] = chapters
        logger.warning(item["title"])
        yield item

2.4 修改配置文件

# 使用scrapy_redis 必备的配置
# 1、使用scrapy_redis 作为调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 2、使用scrapy_redis 的去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 3、开启管道,让 scrapy-redis 与 redis 连接
ITEM_PIPELINES = {
   "scrapy_redis.pipelines.RedisPipeline": 300,
}
# 4、指定连接到 Redis 需要的ip和端口号
REDIS_HOST = "127.0.0.1"
REDIS_PORT = "6379"
# 是否暂停之后继续爬取(可选)
SCHEDULER_PERSIST = False

3、创建第二个相同的项目

注:因为我们只有一台电脑,所以在这个地方使用两个项目来模拟两台电脑。当然直接用一个项目来爬取也是没有关系的。

>scrapy startproject scrapy_redis2
>cd scrapy_redis2
>scrapy genspider -t crawl XiaoShuo aaa.com
1、修改setting文件, 与第一个项目做相同的更改
UA、robots协议、使用scrapy_redis 必备的配置
(不要直接全部复制,改该改的地方。)

2、item文件,增加一个与第一个项目一样的item类即可

3、爬虫文件,一样的编写

4、创建启动文件

两个项目都需要创建启动文件并开启

from scrapy import cmdline
cmdline.execute('scrapy crawl XiaoShuo -o xs.json'.split())

有这个说明已经成功链接到数据库:

启动数据库调度爬虫项目:

语法:lpush 键名 目标网址

键名:(与设置在爬虫文件的redis_key一致)

目标网址:以每一页为单位进行,是每一页的url

爬取日志展示:

存储结果展示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值