【Scrapy】全栈爬取笔趣阁小说

前两天介绍完了scrapy基础操作之后,今天我们来实践操一下

全栈爬取笔趣阁小说,我们要先分析其主要URL地址,可分为以下三大类:

  • 所有小说url地址总表
  • 小说章节总表
  • 小说章节内

根据分析,就需要写三个函数来对页面内容进行提取和处理


spider代码

# -*- coding: utf-8 -*-
import scrapy
from biquge.items import BiqugeItem
import os
class SpiderSpider(scrapy.Spider):
    name = 'spider'
    allowed_domains = ['www.xbiquge.la']
    start_urls = ['http://www.xbiquge.la/xiaoshuodaquan/']
    def parse(self, response):
        #全部小说列表
        name=response.xpath("//div[@class='novellist']/ul/li/a/text()").extract()
        url=response.xpath("//div[@class='novellist']/ul/li/a/@href").extract()
        for i in range(len(name)):
            item=BiqugeItem()
            item['name']=name[i]
            item['url']=url[i]
            if (not os.path.exists(name[i])):
                os.makedirs(name[i])
            yield scrapy.Request(url=item['url'],meta={'meta1':item},callback=self.url_parse)
    def url_parse(self,response):
        #小说章节列表
        meta1=response.meta['meta1']
        lists=response.xpath("//div[@id ='list']/dl//dd/a/@href").extract()
        for i in range(len(lists)):
            item=BiqugeItem()
            item['title_url']="http://www.xbiquge.la"+lists[i]
            item['name'] = meta1['name']
            item['url'] = meta1['url']
            yield scrapy.Request(url=item['title_url'],meta={'meta2':item},callback=self.detail_parse)
    def detail_parse(self,response):
        #章节详细内容
        meta2=response.meta['meta2']
        item = BiqugeItem()
        item['title']=response.xpath("//div[@class='bookname']/h1/text()").extract()[0]
        novel=response.xpath("//div[@id='content']/text()").extract()

        item['novel']= "\n".join(novel).replace("&nbsp", " ")
        item['name']=meta2['name']
        yield item

items代码
class BiqugeItem(scrapy.Item):
    name=scrapy.Field()#小说名字
    url=scrapy.Field()#小说章节目录
    title_url=scrapy.Field()#小说章节地址
    novel=scrapy.Field()#小说章节内容
    title=scrapy.Field()#小说章节标题

pipelines代码
class BiqugePipeline(object):
    def process_item(self, item, spider):
        #同一个小说按章节名字保存txt文件
        fp = open(item['name']+'/'+item['title']+".txt", "a",encoding='utf8')
        fp.write(item['title'])
        fp.write('\n')
        novel=item['novel'].encode('GBK','ignore').decode('GBk')#转码,否则报错
        fp.write(novel)
        fp.write('\n')
        fp.close()
        return item

为什么不将小说保存进一个TXT文件里而是按照章节名字保存?
因为scrapy是异步,异步处理请求,也就是说Scrapy发送请求之后,不会等待这个请求的响应(也就是不会阻塞),而是可以同时发送其他请求或者做别的事情。而我们知道服务器对于请求的响应是由很多方面的因素影响的。但后面将会有对代码的改进将一部小说保存进一个TXT文件中

  • 效果展示
    在这里插入图片描述
    在这里插入图片描述
    当然这只是一个很简陋的代码,更多的细节需要不断去完善。
    没有一蹴而就的成功,只有不断努力的拼搏
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值