爬虫--Scrapy进阶(scrapy.Request的使用)

如果分页中有固定的分页规则,则上篇文章中讲过,如果url不规则,则需要处理

准备

url:https://www.biquge5200.cc/xuanhuanxiaoshuo/
根据每个小说的名字作为文件名,保存为txt

新建爬虫项目

scrapy startproject biquge
cd biquge
scrapy genspider Mybiquge biquge5200.cc

创建调试文件

主项目下新建start.py文件
import scrapy.cmdline
scrapy.cmdline.execute('scrapy crawl mybiquge --nolog'.split())

修改配置(配置管道,爬取间隔时间)

BOT_NAME = 'biquge'

SPIDER_MODULES = ['biquge.spiders']
NEWSPIDER_MODULE = 'biquge.spiders'

DOWNLOAD_DELAY = 0.5     #配置爬取时间间隔

ITEM_PIPELINES = {
    'biquge.pipelines.BiqugePipeline': 300,
}

items.py中

import scrapy

class BiqugeItem(scrapy.Item):
    name = scrapy.Field()                #小说名
    zj_name = scrapy.Field()			 #每章的小说章节名
    zj_content = scrapy.Field()			 #每章的内容

爬虫文件中(mybiquge.py)

import scrapy
from biquge.items import BiqugeItem


class MybiqugeSpider(scrapy.Spider):
    name = 'mybiquge'
    allowed_domains = ['biquge5200.cc']
    start_urls = ['https://www.biquge5200.cc/xuanhuanxiaoshuo/']

    # 处理首页数据
    def parse(self, response):
        print("*" * 100)
        # print(response.text)
        print("*" * 100)

        xs_list = response.xpath('//div[@class="l"]/ul/li')
        for xs in xs_list:
            name = xs.xpath('./span[@class="s2"]/a/text()').get()
            href = xs.xpath('./span[@class="s2"]/a/@href').get()
            # print(name, href)

            # scrapy.Request: 发送请求
            # 继续爬取小说的详情(包含所有章节)
            yield scrapy.Request(
                url=href,
                callback=self.parse_detail,
                # meta: 可以将数据传入到parse_detail函数中
                meta={'name': name}
            )
            # yield后面可以返回2种东西:
            #  1. 返回item => 将item传入到pipeline
            #  2. 返回Request => 将Request继续交给Scrapy引擎自动爬取并通过回调函数返回结果

    # 处理小说详情(包含所有章节)
    def parse_detail(self, response):
        # 小说名字
        name = response.meta['name']

        # 所有章节
        zj_list = response.xpath('//div[@id="list"]/dl/dd')
        for zj in zj_list:
            zj_name = zj.xpath('./a/text()').get()  # 章节名字
            zj_href = zj.xpath('./a/@href').get()  # 章节链接

            # 继续爬取每个章节的文字内容
            yield scrapy.Request(
                url=zj_href,
                callback=self.parse_content,
                meta={'name': name, 'zj_name': zj_name}
            )

    # 处理章节内容
    def parse_content(self, response):

        name = response.meta['name']  # 小说名字
        zj_name = response.meta['zj_name']  # 章节名字

        # 内容
        # get(): 获取列表的第一个,类似extract_first
        # getall(): 获取列表的所有,类似extract
        zj_content = response.xpath('//div[@id="content"]/p/text()').getall()
        zj_content = '\n'.join(zj_content)
        # print(zj_content)

        # 将小说的每个章节的内容传入到管道
        item = BiqugeItem()
        item['name'] = name
        item['zj_name'] = zj_name
        item['zj_content'] = zj_content
        yield item

管道中(pipelines.py)

import os
from itemadapter import ItemAdapter


class BiqugePipeline:
    def __init__(self):
        self.path = r'D:\biquge\biquge\biquge_xiaoshuo'


    def process_item(self, item, spider):
        print(item)
        name = item['name']
        zj_name = item['zj_name']
        zj_content = item['zj_content']
        xs_path = os.path.join(self.path,name)
        if not os.path.exists(xs_path):
            os.mkdir(xs_path)

        zj_path = os.path.join(xs_path,f'{zj_name}.txt')
        with open(zj_path,'w',encoding='utf-8') as f:
            f.write(zj_content)
            f.flush()
        print(f'{name},{zj_name} --保存成功!')
        return item
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值